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 个时钟节拍
}
}
你给的图片中不是已经说得很明白了吗? Semaphore 信号量,初衷是用来管理共享资源。比如一个厕所信号量,有5个茅坑。 进去一个人会减1. 只要这个信号量大于0,就代表有可用座位,允许访问厕所。 是要减去1的, 才是当前的通知值
页:
[1]