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

作为在中断中调用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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Achou.Wang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值