作为在中断中调用FreeRTOS系统的API函数的参考,disp_str()是显示屏的显示函数会将传入的字符串进行显示。
void TIM5_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE); //ʱÖÓʹÄÜ
TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_Prescaler = psc;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure);
TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 8; //保证优先级受FreeRTOS系统的控制
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM5,ENABLE);
}
extern QueueHandle_t Message_Queue;
extern void disp_str(u8* str);
void TIM5_IRQHandler(void)
{
u8 *buffer;
BaseType_t xTaskWokenByReceive = pdFALSE;
BaseType_t err;
if(TIM_GetITStatus(TIM5,TIM_IT_Update) == SET)
{
buffer = mymalloc(USART_REC_LEN);
if(Message_Queue != NULL) ¦
{
memset(buffer,0,USART_REC_LEN);
err = xQueueReceiveFromISR(Message_Queue,buffer,&xTaskWokenByReceive); //保证需要进行任务切换的时候进行任务切换
//xTaskWokenByReceive的具体数值将由函数的返回值确定
if(err == pdTRUE)
{
disp_str(buffer);
}
}
myfree(buffer);
portYIELD_FROM_ISR(xTaskWokenByReceive); //根据xTaskWokenByReceive的值决定系统是否要进行任务的切换,结合上一步对xTaskWokenByReceive的调用刚好实现,让系统决定中断决定中断疏忽局处理完成之后是否进行任务的切换。
}
TIM_ClearITPendingBit(TIM5,TIM_IT_Update);
}