Попробуем разбить это систематически c способом. С точки зрения программистов, мы хотим различать Код (Инструкции) и Данные .
Код обычно хранится в каком-то виде энергонезависимая память (ROM, FLA SH, et c.), которая читается и выполняется ядром процессора во время выполнения. Современные MCU обычно читают свои инструкции из FLA SH, но также могут выполнять код из RAM. Это в основном полезно для более быстрого выполнения кода (поскольку FLA SH довольно медленный для доступа) или для реализации некоторых функций обновления, которые могут обновлять всю FLA SH память. Запуск кода из ОЗУ также может быть использован для создания самомодифицируемого программного обеспечения, но это довольно экзотический c вариант использования.
Когда мы говорим о данных , мы обычно сначала думаем о переменных , которые изменяются во время выполнения (чтение-запись) и, следовательно, должны храниться в оперативной памяти (RAM), которая обычно является энергозависимой (значения теряются при отключении питания). Но есть и другие типы, о которых следует помнить:
- Константы : значения данных, которые не изменяются во время выполнения, например, адрес периферийного регистра или жестко заданная задержка. время. Эти значения необходимо поместить в энергонезависимую память, которая может быть доступна только для чтения (например, FLA SH).
- Инициализированные переменные : большинство переменных программы должны иметь определенное начальное значение (например, начальное значение переменной al oop count). Это начальное значение на самом деле не что иное, как постоянное значение данных (см. Выше), которое автоматически копируется в связанную с ним переменную в начале своего жизненного цикла. Поскольку типичная программа требует довольно много этих значений инициализации, современные компиляторы реализуют различные методы оптимизации, чтобы уменьшить объем памяти, занимаемый этими инициализаторами. Это включает в себя кластеризацию всех переменных, которые инициализированы нулевым значением (нулевую инициализацию), и предоставление различных методов сжатия данных для ненулевых инициализированных переменных.
Имея это в виду, мы можем сделать обоснованное предположение относительно вывода компоновщика IAR и Keil:
+---------------------+-----------------------+-------------------+
| Memory Object | IAR term | Keil term |
+---------------------+-----------------------+-------------------+
| Code in ROM | readonly code memory | Code |
| Code in RAM | readwrite code memory | ? |
| Constants in ROM | readonly data memory | RO-Data |
| Initializers in ROM | readonly data memory | (RW-Data) |
| Variables in RAM | readwrite data memory | RW-Data + ZI-Data |
+---------------------+-----------------------+-------------------+
Расчет использования памяти с IAR довольно прост:
- Использование ПЗУ = (только для чтения кодовая память) + (только для чтения память данных)
- Использование ОЗУ = (чтение-запись памяти кода) + (чтение-запись памяти данных)
Для Keil это немного сложнее:
- Использование ПЗУ = (Код) + (RO-данные) + (RW-данные)
- Использование RAM = (RW-данные) + (ZI-данные)