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

 
 
> Прерывание LPC2378 не срабатывает., посоветуйте, где искать причину, пож.
svss
сообщение May 26 2010, 08:13
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 231
Регистрация: 19-12-08
Из: Новосибирск
Пользователь №: 42 594



Ситуация: после инициализации процессора разрешается прерывание,
в результате в регистре VICADDRESS я вижу адрес входной точки прерывания таймера Timer0IntrHandler (код ниже),
однако ловушки (breakpoints) в обработчике прерываний не срабатывают::

продолжает крутиться main() - "мотает" счётчик loops,
считают аппаратные счётчики таймера, а
lbolt (изменяемый в обработчике прерывания) стоит в нуле.

Регистры:
CPSR = 0x3F
VICIRQSTATUS = 0x0000010 // timer0
VICPRIORITY4 = 9
VICINTENABLE = 0x000010 // timer0

Куда б ещё поглядеть, чтоб понять причину невхода в обработчик прерывания?
Подскажите, кто знает, пож.

Станок: Olimex-LPC2378 + JLINK, инструмент: IAR.

Код
void main(void)
{
    PlatformInit();        
    timer_initialize();    
    i2c_initialize(false);
    uart_initialize();
    __enable_interrupt();

    while(1){
        loops++;
    }//end while(1)
} // main ()


Таблица векторов:
Код
__irq __arm void IRQ_Handler (void) {
    void (*interrupt_function)();
    UINT32 vector;

    vector = VICVectAddr;               // Get the interrupt vector.
    interrupt_function = (void(*)())vector;                                         //  <--- breakpont is set here  ---
    if(interrupt_function != NULL) {
        interrupt_function();           // Call vectored interrupt function.
    } else {
        VICVectAddr = 0;                // Clear interrupt request in VIC.
    }
} // void IRQ_Handler

__irq __arm void Abort_Handler (void)      { while (true); }
__irq __arm void FIQ_Handler (void)        { while (true); }
__irq __arm void Prefetch_Handler (void)   { while (true); }
__irq __arm void SWI_Handler (void)        { while (true); }
__irq __arm void Undefined_Handler (void)  { while (true); }


Обработчик прерываний таймера:
Код
void Timer0IntrHandler (void)
{
    lbolt++;                //                                                  <--- breakpont is set here  ---
    T0IR = 1;               // T0IR.MR0INT = 1; -- Clear interrupt flag */
    VICVectAddr = 0;        // Acknowledge Interrupt.
} // Timer0IntrHandler
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
DpInRock
сообщение May 26 2010, 11:51
Сообщение #2


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



1. Два подряд VICVectAddr = 0; - не фэнщуй.
2. Без понятия volatile вам не жить.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
svss
сообщение May 26 2010, 13:12
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 231
Регистрация: 19-12-08
Из: Новосибирск
Пользователь №: 42 594



Цитата(DpInRock @ May 26 2010, 18:51) *
1. Два подряд VICVectAddr = 0; - не фэнщуй.
2. Без понятия volatile вам не жить.


1. Спасибо, постараюсь изучить. Хотя, с первого взгляда, операция безопасная, если выполняется с запрещёнными прерываниями (вольная цитата из мануала). Поправьте, ежли вру.
Кроме того я (пока) не вижу двух подряд... Со зрением что или в консерватории crying.gif

2. Volatile, imho нужно для *важных* переменных, имеющих собственное мнение. Типа аппаратных счётчиков.
Глобальные переменные сами по себе не изменяются.
Например, в приведенном коде lbolt программно изменяется в единственном месте и его содержимое +-палка никаких последствий не влечёт. Безопасно то есть.
Если Вы знаете другие причины, зачем бы нужно было метить переменные volatile, поделИтесь, пож. с народом, а то не ровен час таки повымрет весь. smile.gif

Ну, разместил я, скажем, буфер и зарядил на него бесконечный DMA неведомо отколе. Да, он volatile - ну и что? Никаких последствий, пока я сам не придумаю их.
---

Собственно, суть вопроса пока не прояснена. Попробую ещё раз:
Прерывания разрешены.
В регистр VICADDRESS попал нужный адрес из вектора.
СамогО прерывания нет. Почему? Можно ли где чего *увидеть* типа причины?

(переменные, в т.ч. volatile, - это потом. Лишняя запись в VICVectAddr - отличная идея, позволяющая, в случае правды, устранить проблему, но-увы -не увидеть - понять причину)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 26 2010, 13:24
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(svss @ May 26 2010, 16:12) *
В регистр VICADDRESS попал нужный адрес из вектора.
СамогО прерывания нет. Почему? Можно ли где чего *увидеть* типа причины?
А откуда вы знаете, что он туда попал? Вы его прочитали отладчиком? Поздравляем - вы этим чтением загрузили в него следующий адрес. Закройте окно с регистром VICADDRESS и все заработает.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 19:27
Рейтинг@Mail.ru


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