eagle_avr 发表于 2019-5-24 11:56:12

FreeRTOS “任务通知值” 的一些疑问

本帖最后由 eagle_avr 于 2019-5-24 14:09 编辑

在看正点原子的《STM32F407 FreeRTOS开发手册_V1.1》的任务通知部分时,用任务通知模拟计数型信号量,代码中一个任务扫描按键,发送任务通知;另一个任务获取该通知。
作者说在获取通知的任务里,获取到的任务通知值要减一才是当前任务的任务通知值。为何?以下是代码
//释放计数型信号量任务函数
void SemapGive_task(void *pvParameters)
{
        u8 key,i=0;
        while(1)
        {
                key=KEY_Scan(0); //扫描按键
                if(SemapTakeTask_Handler!=NULL)
                {
                        switch(key)
                        {
                                case WKUP_PRES:
                                        xTaskNotifyGive(SemapTakeTask_Handler);//发送任务通知 (1)
                                break;
                        }
                }
                i++;
                if(i==50)
                {
                        i=0;
                        LED0=!LED0;
                }
                vTaskDelay(10); //延时 10ms,也就是 10 个时钟节拍
        }
}

//获取计数型信号量任务函数
void SemapTake_task(void *pvParameters)
{
        u8 num;
        uint32_t NotifyValue;
        while(1)
        {
                NotifyValue=ulTaskNotifyTake(pdFALSE,portMAX_DELAY);//获取任务通知 (2)
                num++;
                LCD_ShowxNum(166,111,NotifyValue-1,3,16,0); //显示当前任务通知值 (3)
                LCD_Fill(6,131,233,313,lcd_discolor); //刷屏
                LED1=!LED1;
                vTaskDelay(1000); //延时 1s,也就是 1000 个时钟节拍
        }
}

snic_k 发表于 2019-5-24 18:53:13

你给的图片中不是已经说得很明白了吗?

qwe2231695 发表于 2019-5-24 21:17:20

Semaphore 信号量,初衷是用来管理共享资源。比如一个厕所信号量,有5个茅坑。 进去一个人会减1. 只要这个信号量大于0,就代表有可用座位,允许访问厕所。

taojie 发表于 2019-6-7 17:11:49

是要减去1的, 才是当前的通知值
页: [1]
查看完整版本: FreeRTOS “任务通知值” 的一些疑问