Перейти к содержанию
    

прерывание fiq

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

Изменено пользователем Sarez

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Доброго всем дня! Скажите пожалуйста, не мог ли кто нибудь скинуть пример реализации 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)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...