реклама на сайте
подробности

 
 
> прерывание fiq
Sarez
сообщение May 10 2007, 12:20
Сообщение #1


Частый гость
**

Группа: Новичок
Сообщений: 75
Регистрация: 17-08-06
Из: Минск
Пользователь №: 19 630



Доброго всем дня! Скажите пожалуйста, не мог ли кто нибудь скинуть пример реализации fiq-прерывания в IAR под LPC (или любой другой) ? Особенно интересует содержание startup- файла. Чтоб посмотреть , как умные люди делают, а то я что-то вконец запутался...

Сообщение отредактировал Sarez - May 10 2007, 12:21
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Andy Mozzhevilov
сообщение May 11 2007, 02:41
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



Цитата(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)


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 23:18
Рейтинг@Mail.ru


Страница сгенерированна за 0.01593 секунд с 7
ELECTRONIX ©2004-2016