Перейти к содержанию
    

AT91SAM7S64 + uC/OSv2.80

Создал простейший проект на основе примера с портом для ат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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все,разобрался.

Посмотрел атмеловский стартап (для ос использовал другой), они после обработки любых прерываний выполняли запись в EOICR. У меня же эта операция была только в обработчике PIT. Сделал так же и всё заработало. Вообщем сам виноват.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...