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

 
 
> 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
2 страниц V  < 1 2  
Start new topic
Ответов (15 - 23)
Kesha
сообщение Mar 2 2009, 10:08
Сообщение #16


Участник
*

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



Добрый день.
Подскажите пожалуйста литературу по асемблеру для LPC-ек.
Спасибо.
Go to the top of the page
 
+Quote Post
Kesha
сообщение Mar 2 2009, 10:22
Сообщение #17


Участник
*

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



Добрый день.
Возник такой вопрос:
какую команду можно разместит в ячейке оперативной памяти с адресом 0x40000018, чтобы она загружала содержимое ячейки 0xffffff00 в PC?
Команда ldr pc,[pc,#0xffffff00-.-8] не прокатывает. Пишет, что смещение недопустимое.
Спасибо.
Go to the top of the page
 
+Quote Post
KRS
сообщение Mar 2 2009, 10:29
Сообщение #18


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(Kesha @ Mar 2 2009, 13:08) *

ARM Architecture Reference Manual
Go to the top of the page
 
+Quote Post
KRS
сообщение Mar 2 2009, 10:34
Сообщение #19


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(Kesha @ Mar 2 2009, 13:22) *
Добрый день.
Возник такой вопрос:
какую команду можно разместит в ячейке оперативной памяти с адресом 0x40000018, чтобы она загружала содержимое ячейки 0xffffff00 в PC?
Команда ldr pc,[pc,#0xffffff00-.-8] не прокатывает. Пишет, что смещение недопустимое.
Спасибо.

Это у вас вектор IRQ в RAM и вам нужен доступ к контроллеру прерываний?
так IRQ работать не будет, нужно отмапить RAM на 0 адрес. И тогда проблем с командой не будет.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Mar 2 2009, 10:34
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Kesha @ Mar 2 2009, 13:22) *
какую команду можно...

Одну? Одну никакую, ибо смещения в 32bit теле команды не хватит. Посему только загрузка непосредственного значения - а это два слова


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
scifi
сообщение Mar 2 2009, 10:55
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Присоединяюсь к KRS: надо ремапить RAM. В указанной инструкции диапазон смещения +/- 4095 байт. Только зачем так хитро? Для этого есть инструкция B (branch).
Go to the top of the page
 
+Quote Post
KRS
сообщение Mar 2 2009, 11:02
Сообщение #22


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(scifi @ Mar 2 2009, 13:55) *
Присоединяюсь к KRS: надо ремапить RAM. В указанной инструкции диапазон смещения +/- 4095 байт. Только зачем так хитро? Для этого есть инструкция B (branch).

насколько я понял имеется ввиду сразу jump на обработчик, который подсовывает контроллер прерываний. так что простым B тут не отделаешься.
Go to the top of the page
 
+Quote Post
Kesha
сообщение Mar 2 2009, 11:15
Сообщение #23


Участник
*

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



Цитата(zltigo @ Mar 2 2009, 13:34) *
Одну? Одну никакую, ибо смещения в 32bit теле команды не хватит. Посему только загрузка непосредственного значения - а это два слова

Если не секрет, то какие?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 2 2009, 13:12
Сообщение #24


Гуру
******

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



Цитата(Kesha @ Mar 2 2009, 13:22) *
Возник такой вопрос:
какую команду можно разместит в ячейке оперативной памяти с адресом 0x40000018, чтобы она загружала содержимое ячейки 0xffffff00 в PC?

Зачем Вам эта команда по адресу 0x40000018? Вектор прерывания всегда на 0x18.
Go to the top of the page
 
+Quote Post

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

 


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


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