Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Смысл "Dummy access to the .vectors section" в ARM7TDMI

Вс сен 09, 2012 20:00:41

Доброго дня.

Изучаю в деталях программу инициализации для AT91SAM7S256. И первая же инструкция вызывает у меня вопрос.

Код:
    ...

resetHandler:

/* Dummy access to the .vectors section so it does not get optimized */
    ldr r0, =resetVector

/* Set pc to actual code location (i.e. not in remap zone) */
    ldr pc, =1f

/* Perform low-level initialization of the chip using LowLevelInit() */
1:
    ldr r4, =_sstack
    mov sp, r4
    ldr r0, =LowLevelInit
    mov lr, pc
    bx r0

    ...


Сразу после включения управление переходит в Remap зону на resetHandler. Псевдоинструкция (ldr pc, =1f) делает переход с 0x00000004 во Flash по адресу 0x00100008. Дальше - инициализация стека и вызов C-функции и так далее. Но смысл первой dummy-инструкции (ldr r0, =resetVector) мне непонятен. Теоретически, зачем она? Связано ли это как-нибудь с Instruction Pipeline процессора ARM7TDMI?

Re: Смысл "Dummy access to the .vectors section" в ARM7TDMI

Чт сен 13, 2012 22:33:53

Я разобрался в смысле этой инструкции :kill: Оказалось что дело не в конвейере процессора, а в линкере. В актуальном скрипте линкера в команде SECTIONS среди прочих располагается оператор определения секции .relocate:
Код:
...
.relocate : AT (_efixed)
{
    . = ALIGN(4);
    _srelocate = .;
    *(.vectors)
    *(.ramfunc)
    *(.data)
    . = ALIGN(4);
    _erelocate = .;
} >sram
...


При этом в Makefile проекта указаны следующие опции компоновки:
Код:
LDFLAGS = -g $(OPTIMIZATION) -nostartfiles -Wl,--gc-sections


Здесь, --gc-sections - это не что иное как опция Remove unused sections (on some targets). Если убрать из кода явное обращение к секции векторов, то после сборки проекта размер секции .relocate заметно легчает согласно выводу команды
Код:
$ arm-elf-readelf -S


Полученный результат меня удовлетворил, поэтому разбираться в том, что за ад происходит в чипе при выполнении переоптимизированной микропрограммы я не стал :tea: Поправьте меня, если я где-то наврал.

Re: Смысл "Dummy access to the .vectors section" в ARM7TDMI

Сб сен 15, 2012 19:47:31

По --gc-sections выбрасывается всё, к чему нет явного обращения.
Изменение на
Код:
KEEP( *(.vectors))
должно помочь (т.е. секция не будет выбрасываться и без холостого обращения к ней).
Ответить