Sarez 0 10 мая, 2007 Опубликовано 10 мая, 2007 (изменено) · Жалоба Доброго всем дня! Скажите пожалуйста, не мог ли кто нибудь скинуть пример реализации fiq-прерывания в IAR под LPC (или любой другой) ? Особенно интересует содержание startup- файла. Чтоб посмотреть , как умные люди делают, а то я что-то вконец запутался... Изменено 10 мая, 2007 пользователем Sarez Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andy_Mozzhevilov 0 11 мая, 2007 Опубликовано 11 мая, 2007 · Жалоба Доброго всем дня! Скажите пожалуйста, не мог ли кто нибудь скинуть пример реализации 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) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться