nanorobot 3 24 августа, 2016 Опубликовано 24 августа, 2016 (изменено) · Жалоба В проекте на STM32F407 часть секторов флеш использую для хранения данных. Ранее обходился последними секторами, сама программа не так велика, последние сектора остаются не заняты кодом. Сейчас возникла необходимость использовать сектора 2 и 3 как самые маленькие по об'ему. Как запретить линкеру использовать их для размещения кода. Своих знаний недостаточно, к сожалению, а исследования скритпов линкера имеющихся примеров не помогли. Прошу помощи. Linux/Eclipse/arm-none-eabi-gcc 5.3.1 Изменено 24 августа, 2016 пользователем nanorobot Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 24 августа, 2016 Опубликовано 24 августа, 2016 · Жалоба Насколько я помню, линкер gcc не умеет размещать секции в дырявых областях памяти. Остаётся только вариант с двумя областями памяти и в скрипте руками раскидать секции по этим областям. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smalcom 0 25 августа, 2016 Опубликовано 25 августа, 2016 · Жалоба Пример. В оригинальный скрипт компоновщика KEEP(*(.isr_vector)) *(.text*) KEEP(*(.init)) KEEP(*(.fini)) Добавляете свою секцию KEEP(*(.isr_vector)) . = ALIGN (512); *(.flash_var*) . = ALIGN (512); *(.flash_var_end*) *(.text*) KEEP(*(.init)) KEEP(*(.fini)) в ALIGN пишите размер страницы, так у вас начало и конец будут выровнены по страницам. Для контроля смотреть *.sym файл 00000000 a Heap_Size 00000400 a Stack_Size 08000000 T __isr_vector 08000200 t Service::Config::mConfigDataFlashArray <-------------------------------------------- 08000600 t __do_global_dtors_aux 08000624 t frame_dummy 0800065c T _mainCRTStartup Саму переменную объявляем с атрибутом, указывающим на используюмую для переменной секцию uint8_t __attribute__ ((section(".flash_var"))) mConfigDataFlashArray[sizeof(SConfigData_Internal)]; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться