Доброго времени суток.
Сам вопрос возник по причине того, что моя программа для микроконтроллера stm32f429ZITx вылетает в HardFault_Handler просто при добавлении нескольких дополнительных переменных, при этом не со старта, а течении работы, при вызове функций emwin и freeRTOS.
С памятью дело обстоит так:
Стандартная RAM память микроконтроллера(адрес 0x20000000)
CCMRAM память микроконтроллера(адрес 0x10000000)
И SDRAM, подключенная через FMC и находящаяся в едином адресном пространстве с остальной памятью, которую я использую для управления дисплеем через LTDC. Но SDRAM значительно больше, чем необходимо дисплею.(0xD0000000)
За границы основной памяти я вышел давно и прописал линкеру использовать CCMRAM.
Прописывал в scatter файле keil 5 вот так
Настройка scatter файла
LR_IROM1 0x08000000 0x00200000 { ; load region size_region
ER_IROM1 0x08000000 0x00200000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20000000 0x00030000 { ; RW data
.ANY (+RW +ZI)
}
RW_IRAM2 0x10000000 0x00010000 {
.ANY (+RW +ZI)
}
}
Думаю, что проблема возникает на стыке использования основной RAM и CCMRAM.
Например куча/стек начинается в RAM памяти и заканчивается в CCMRAM и если код инкриментирует указатель(скажем emWin или freeRTOS), то указатель может попасть в область, выходящую за границы ram памяти.(хотя, если память распределяется в подряд, такими функциями как malloc, то такое может произойти в лёгкую.)
Подскажите, как правильно настраивать память в таких ситуациях?
P.S. Я подозреваю, что надо будет будет вручную прописывать, где какие переменные располагать и ограничить стек какой-нибудь одной памятью.