@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 можете ловить и по другим причинам. Смотрите содержимое стека после срабатывания "ловушки" и что выше. Это не просто, но другие пути либо полагаются на опыт, либо ещё более трудоёмкие.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы