Как записать начальный адрес раздела в выделенное место в ПЗУ

В проекте на «голом железе» мне нужно записать начальный адрес раздела ПЗУ на выделенный адрес. То, что я нашел до сих пор, похоже на это определение в скрипте компоновщика:

MEMORY{
    ROM  (rx)  : ORIGIN = 0x00018000, LENGTH = 0x8000
    UICR (r)   : ORIGIN = 0x10001000, LENGTH = 0x400
}

SECTIONS {
    .bootloader_addr 0x10001014 :
    {
        KEEP(*(.bootloader_addr))
    } > UICR
}

и чтобы определить значение, которое должно быть размещено по адресу 0x10001014, я мог бы добавить это где-нибудь в файл C++:

std::uint32_t uicr_bootloader_start_address 
    __attribute__((section(".bootloader_addr"),used)) = 
        0x18000;

Есть ли у кого-нибудь идея, как мне избежать объявления постоянного целого числа и использовать компоновщик для прямой записи начального адреса раздела кода в 0x10001014?


person Torsten Robitzki    schedule 30.10.2014    source источник


Ответы (1)


Я сам этим не пользовался, но ld поддерживает LONG(expr) команда, которая должна вставить 4-байтовый литерал в двоичный файл.

person hcs    schedule 30.10.2014
comment
Спасибо, это работает как шарм. Нет, мне нужно выяснить, как оценить начальный адрес ROM MEMORY, поэтому мне не нужно копировать начальный адрес. - person Torsten Robitzki; 30.10.2014
comment
@TorstenRobitzki Я думаю, вы сможете сделать это, поместив только символ rom_start_address в область ROM, а затем LONG(rom_start_address)? - person hcs; 30.10.2014
comment
Я попробую это завтра и отчитаюсь, если это сработало. Я пробовал что-то вроде LONG(ADDR(ROM)) - person Torsten Robitzki; 30.10.2014
comment
Да, я думал, что LONG(ADDR(ROM)) будет работать, но области памяти другое пространство имен. - person hcs; 30.10.2014
comment
Сообщение об ошибке, получаемое при использовании LONG(ADDR(ROM))is invalid data statement. Предлагаемое вами решение по использованию дополнительного символа работает отлично. Спасибо большое. - person Torsten Robitzki; 31.10.2014