Впервые для себя портирую ОС.
Так как этой комбинации порта не прилагается, то с горем пополам собрал из имеющихся портов своё.
Код
static void prvSetupTimerInterrupt( void )
{
AT91PS_PITC pxPIT = AT91C_BASE_PITC;
extern void ( vPortPreemptiveTick )( void );
AT91F_AIC_ConfigureIt( AT91C_BASE_AIC, AT91C_ID_SYS, AT91C_AIC_PRIOR_HIGHEST, portINT_LEVEL_SENSITIVE, ( void (*)(void) ) vPortPreemptiveTick );
pxPIT->PITC_PIMR = portPIT_ENABLE | portPIT_INT_ENABLE | portPIT_COUNTER_VALUE;
AT91F_AIC_EnableIt( AT91C_BASE_AIC, AT91C_ID_SYS );
}
Код
vPortPreemptiveTick
portSAVE_CONTEXT ; Save the context of the current task.
LDR R0, =vTaskIncrementTick; Increment the tick count - this may wake a task.
mov lr, pc
BX R0
LDR R0, =vTaskSwitchContext; Select the next task to execute.
mov lr, pc
BX R0
LDR R14, =AT91C_BASE_PITC; Clear the PIT interrupt
LDR R0, [R14, #PITC_PIVR ]
LDR R14, =AT91C_BASE_AIC; Mark the End of Interrupt on the AIC
STR R14, [R14, #AIC_EOICR]
portRESTORE_CONTEXT ; Restore the context of the selected task.
Запуск приложения
Код
static void vHW( void *pvParameters )
{
( void ) pvParameters;
for(;; )
{
var++;
}
}
int main (void)
{
xTaskCreate(vHW, "Hi", 512, NULL, tskIDLE_PRIORITY + 1, NULL );
vTaskStartScheduler();
}
При запуске в симуляторе Tick вызывается как и следует, всё остальное время выполнение висит на IRQ_Handler. В IdleTask дабагер не видит следов.
Где искать проблему?
Заранее спасибо!