GrabDuck

Как правильно использовать несколько секторов памяти?

:

Сам вопрос возник по причине того, что моя программа для микроконтроллера stm32f429ZITx вылетает в HardFault_Handler просто при добавлении нескольких дополнительных переменных, при этом не со старта, а течении работы, при вызове функций emwin и freeRTOS.

С памятью дело обстоит так:

Стандартная RAM память микроконтроллера(адрес 0x20000000)

CCMRAM память микроконтроллера(адрес 0x10000000)

И SDRAM, подключенная через FMC и находящаяся в едином адресном пространстве с остальной памятью, которую я использую для управления дисплеем через LTDC. Но SDRAM значительно больше, чем необходимо дисплею.(0xD0000000)

За границы основной памяти я вышел давно и прописал линкеру использовать CCMRAM. Прописывал в scatter файле keil 5 вот так

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. Я подозреваю, что надо будет будет вручную прописывать, где какие переменные располагать и ограничить стек какой-нибудь одной памятью.