zoukankan      html  css  js  c++  java
  • FreeRTOS 任务通知模拟二值信号量

    FreeRTOS官方统计,使用任务通知替代二值信号量的时候,任务解除阻塞的时间要快45%,并且需要的RAM也更少

    举例

    void DataProcess_task(void *pvParameters)
    {
        while(1)
        {
            NotifyValue=ulTaskNotifyTake(pdTRUE,portMAX_DELAY); //获取任务通知
            if(NotifyValue==1) //清零之前的任务通知值为1,说明任务通知有效
            {
                for(i = 0; i < (USART_RX_STA&0x3fff) + 1; i++)
                {
                    printf("%c", USART_RX_BUF[i]);
                }
    
                USART_RX_STA=0;
                memset(USART_RX_BUF,0,USART_REC_LEN); //串口接收缓冲区清零
            }
            else
            {
                vTaskDelay(10); //延时10ms,也就是10个时钟节拍 
            }
        }
    }
    
    void USART3_IRQHandler(void)
    {
        //发送任务通知
        if((USART_RX_STA&0x8000)&&(DataProcess_Handler!=NULL)) //接收到数据,并且接收任务通知的任务有效
        {
            vTaskNotifyGiveFromISR(DataProcess_Handler,&xHigherPriorityTaskWoken); //发送任务通知
            portYIELD_FROM_ISR(xHigherPriorityTaskWoken); //如果需要的话进行一次任务切换
        }
    }

    运行结果
    1

  • 相关阅读:
    设计模式之装饰器模式
    设计模式之原型模式
    设计模式之策略模式
    设计模式之适配器模式
    设计模式之注册模式
    wordpress中add_action和add_filter
    工厂模式
    设计模式之命令链模式
    观察者模式
    工厂模式
  • 原文地址:https://www.cnblogs.com/zhangxuechao/p/11709428.html
Copyright © 2011-2022 走看看