static void prvSetupTimerInterrupt( void ) { EIC_IRQInitTypeDef EIC_IRQInitStructure; TB_InitTypeDef TB_InitStructure; /* Setup the EIC for the TB. */ EIC_IRQInitStructure.EIC_IRQChannelCmd = ENABLE; EIC_IRQInitStructure.EIC_IRQChannel = TB_IRQChannel; EIC_IRQInitStructure.EIC_IRQChannelPriority = 1; EIC_IRQInit(&EIC_IRQInitStructure); /* Setup the TB for the generation of the tick interrupt. */ TB_InitStructure.TB_Mode = TB_Mode_Timing; TB_InitStructure.TB_CounterMode = TB_CounterMode_Down; TB_InitStructure.TB_Prescaler = portPRESCALE - 1; TB_InitStructure.TB_AutoReload = ( ( configCPU_CLOCK_HZ / portPRESCALE ) / configTICK_RATE_HZ ); TB_Init(&TB_InitStructure); /* Enable TB Update interrupt */ TB_ITConfig(TB_IT_Update, ENABLE); /* Clear TB Update interrupt pending bit */ TB_ClearITPendingBit(TB_IT_Update); /* Enable TB */ TB_Cmd(ENABLE); }
__arm void vPortPreemptiveTick( void ) { /* Increment the tick counter. */ if( xTaskIncrementTick() != pdFALSE ) { /* Select a new task to execute. */ vTaskSwitchContext(); } TB_ClearITPendingBit( TB_IT_Update ); }
__arm void vPortPreemptiveTick( void ) { /* Increment the tick counter. */ vTaskIncrementTick(); /* The new tick value might unblock a task. Ensure the highest task that is ready to execute is the task that will execute when the tick ISR exits. */ #if configUSE_PREEMPTION == 1 vTaskSwitchContext(); #endif TB_ClearITPendingBit( TB_IT_Update ); }