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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> irq_handler, Правильно обрабатывать во FreeRTOS
Kesha
сообщение Feb 28 2009, 23:40
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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()?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 28 2009, 23:45
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Kesha @ Mar 1 2009, 02:40) *
Что не правильно в cpu_irq_handler()?

То, что он режим не восстанавливает. А почему бы не считать PC непосредственно из VICVectAddr (типа ldr pc, [pc, #-0xff0])?
Go to the top of the page
 
+Quote Post
Kesha
сообщение Feb 28 2009, 23:52
Сообщение #3


Участник
*

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



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

Т.е. асм функцию вместо void cpu_irq_handler(void)?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 28 2009, 23:58
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Одну команду, а не функцию.
Go to the top of the page
 
+Quote Post
Kesha
сообщение Mar 1 2009, 00:00
Сообщение #5


Участник
*

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



Цитата(aaarrr @ Mar 1 2009, 03:58) *
Одну команду, а не функцию.

А как узнать код этой команды из "ldr pc, [pc, #-0xff0]"?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 1 2009, 00:04
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Написать и дизассемблировать, например (e51ffff0). Только зачем?
Go to the top of the page
 
+Quote Post
Kesha
сообщение Mar 1 2009, 00:08
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 1 2009, 00:20
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Kesha @ Mar 1 2009, 03:08) *
А как в нужную ячейку рам вписать нужную команду?

А что Вы делали в мейне?
Цитата
//---- Set interrupts vectors
Go to the top of the page
 
+Quote Post
Kesha
сообщение Mar 1 2009, 00:31
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 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.
Что опять я неправильно сделал?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 1 2009, 00:49
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Kesha @ Mar 1 2009, 03:31) *
Что опять я неправильно сделал?

Слишком буквально восприняли мои советы. У Вас VIC PL192, а не PL190, так что читать надо адрес 0xfffffff0: ldr pc, [pc, #-0x30] (e51ff030).
Go to the top of the page
 
+Quote Post
Kesha
сообщение Mar 1 2009, 02:15
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 1 2009, 02:47
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Kesha @ Mar 1 2009, 05:15) *
Далее прыгаю в 0x40000018 (там команда ldr pc, [pc, #-0x120]).

Как прыгаете? Процессор по прерыванию перейдет на 0x18, а не 0x40000018.
Go to the top of the page
 
+Quote Post
Kesha
сообщение Mar 1 2009, 02:56
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 1 2009, 09:37
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Kesha @ Mar 1 2009, 05:56) *
В случае прерывания если ремапа нет, то прыгаем на 0x00000018.

Причем тут ремап? При получении прерывания процессор всегда переходит на 0x18, и именно там и нужно поставить ldr pc, [pc, #xxx], без всяких левых переходов.
Go to the top of the page
 
+Quote Post
Kesha
сообщение Mar 2 2009, 08:27
Сообщение #15


Участник
*

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



Цитата(aaarrr @ Mar 1 2009, 13:37) *
Причем тут ремап? При получении прерывания процессор всегда переходит на 0x18, и именно там и нужно поставить ldr pc, [pc, #xxx], без всяких левых переходов.

Спасибо, aaarrr.

Посоветуйте книжку по АСМу, пожалуйста.

Сообщение отредактировал Kesha - Mar 2 2009, 09:15
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 17th June 2025 - 06:37
Рейтинг@Mail.ru


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