Изучаю в деталях программу инициализации для 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?
Оказалось что дело не в конвейере процессора, а в линкере. В актуальном скрипте линкера в команде SECTIONS среди прочих располагается оператор определения секции .relocate:
Поправьте меня, если я где-то наврал.