Оперативная память, куча и память стека для платы STM32

Я работаю над проектом, для которого требуется не менее 500 кб памяти. У меня есть SDK с этим кодом, определяющим стек и кучу, и он отлично работает.

Stack_Size      EQU     0x00004000

            AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp


; <h> Heap Configuration
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>

Heap_Size       EQU     0x00200000

            AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limit

однако я пытаюсь интегрировать функцию камеры и ЖК-экрана в этот SDK, и когда я это делаю, самые высокие значения стека и кучи, которые, по крайней мере, вызовут ЖК-экран, показаны ниже. Любые значения выше этого, и ЖК-экран остается черным, и приложение не отображается бежать.

Stack_Size      EQU     0x00004000

            AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp


; <h> Heap Configuration
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>

Heap_Size       EQU     0x00002B50

            AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limit

мне нужны размеры стека и кучи во втором примере кода, чтобы соответствовать размерам в первом примере кода, чтобы я не застрял в цикле исключений жестких ошибок из-за отсутствия доступной памяти. Почему увеличение размера кучи делает мой проект хуже? То есть, почему он даже не запускается, когда я увеличиваю размер кучи?

Я приложил скриншот моих параметров проекта, чтобы вы могли видеть конфигурацию ОЗУ.

Screenshot

Ниже приведен объем памяти, который у меня есть. Разве это не означает, что у меня есть 2 MB ОЗУ?

8 M x 32-бит SDRAM подключен к SDRAM Bank1 STM32F439NIH6 FMC взаимодействие.

1 Mbit x 16 SRAM подключен к bank1 NOR/ PSRAM2 интерфейса FMC и обоих 8-разрядных и 16-битный доступ разрешен BLN0 & BLN1, подключенным к BLE & BHE SRAM соответственно.

2 ответов


ваш микроконтроллер STM32F4 физически не имеет 0x200000 (2 МБ) ОЗУ, начинающегося с адреса 0x20000000. Я считаю, что он имеет только 0x30000 (192 кб). Проверьте раздел карты памяти таблицы данных.

Если вы скажете компоновщику, что существует несуществующая память, тогда компоновщик может попытаться использовать эту память, а затем ваша программа аварийно завершит работу. Я подозреваю, что для вашей оригинальной программы компоновщик никогда не использовал несуществующую память, поэтому программа работала успешно. Но в ваша последующая программа компоновщик пытается использовать несуществующую память, и программа сбой. Посмотрите на файл карты, созданный компоновщиком, чтобы увидеть, как различные части вашей программы были назначены в память компоновщиком. Вероятно, вы обнаружите, что первая программа не использует память за пределами 0x20030000, но вторая программа делает это.

Если вам действительно нужно 500 кб памяти или больше, то вам придется добавить внешнее устройство памяти к вашей плате, потому что микроконтроллер не имеет столько ОЗУ.

Update: если ваша плата имеет память, подключенную к FMC (гибкий контроллер памяти), то это внешняя или внекиповая память. Однако внешняя память не адресована в 0x20000000. Он должен быть расположен где-то в диапазоне от 0x60000000 до 0xDFFFFFFF (см. раздел карты памяти таблицы данных). Ваша программа должна будет настроить FMC соответствующим образом перед доступом к внешней памяти. И тебе, наверное, стоит рассказать компоновщик, что внешняя память существует, включив один (или несколько) из этих разделов памяти вне чипа в этом диалоговом окне параметров. Вероятно, вы можете получить подробную информацию и советы о том, как включить память вне чипа от дизайнера платы.


Если вы скажете компоновщику, что у вас есть 2MB на чипе ROM и 2Mb + 64Kb на чипе RAM, он поверит вам и с радостью найдет код и данные соответственно, но не ожидайте ничего полезного, когда вы получите доступ к памяти, которая не существует!

Если вы правильно настроили области памяти, компоновщик завершится ошибкой при превышении емкости целевого объекта. Это физический предел, решение не должно лгать компоновщику - это просто генерирует ошибку времени выполнения, а не сборку ошибка.