#c #linker #iar #stm8 #mcu
Вопрос:
Я делаю программу для STM8L151G6 на встроенном рабочем столе IAR для STM8 (версия 3.11.1), мне нужно разместить инструкцию JPF 0xf000
по адресу 0x008426. Я делаю это. В коде на языке Си:
__root static const uint8_t jpfat0x8426 [] @ "ENTRY_POINT" = {0xac, 0x00, 0xf0, 0x00}; // jpf 0xf000
В файле .icf:
define region EntryPoint = [from 0x8426 to 0x842A];
define region VectorsRegion = [from 0x8000 size 0x80];
define region NearFuncCode = [from 0x8080 to 0xEF7F] - EntryPoint;
define region FarFuncCode = [from 0x8080 to 0xEF7F] - EntryPoint;
define region HugeFuncCode = [from 0x8080 to 0xEF7F] - EntryPoint;
place at start of EntryPoint { ro section ENTRY_POINT };
place in EntryPoint { };
Компоновщик строит код следующим образом:
...
"A2": 0x80
INTVEC 0x008000 0x80 <Block>
.intvec const 0x008000 0x80 interrupt.o [4]
- 0x008080 0x80
"A3": 0x4
ENTRY_POINT const 0x008426 0x4 project51.o [1]
- 0x00842a 0x4
"P3-P5": 0x20cb
.near_func.text ro code 0x00842b 0x3a6 float.o [4]
.near_func.text ro code 0x0087d1 0x2a1 data_exchange.o [1]
.near_func.text ro code 0x008a72 0x1fa fuel_gauge.o [1]
...
Это правильно. Но диапазон [от 0x008080 до 0x00842b] пуст, поэтому код не является компактным.
Я теряю около 1 тыс. байт, это слишком много для микроконтроллера stm8. Например, объект с плавающей точкой.o (размер 0x3a6)
может быть помещен в этот диапазон, но компоновщик этого не делает. Есть ли какой-то способ сказать компоновщику, чтобы он делал более плотный код и заполнял пустые куски разделов объектами.
Спасибо.