您的位置:首页 > 其它

嵌入式FreeRTOS系统,在中断中调用FreeRTOS系统的API函数

2017-08-19 10:15 393 查看
作为在中断中调用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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: