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

 
 
> Вложенные прерывания ARM7 LPC-2478
lecko
сообщение Sep 12 2011, 07:15
Сообщение #1





Группа: Участник
Сообщений: 10
Регистрация: 22-08-11
Пользователь №: 66 820



Всем привет!

У кого-нибудь есть работающий пример вложенных прерываний под LPC-2478? Облазил и форумы, и документацию - везде только общие рекомендацииsad.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
lecko
сообщение Sep 12 2011, 10:23
Сообщение #2





Группа: Участник
Сообщений: 10
Регистрация: 22-08-11
Пользователь №: 66 820



Спасибо за ответ!

В соответствии с общими указаниями сделано следующее:

Так выглядит код внешнего прерывания:

Код
#define IENABLE __asm { MRS sysreg, SPSR; MSR CPSR_c, #SYS32Mode }
#define IDISABLE __asm { MSR CPSR_c, #(IRQ32Mode|I_Bit); MSR SPSR_cxsf, sysreg }
...
void UARTHandler (void) __irq    
{
    IENABLE;
    ...
    //тут происходит вызов функции, инициирующей срабатывание вложенного прерывания
    ...
    IDISABLE;
    VICVectAddr = 0;
}


В коде внутреннего прерывания никаких специальных действий не происходит. Оба прерывания зарегистрированы с высшим приоритетом. Документация по компилятору RealView, который я использую, утверждает, что адреса возврата сохранять не надо - компилятор-де делает это автоматически. Вопрос - почему во внутреннее прерывание не передается управление?
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Sep 12 2011, 11:11
Сообщение #3


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(lecko @ Sep 12 2011, 15:23) *
Вопрос - почему во внутреннее прерывание не передается управление?

Да потому, что при вызове первого прерывания глобально прерывания запрещаются и их нужно ручками разрешать (после IENABLE), а потом запрещать (перед IDISABLE).


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
lecko
сообщение Sep 12 2011, 11:50
Сообщение #4





Группа: Участник
Сообщений: 10
Регистрация: 22-08-11
Пользователь №: 66 820



Цитата(GetSmart @ Sep 12 2011, 15:11) *
Да потому, что при вызове первого прерывания глобально прерывания запрещаются и их нужно ручками разрешать (после IENABLE), а потом запрещать (перед IDISABLE).


Сделал. Вторая версия кода:
Код
#define IENABLE __asm { MRS sysreg, SPSR; MSR CPSR_c, #SYS32Mode }
#define IDISABLE __asm { MSR CPSR_c, #(IRQ32Mode|I_Bit); MSR SPSR_cxsf, sysreg }
...
DWORD install_irq( DWORD IntNumber, void *HandlerAddr, DWORD Priority )
{
    DWORD *vect_addr;
    DWORD *vect_cntl;
      
    VICIntEnClr = 1 << IntNumber;
    if ( IntNumber >= VIC_SIZE )
    {
        return ( FALSE );
    }
    else
    {
        vect_addr = (DWORD *)(VIC_BASE_ADDR + VECT_ADDR_INDEX + IntNumber*4);
        vect_cntl = (DWORD *)(VIC_BASE_ADDR + VECT_CNTL_INDEX + IntNumber*4);
        *vect_addr = (DWORD)HandlerAddr;
        *vect_cntl = Priority;
        VICIntEnable = 1 << IntNumber;
        return( TRUE );
    }
}
...
void UARTHandler (void) __irq    
{
    IENABLE;
    install_irq(MCI_INT, (void*)MCI_IRQHandler, HIGHEST_PRIORITY);//включаем прерывание
    ...
    //тут происходит вызов функции, инициирующей срабатывание вложенного прерывания
    ...
    VICIntEnClr = 1 << IntNumber;//отключаем прерывание
    IDISABLE;
    VICVectAddr = 0;
}


Все равно не работает sad.gif
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Sep 12 2011, 12:25
Сообщение #5


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(lecko @ Sep 12 2011, 16:50) *
Все равно не работает sad.gif

Читаем ещё раз моё сообщение.

Во-первых оба прерывания в VIC должны быть уже разрешены и настроены. Во-вторых глобальное разрешение прерываний (которое должно быть сразу после IENABLE) в IAR-е пишется как __enable_interrupt(). В РеалВью не знаю как. Но суть команды в сбросе флага I (иногда вместе с F) во флагах ядра ARM7.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 13:49
Рейтинг@Mail.ru


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