Pro оптимизация, небольшой обзор,
взято отсюда.
Провёл некоторый тесты на PIC12F1822 контроллере(конечно не показатель, но всё же).
И на Arduino (этот XC8-AVR).
Вот результаты:
Личный код PIC12F с выключенным xclm2.exe(т.е. без лицензии):
Код: Выделить всё
d:\Programming\_pic\_try_pic12f1822>make
xc8-cc -mcpu=12f1822 -Os main.c
::: advisory: (2051) the current license does not permit the selected optimization level, using optimization level 2
main.c:302:30: warning: implicit conversion changes signedness: 'volatile unsigned char' to 'signed char'
[-Wsign-conversion]
Button.clicks = Button.clickCount;
~ ~~~~~~~^~~~~~~~~~
main.c:310:25: warning: implicit conversion changes signedness: 'int' to 'signed char' [-Wsign-conversion]
Button.clicks = 0 - Button.clickCount;
~ ~~^~~~~~~~~~~~~~~~~~~
2 warnings generated.
Memory Summary:
Program space used 3A0h ( 928) of 800h words ( 45.3%)
Data space used 33h ( 51) of 80h bytes ( 39.8%)
EEPROM space used 0h ( 0) of 100h bytes ( 0.0%)
Configuration bits used 2h ( 2) of 2h words (100.0%)
ID Location space used 0h ( 0) of 4h bytes ( 0.0%)
Removing ...
Done.
d:\Programming\_pic\_try_pic12f1822>
Личный код PIC12F с включенным xclm2.exe(т.е. с лицензией):
Код: Выделить всё
d:\Programming\_pic\_try_pic12f1822>make
xc8-cc -mcpu=12f1822 -Os main.c
main.c:302:30: warning: implicit conversion changes signedness: 'volatile unsigned char' to 'signed char'
[-Wsign-conversion]
Button.clicks = Button.clickCount;
~ ~~~~~~~^~~~~~~~~~
main.c:310:25: warning: implicit conversion changes signedness: 'int' to 'signed char' [-Wsign-conversion]
Button.clicks = 0 - Button.clickCount;
~ ~~^~~~~~~~~~~~~~~~~~~
2 warnings generated.
Memory Summary:
Program space used 39Eh ( 926) of 800h words ( 45.2%)
Data space used 33h ( 51) of 80h bytes ( 39.8%)
EEPROM space used 0h ( 0) of 100h bytes ( 0.0%)
Configuration bits used 2h ( 2) of 2h words (100.0%)
ID Location space used 0h ( 0) of 4h bytes ( 0.0%)
Removing ...
Done.
d:\Programming\_pic\_try_pic12f1822>
В маленькой программе практически нет результата, справедливости ради, необходимо проверять на большом проекте.
Но этот же код в компиляторе SDCC вообще не компилируется т.к. ругается на то, что не помещается в памяти(т.е. оптимизации никакой).
Ладно, проект побольше,
из примеров:
Стандарт
-O2:
Код: Выделить всё
Memory Summary:
Program space used 9DBh ( 2523) of 2000h words ( 30.8%)
Data space used A9h ( 169) of 400h bytes ( 16.5%)
EEPROM space None available
Configuration bits used 5h ( 5) of 5h words (100.0%)
ID Location space used 4h ( 4) of 4h bytes (100.0%)
make[2]: Leaving directory 'C:/Users/Dima/Downloads/pic16f15245-lpc-demo-code-master/pic16f15245-lpc-demo-code.X'
make[1]: Leaving directory 'C:/Users/Dima/Downloads/pic16f15245-lpc-demo-code-master/pic16f15245-lpc-demo-code.X'
BUILD SUCCESSFUL (total time: 12s)
Про фитча
-Os:
Код: Выделить всё
Memory Summary:
Program space used 8B2h ( 2226) of 2000h words ( 27.2%)
Data space used 99h ( 153) of 400h bytes ( 14.9%)
EEPROM space None available
Configuration bits used 5h ( 5) of 5h words (100.0%)
ID Location space used 4h ( 4) of 4h bytes (100.0%)
make[2]: Leaving directory 'C:/Users/Dima/Downloads/pic16f15245-lpc-demo-code-master/pic16f15245-lpc-demo-code.X'
make[1]: Leaving directory 'C:/Users/Dima/Downloads/pic16f15245-lpc-demo-code-master/pic16f15245-lpc-demo-code.X'
BUILD SUCCESSFUL (total time: 12s)
А вот в Arduino 1.8.19 есть достаточно существенный результат,
вот скетч.
1. Тест оригинального компилятора, оптимизация и так там стоит
-Os (в
platform.txt стоит "compiler.path={runtime.tools.avr-gcc.path}/bin/"):
Код: Выделить всё
...
"C:\\Arduino\\portable\\packages\\arduino\\tools\\avr-gcc\\7.3.0-atmel3.6.1-arduino7/bin/avr-size" -A "C:\\Users\\Dima\\AppData\\Local\\Temp\\arduino_build_613730/ProgramPic.ino.elf"
Скетч использует 12254 байт (39%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 463 байт (22%) динамической памяти, оставляя 1585 байт для локальных переменных. Максимум: 2048 байт.
2. Тест компилятора XC8(на основе avr версии 5.4.0, т.е. старше чем верхний 7.3.0) с выключенным xclm2.exe(т.е. без лицензии)(в
platform.txt стоит "compiler.path=C:/xc8/v2.36/avr/bin/"):
Код: Выделить всё
...
C:/xc8/v2.36/avr/bin/avr-size -A "C:\\Users\\Dima\\AppData\\Local\\Temp\\arduino_build_613730/ProgramPic.ino.elf"
Скетч использует 12300 байт (40%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 477 байт (23%) динамической памяти, оставляя 1571 байт для локальных переменных. Максимум: 2048 байт.
3. Тест компилятора XC8(на основе avr версии 5.4.0, т.е. старше чем верхний 7.3.0) с включенным xclm2.exe(т.е. с лицензией)(в
platform.txt стоит "compiler.path=C:/xc8/v2.36/avr/bin/"):
Код: Выделить всё
...
C:/xc8/v2.36/avr/bin/avr-size -A "C:\\Users\\Dima\\AppData\\Local\\Temp\\arduino_build_613730/ProgramPic.ino.elf"
Скетч использует 9370 байт (30%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 477 байт (23%) динамической памяти, оставляя 1571 байт для локальных переменных. Максимум: 2048 байт.
Чтобы оно успешно компилировало в среде Arduino, необходимо было скачать версию 5.4.0(avr8-gnu-toolchain-3.6.2.1778-win32.any.x86.zip) и скопировать
avr8-gnu-toolchain-win32_x86\avr\include и
avr8-gnu-toolchain-win32_x86\avr\lib файлы по пути
xc8\v2.36\avr\avr\include и
xc8\v2.36\avr\avr\lib соответственно, т.к. в xc8 отсутствует часть библиотек.
Так что это еще смело в тему AVR.