Подтвердить что ты не робот

ROM и RAM в ARM

Я работаю над процессором ARM, я задавался вопросом, отличаются ли ROM и RAM от того, что я предполагаю. Например, для программы, имеющей следующую таблицу памяти:

Program Size: 
Code=1264 
RO-data=16 
RW-data=0 
ZI-data=1384

Как это распределяется между ПЗУ и ОЗУ?

4b9b3361

Ответ 1

Вы говорите "отличное от того, что мы думаем", как будто все думают одинаково:)

Я бы предположил, что вы приходите с младших микроконтроллеров, у которых часто есть отдельные пространства программ и данных. В ARM ситуация другая: программный код, данные и периферийные регистры все находятся в одном и том же плоском 32-битном пространстве памяти. Говорят, что они используют так называемую "модифицированную Гарвардскую" архитектуру: шины данных и команд являются отдельными * (Гарвард), но они используют одно пространство памяти (фон Нейман). Таким образом, вы можете читать данные из ПЗУ и выполнять программы из ОЗУ без какой-либо специальной настройки.

Например, здесь карта памяти LPC1768, обычного микроконтроллера Cortex-M3 от NXP.

LPC1768

Обратите внимание, что на больших ARM карта может быть намного сложнее, например. обычно имеется несколько зон CS (выбор микросхемы) для внешней вспышки /SRAM/SDRAM или других периферийных устройств, которые могут быть или не быть подключены для каждого конкретного устройства с использованием процессора. Тем не менее, все они все еще доступны через ту же 32-битную плоскую память.

Теперь о строке, которую вы цитируете. По предположению, он был подготовлен компилятором Keil или ARM RVCT. Аббревиатуры означают следующее: RO = только для чтения, RW = чтение-запись, ZI = инициализация нуля.

При компиляции автономной прошивки для микроконтроллера (в отличие от программы пользовательского режима, которая должна выполняться в ОС), в конце вы обычно получаете одно монолитное изображение, которое будет мигать во флэш-памяти и выполняется в -место. Это нормально для кода, который обычно не изменяется, или только для чтения (const), но не так хорош для записываемых данных. Это место, в которое входят регионы RW и ZI. Компилятор вставляет небольшой код начальной загрузки, который берет кусок с начальными значениями инициализированных данных из образа ROM и копирует их в ОЗУ (это область RW). Затем он обнуляет оставшуюся часть используемой ОЗУ (область ZI). Затем управление передается на фактический код, написанный программистом.

Здесь я попытался проиллюстрировать, как выглядит типичная программа для вышеупомянутого LPC1768:

+-----------+ 0x1000 8000 \
|  Unused   |             |
+-----------+             |
|  ZI data  | <--(clear)  | RAM
+-----------+             |
|  RW data  | <--(copy)---|---+
+-----------+ 0x1000 0000 /   |
                              |
                              |
+-----------+ 0x0008 0000 \   |
|  Unused   |             |   |
+-----------+             |   |
|  RW init  |-------------|---+
+-----------+             |
|  RO data  |             | ROM (Flash)
+-----------+             |
| User code |             |
+-----------+             |
| Boot code |             |
+-----------+             |
|  Vectors  |             |
+-----------+ 0x0000 0000 /

Таким образом, для вычисления используемого пространства ROM (flash) вам необходимо добавить код, данные RO и RW-данные. Используемая ОЗУ будет представлять собой сумму RW-данных и ZI-данных. Итак, для вашего случая это 1264 + 16 + 0 = 1280 байт flash и 0 + 1384 = 1384 байт ОЗУ.

*: не всегда верно: я думаю, что чипы Cortex-M0 имеют одну шину данных/команд.

Ответ 2

Игорь Скочинский дал вам хорошее объяснение (на мой взгляд). Я дам вам основываясь на том, что я могу узнать с помощью инструментов сборки KEIL для LPC23xx.

Если у вас есть возможность сгенерировать файл карты после компиляции (в keil IDE это простой флажок в настройке сборки), откройте файл, и в конце вы увидите следующие строки:

Total RO Size (Code+Ro data)                36732 (35.87kB)
Total RW Size (RW Data + ZI Data)           27348 (26.71kB
Total ROM Size (Code + RO Data + RW Data)   36812 (35.95kB

Я думаю, что это самоочевидно, данные RO находятся в ПЗУ и RW в ОЗУ.

Ответ 3

Как он распределяется между ПЗУ и ОЗУ, зависит от вас, вам нужно сообщить компоновщику, куда положить вещи. В идеале вам нужен код, который доступен только для чтения, чтобы быть в ром, для этого не нужен горящий барабан. Точно так же только данные могут поступать в ром. read write и zero init необходимо использовать в ram.

Какую инструментальную цепочку (на основе gcc, IAR, Keil, ARM и т.д.) вы используете?

Ответ 4

В идеале вам нужен код, который доступен только для чтения, чтобы быть в rom

Кроме того, вы хотите, чтобы ваше хранилище кода было нестабильным!