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

 
 
> AT91SAM7S64 + uC/OSv2.80, = проблема с прерываниями
jhoo
сообщение Nov 18 2005, 13:07
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 22
Регистрация: 19-04-05
Пользователь №: 4 288



Создал простейший проект на основе примера с портом для ат91 (AN-1014.pdf)
Все сделал как положено, вот пример стартовой задачи:
Код
void  StartTask (void *p_arg)
{
    INT8U  i;
    p_arg = p_arg;

    BSP_Init();

#if OS_TASK_STAT_EN > 0
    OSStatInit();
#endif

    LED_Off(BSP_LED_ALL);
    timer_init ();  // <--- после этого цикл внизу успевает прокрутиться 1 раз

    while (1)
    {
        for (i = 1; i <= 4; i++)
        {
            LED_On(i);
            OSTimeDlyHMSM(0, 0, 0, 50);
            LED_Off(i);
        }
        for (i = 1; i <= 4; i++)
        {
            LED_On(5 - i);
            OSTimeDlyHMSM(0, 0, 0, 50);
            LED_Off(5 - i);
        }
    }
}

Системные тики идут от PIT. Все работало прекрасно, пока не потребовалась работа
с другой периферий, котрая использовала прерывания - UART и таймера 0,1. После этого
почему-то прерывания перестали генерироваться совсем, в т.ч. и от PIT, поэтому в ОС
критится только задача OS_TaskIdle.
Проверял рабочйи пример который с портом, добавляя в него работу с другими прерываниями,
результат тот же.

Что я сделал не так?

Вот обработчик прерываний,
Код
void  OS_CPU_IRQ_ISR_Handler (void)
{
    BSP_PFNCT  pfnct;


#if 1
    pfnct = (BSP_PFNCT)AT91C_BASE_AIC->AIC_IVR;     /* Read the interrupt vector from the VIC          */
    if (pfnct != (BSP_PFNCT)0) {                    /* Make sure we don't have a NULL pointer          */
        (*pfnct)();                                 /* Execute the ISR for the interrupting device     */
    }
#else
    pfnct = (BSP_PFNCT)AT91C_BASE_AIC->AIC_IVR;     /* Read the interrupt vector from the VIC          */
    while (pfnct != (BSP_PFNCT)0) {                 /* Make sure we don't have a NULL pointer          */
      (*pfnct)();                                   /* Execute the ISR for the interrupting device     */
        pfnct = (BSP_PFNCT)AT91C_BASE_AIC->AIC_IVR; /* Read the interrupt vector from the VIC          */
    }
#endif
}

который вызывается из OS_CPU_IRQ_ISR.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


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

 


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


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