|
irq_handler, Правильно обрабатывать во FreeRTOS |
|
|
|
Feb 28 2009, 23:40
|

Участник

Группа: Участник
Сообщений: 42
Регистрация: 9-01-09
Пользователь №: 43 058

|
Добрый день. В стартуп файле сделал: Код irq_handler_address: .word 0x40000018 /* cpu_irq_isr */ fiq_handler_address: .word 0x4000001C /* cpu_fiq_isr */ В мейне сделал так: Код #define IRQ_RAM_ADDR 0x40000018 #define FIQ_RAM_ADDR 0x4000001C #define IRQ_RAM_FUNC_ADDR 0x40000038 #define FIQ_RAM_FUNC_ADDR 0x4000003C
MEMMAP = 0x01;//Interrupt vectors are not re-mapped and reside in Flash. unsigned int * ptr; //---- Set interrupts vectors ptr = (unsigned int *)IRQ_RAM_ADDR; *ptr = 0xE59FF018; //-- ldr pc, [pc, #24] ptr = (unsigned int *)FIQ_RAM_ADDR; *ptr = 0xE59FF018; //-- ldr pc, [pc, #24] //--- Put IRQ & FIQ vectors in RAM ptr = (unsigned int *)IRQ_RAM_FUNC_ADDR; *ptr = (unsigned int)&cpu_irq_handler; ptr = (unsigned int *)FIQ_RAM_FUNC_ADDR; //*ptr = (unsigned int)&cpu_fiq_handler; И определил: Код //---------------------------------------------------------------------------- void cpu_irq_handler(void) { int_func ifunc; ifunc = (int_func)VICAddress; if(ifunc != 0) (*ifunc)(); } При прерывании заходим в cpu_irq_handler(void) и прыгаем непосредственно в обработчик прерывания. При выходе из обработчика прерывания мы прыгаем в dabort_handler. Что не правильно в cpu_irq_handler()?
|
|
|
|
|
Feb 28 2009, 23:52
|

Участник

Группа: Участник
Сообщений: 42
Регистрация: 9-01-09
Пользователь №: 43 058

|
Цитата(aaarrr @ Mar 1 2009, 03:45)  То, что он режим не восстанавливает. А почему бы не считать PC непосредственно из VICVectAddr (типа ldr pc, [pc, #-0xff0])? Т.е. асм функцию вместо void cpu_irq_handler(void)?
|
|
|
|
|
Mar 1 2009, 00:00
|

Участник

Группа: Участник
Сообщений: 42
Регистрация: 9-01-09
Пользователь №: 43 058

|
Цитата(aaarrr @ Mar 1 2009, 03:58)  Одну команду, а не функцию. А как узнать код этой команды из "ldr pc, [pc, #-0xff0]"?
|
|
|
|
|
Mar 1 2009, 00:08
|

Участник

Группа: Участник
Сообщений: 42
Регистрация: 9-01-09
Пользователь №: 43 058

|
Цитата(aaarrr @ Mar 1 2009, 04:04)  Написать и дизассемблировать, например (e51ffff0). Понял. Спасибо. Цитата(aaarrr @ Mar 1 2009, 04:04)  Только зачем? Чтобы сразу вписать значение и всё. А как ещё в нужную ячейку рам вписать нужную команду?
Сообщение отредактировал Kesha - Mar 1 2009, 00:20
|
|
|
|
|
Mar 1 2009, 00:31
|

Участник

Группа: Участник
Сообщений: 42
Регистрация: 9-01-09
Пользователь №: 43 058

|
Цитата(aaarrr @ Mar 1 2009, 04:20)  А что Вы делали в мейне? Сейчас сделал так: Код //---- Set interrupts vectors ptr = (unsigned int *)IRQ_RAM_ADDR; *ptr = 0xE51FFFF0; //-- ldr pc, [pc, #-0xff0] Вместо обработчика прыгаю в pabort. Что опять я неправильно сделал?
|
|
|
|
|
Mar 1 2009, 02:15
|

Участник

Группа: Участник
Сообщений: 42
Регистрация: 9-01-09
Пользователь №: 43 058

|
Цитата(aaarrr @ Mar 1 2009, 04:49)  У Вас VIC PL192, а не PL190, так что... Спасибо! ...#-0x120... Пишу так: Код ptr = (unsigned int *)IRQ_RAM_ADDR; *ptr = 0xE51FF120; //E51FF120 ldr pc, [pc, #-0x120] Происходит следующее: Инициализируем все и после запускаем прерывание. Далее прыгаю в 0x40000018 (там команда ldr pc, [pc, #-0x120]). Но при попытке выполнить эту команду, тут же оказываюсь на векторе reset_handler. Что за х? На всякий случай из стартапа: Код .section .vectors, "ax" .code 32 .align 0 .global _vectors .global reset_handler /***************************************************************************** * Exception Vectors * *****************************************************************************/ _vectors: ldr pc, reset_handler_address ldr pc, undef_handler_address ldr pc, swi_handler_address ldr pc, pabort_handler_address ldr pc, dabort_handler_address .word 0xB8A06F58 /* 0 - (sum of other vectors instructions) */ ldr pc, irq_handler_address ldr pc, fiq_handler_address
reset_handler_address: .word reset_handler undef_handler_address: .word undef_handler swi_handler_address: .word swi_handler pabort_handler_address: .word pabort_handler dabort_handler_address: .word dabort_handler .word 0x00 irq_handler_address: .word 0x40000018 /* cpu_irq_isr */ fiq_handler_address: .word 0x4000001C /* cpu_fiq_isr */ .section .init, "ax" .code 32 .align 0 /****************************************************************************** * * * Default exception handlers * * * ******************************************************************************/ reset_handler:...
Сообщение отредактировал Kesha - Mar 1 2009, 02:32
|
|
|
|
|
Mar 1 2009, 02:56
|

Участник

Группа: Участник
Сообщений: 42
Регистрация: 9-01-09
Пользователь №: 43 058

|
Цитата(aaarrr @ Mar 1 2009, 06:47)  Как прыгаете? Процессор по прерыванию перейдет на 0x18, а не 0x40000018. Всё верно. В случае прерывания если ремапа нет, то прыгаем на 0x00000018. Далее у меня там -> irq_handler_address: .word 0x40000018 /* cpu_irq_isr */. Похоже стормозил на счет ldr pc, [pc, #-40000120] (это для загрузки если находися в 0x18). В ячейке 0x40000018 нужно разместить команду для загрузки в PC адрес из регистра адреса VIC. Можно ли здесь одной командой отделаться? Если да, то какой именно?
Сообщение отредактировал Kesha - Mar 1 2009, 03:30
|
|
|
|
|
Mar 2 2009, 08:27
|

Участник

Группа: Участник
Сообщений: 42
Регистрация: 9-01-09
Пользователь №: 43 058

|
Цитата(aaarrr @ Mar 1 2009, 13:37)  Причем тут ремап? При получении прерывания процессор всегда переходит на 0x18, и именно там и нужно поставить ldr pc, [pc, #xxx], без всяких левых переходов. Спасибо, aaarrr. Посоветуйте книжку по АСМу, пожалуйста.
Сообщение отредактировал Kesha - Mar 2 2009, 09:15
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|