Подкинте примерчик, как установить вектора прерываний в IAR EW 4.xx для случая, когда вектора находятся в ПЗУ и когда они в ОЗУ.
__program_start
ldr pc,[pc,0x18]
org 0x04
ldr pc,[pc,0x18]
org 0x08
ldr pc,[pc,0x18]
org 0x0c
ldr pc,[pc,0x18]
org 0x10
ldr pc,[pc,0x18]
org 0x18
LDR pc,[pc,#-0xFF0];get irq adr fr VicVectAdr to PC
org 0x1c
LDR pc,[pc,#-0xFF0]
vectortab
dcd ?cstartup
dcd undefhndlr
dcd swihndlr
dcd prefetchaborthndlr
dcd dataaborthndlr
dcd notusedhndlr
undefhndlr
b undefhndlr
swihndlr
b swihndlr
prefetchaborthndlr
b prefetchaborthndlr
dataaborthndlr
b dataaborthndlr
notusedhndlr
b notusedhndlr
Сразу после метки ?cstartup добавляешь парочку команд:
?cstartup
ldr r11,=__program_start
ldr r12,=0x40000000
ldmia r11!,{r0-r10}
stmia r12!,{r0-r10]
ldmia r11!,{r0-r1}
stmia r12!,{r0-r1}
это достаточно универсальный способ годящийся для работы как из ОЗУ так и из ПЗУ. В таблице vectortab можно размещать динамически адреса обработчиков прерываний. Это не точный шаблон конкретной программы, только прорисоывна концепция решения проблемы...
А есть ли возможность задать вектора через Сишный код?