ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
23 апреля
703434
VVB (04.10.2016 12:31 - 12:45, просмотров: 2372)
Коллеги, подскажите по линкеру ld Надо, чтобы эта сволочь прямо выполнила мои инструкции, указанные в скрипте линкера, и не умничала. Фрагмент скрипта:
MEMORY {
/* 256KB of Internal Sram starting at 0x00000000 after remap */
    RAM (rwx) : ORIGIN = 0x00000000, LENGTH = 256K
}

SECTIONS 
{
    .data : {
        __data_load = LOADADDR (.data);
        __data_start = .;
        *(.data .data.*)
    } >RAM AT>RAM
}
Проблема в том, что LMA секции .data = VMA секции .data. Я же ожидаю, что линкер в области памяти RAM зарезервирует два блока размером SIZEOF(.data): в одном будут храниться константы (начальные значения), а во втором непосредственно данные (сейчас резервируется только один блок). Мой стартапный код во время инициализации из LMA тупо скопирует в VMA эти константы и передаст управление дальше. Сейчас при рестарте у меня не инициализируется секция .data: копируется из себя в себя (при загрузке из отладчика отладчик загружает секцию .data из .elf правильно, но если программа поработала и изменила .data, то рестарт без повторной загрузки секции .data приводит к сбоям из-за отсутствия инициализации .data). Создавать второй регион памяти в MEMORY не предлагать. Я не хочу мучиться с распределением памяти и с точным указанием абсолютных адресов размещения различных блоков памяти.