Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AT91SAM7S64 + uC/OSv2.80
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы
jhoo
Создал простейший проект на основе примера с портом для ат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.
jhoo
Все,разобрался.
Посмотрел атмеловский стартап (для ос использовал другой), они после обработки любых прерываний выполняли запись в EOICR. У меня же эта операция была только в обработчике PIT. Сделал так же и всё заработало. Вообщем сам виноват.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.