Цитата(Sarez @ May 10 2007, 18:20)

Доброго всем дня! Скажите пожалуйста, не мог ли кто нибудь скинуть пример реализации fiq-прерывания в IAR под LPC (или любой другой) ? Особенно интересует содержание startup- файла. Чтоб посмотреть , как умные люди делают, а то я что-то вконец запутался...
Само fiq прерывание реализуется как:
Код
#pragma vector = 0x1c
__fiq __arm void FIQ_isr (void)
{
}
Необходимо также помнить, что нужно проинициализировать стек FIQ.
В стандартном startup это не делается, я делаю это в функции low_level_init в asm файле:
Код
MODULE __low_level_init
; Mode, correspords to bits 0-5 in CPSR
MODE_BITS DEFINE 0x1F ; Bit mask for mode bits in CPSR
USR_MODE DEFINE 0x10 ; User mode
FIQ_MODE DEFINE 0x11 ; Fast Interrupt Request mode
IRQ_MODE DEFINE 0x12 ; Interrupt Request mode
SVC_MODE DEFINE 0x13 ; Supervisor mode
ABT_MODE DEFINE 0x17 ; Abort mode
UND_MODE DEFINE 0x1B ; Undefined Instruction mode
SYS_MODE DEFINE 0x1F ; System mode
;; ICODE is the same segment as cstartup. By placing __low_level_init
;; in the same segment, we make sure it can be reached with BL. */
RSEG FIQ_STACK:DATA(2)
RSEG ICODE:CODE:NOROOT(2)
PUBLIC __low_level_init
CODE32
__low_level_init:
mrs r1,cpsr ; Original PSR value
bic r0,r1,#MODE_BITS ; Clear the mode bits
orr r0,r0,#FIQ_MODE ; Set FIQ mode bits
msr cpsr_c,r0 ; Change the mode
ldr sp,=SFE(FIQ_STACK) & 0xFFFFFFF8; End of FIQ_STACK
msr cpsr_c,r1 ; Back to mode
;; Choose if segment initialization */
;; should be done or not. */
;; Return: 0 to omit seg_init */
;; 1 to run seg_init */
MOV R0,#1
;; Return with BX to be independent of mode of caller
BX LR
LTORG
ENDMOD
END
Сам сегмент FIQ_STACK нужно не забыть объявить. У меня это делается линкером:
-Z(DATA)FIQ_STACK+$(FIQ_STACK_SIZE)=$(RAM_START)-$(RAM_END)