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

来源:互联网 发布:富通天下软件下载 编辑:程序博客网 时间:2024/06/08 03:58

作为在中断中调用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);}
原创粉丝点击