pokk 0 6 мая, 2019 Опубликовано 6 мая, 2019 · Жалоба Добрый день, понадобилось некоторые перемеренные перенести в начальный адрес ОЗУ, сделал секцию: place at address mem:__ICFEDIT_region_RAM_start__ { readwrite section .StartingRam}; Разместил примеренные в секции (Блочно можно указать? Что бы не к каждой переменной модификатор добавлять.) uint16_t CopyMaxLen@".StartingRam"; //-------------------------------------------- Dump32_t AddrCopyHead@".StartingRam"; Dump16_t AddrCopyLen@".StartingRam"; Dump32_t AddrCopyBuff@".StartingRam"; //-------------------------------------------- static Dump8_t VarSaveDump8@".StartingRam"; static Dump16_t VarSaveDump16@".StartingRam"; static Dump32_t VarSaveDump32@".StartingRam"; Смотрю map файл: "A3": 0xb8 .StartingRam zero 0x20000000 0x2c debuger.o [1] .StartingRam zero 0x2000002c 0x18 debuger.o [1] .StartingRam zero 0x20000044 0x2c debuger.o [1] .StartingRam zero 0x20000070 0x18 debuger.o [1] .StartingRam zero 0x20000088 0x2c debuger.o [1] .StartingRam zero 0x200000b4 0x2 debuger.o [1] - 0x200000b6 0xb6 Вижу что переменная CopyMaxLen разместилась в самом конце, это почему так? Я ожидал что они разместиться как я их объявил, в том же порядке. Хотя остальные разместились в порядке объявления. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 6 мая, 2019 Опубликовано 6 мая, 2019 · Жалоба 7 часов назад, pokk сказал: Вижу что переменная CopyMaxLen разместилась в самом конце, это почему так? Я ожидал что они разместиться как я их объявил, в том же порядке. С чего бы это? Компоновщик должен размещать объекты в выходной секции наиболее оптимально. Т.е. - так чтобы минимизировать дырки между ними, например. Поэтому, как правило, объекты с меньшим выравниванием оказываются в конце выходной секции линковки, с бОльшим - в её начале. И нет никакой гарантии о порядке размещения входных секций внутри выходной секции - это на усмотрение компоновщика (если не указано явно иное для данной вых.секции). Если нужен строгий порядок каких-то переменных - заключите их в struct. И использовать place at address mem - тоже, имхо, плохой стиль. Лучше задать этой структуре отдельную секцию и в выходной секции указать, что эта секция находится в её начале. В исходнике: __no_init struct { char buf1[xxx]; char buf2[xxx]; } static buf @ ".first_in_ram"; В .icf-файле: place in __ICFEDIT_region_RAM_start__ {rw, section .first_in_ram, ...}; Другой способ: Не размещать все переменные в одной структуре, а указать каждой переменной отдельную свою секцию и уже в .icf-файле создать из них блок, в котором расположить их в желаемом порядке: static __no_init u8 buf1[xxx] @ ".raw1"; static __no_init u8 buf2[xxx] @ ".raw2"; в .icf-файле: define block MEM_FIRST with fixed order {section .raw1, section .raw2}; place in __ICFEDIT_region_RAM_start__ {rw, block MEM_FIRST, ...}; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться