Сравнение размера кода Cortex M3: IAR ARM против Keil µVision - PullRequest
1 голос
/ 03 августа 2020

В настоящее время я разрабатываю небольшой проект для микроконтроллера STM32F103 с процессором Cortex-M3. Благодаря стандартным файлам заголовков CMSIS можно использовать один и тот же код с IAR и Keil µVision. Из-за этого мне было интересно сравнить оба компилятора относительно размера кода (который наиболее важен для небольших микроконтроллеров).

Оба компилятора были установлены на макс. уровень оптимизации (по размеру). К сожалению, я не совсем уверен, как IAR и Keil измеряют размер кода.

Например, IAR дает мне такой результат:

    868 bytes of readonly  code memory 
     28 bytes of readonly  data memory 
  2'056 bytes of readwrite data memory 

и Keil это:

Program Size: Code=676 RO-data=252 RW-data=0 ZI-data=1640

На первый взгляд я не могу определить, какое количество байтов относится к используемому размеру fla sh, а какое - к используемой SRAM.

Конечно, я знаю, что fla sh только для чтения и эта SRAM предназначена для чтения-записи, но есть code memory и data memory на стороне IAR, и ZI-data и Code на стороне Кейла.

Любой, кто имеет более глубокие знания об этом ?

1 Ответ

0 голосов
/ 10 августа 2020

Попробуем разбить это систематически 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-данные)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...