@lacredin
Программист

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

Доброго времени суток.

Сам вопрос возник по причине того, что моя программа для микроконтроллера 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. Я подозреваю, что надо будет будет вручную прописывать, где какие переменные располагать и ограничить стек какой-нибудь одной памятью.
  • Вопрос задан
  • 612 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Hoksmur
С кейлом не знаком, но попробую помочь.
*) Стек точно не стоит в одной памяти делать. Особенно, если это разные типы памяти. Чтобы сказать точно, нужно вдумчиво читать описания на МК.
*) Разделите по сегментам код/данные через атрибуты. Для gcc посмотрите примеры как делается, думаю - тут нечто близкое будет.
*) HardFault можете ловить и по другим причинам. Смотрите содержимое стека после срабатывания "ловушки" и что выше. Это не просто, но другие пути либо полагаются на опыт, либо ещё более трудоёмкие.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы