В связи с переходом на 5-й ИАР осваиваю его линкер. Платформа - АРМ. Вообще, для определения пользовательского обработчика прерывания дока рекомендует переопределить соотв. "слабую" функцию, например, IRQ_Handler() в случае обработчика IRQ. Т.е. в случае использования стандартого стартапа я могу переопределить вышеупомянутую IRQ_Handler() и "вперед на мины". Но я хочу вообще обойти использование этой функции и по аресу 0x18 поместить инструкцию "LDR PC,VICVectAddr"
Насколько я понял, я больше не могу где-то в асм-файле сказать "SEGMENT .... ORG 0x18 ..." Тут либо секция определена в стартапе, либо я ее должен переопределить полностью, а "влезть грязыми руками" в готовую секцию мне уже нельзя. Но мне пока не удалось и всю секцию перепределить. Такой код омпилится и линкуется без проблем, но по адресу 0x18 по-прежнему остается вызов IRQ_Handler():
Код
SECTION .intvec:CODE:NOROOT(2)
EXTERN __iar_program_start
EXTERN Undefined_Handler
EXTERN SWI_Handler
EXTERN Prefetch_Handler
EXTERN Abort_Handler
EXTERN FIQ_Handler
ARM
; All default exception handlers (except reset) are
; defined as weak symbol definitions.
; If a handler is defined by the application it will take precedence.
LDR PC,Reset_Addr ; Reset
LDR PC,Undefined_Addr; Undefined instructions
LDR PC,SWI_Addr; Software interrupt (SWI/SVC)
LDR PC,Prefetch_Addr ; Prefetch abort
LDR PC,Abort_Addr ; Data abort
DCD 0 ; RESERVED
LDR PC, VICVectAddr
LDR PC,FIQ_Addr; FIQ
DATA
Reset_Addr: DCD __iar_program_start
Undefined_Addr: DCD Undefined_Handler
SWI_Addr: DCD SWI_Handler
Prefetch_Addr: DCD Prefetch_Handler
Abort_Addr: DCD Abort_Handler
FIQ_Addr: DCD FIQ_Handler
Пока есть только одна идея: приведенный выше код сунуть в другую секцию и ее расположить по нулевому адресу, а про .intvec вообще забыть, но может есть более красивое решение чтобы правильно заместить обработчик прерывания или исключения не изменяя стартап?