Все сделал как положено, вот пример стартовой задачи:
Код
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);
}
}
}
{
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
}
{
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.