Ответ 1
Вы говорите "отличное от того, что мы думаем", как будто все думают одинаково:)
Я бы предположил, что вы приходите с младших микроконтроллеров, у которых часто есть отдельные пространства программ и данных. В ARM ситуация другая: программный код, данные и периферийные регистры все находятся в одном и том же плоском 32-битном пространстве памяти. Говорят, что они используют так называемую "модифицированную Гарвардскую" архитектуру: шины данных и команд являются отдельными * (Гарвард), но они используют одно пространство памяти (фон Нейман). Таким образом, вы можете читать данные из ПЗУ и выполнять программы из ОЗУ без какой-либо специальной настройки.
Например, здесь карта памяти LPC1768, обычного микроконтроллера Cortex-M3 от NXP.
Обратите внимание, что на больших 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 имеют одну шину данных/команд.