一、任务通知
1、FreeRTOS从V8.2.0版本开始提供任务通知功能,每个任务都有一个32位的通知值,在大多数情况下,任务通知可以替代二值信号量、计数信号量、事件组,也可以代替长度为1的队列。
2、相较于以前使用FreeRTOS内核通信的资源,必须创建队列、二值信号量、计数信号量或者事件组的情况,使用任务通知更加灵活。
3、但是只有一个任务接收通知,因为必须指定接收通知的任务。且只有等待通知的任务可以被阻塞,发送通知的任务在任何情况下都不会因为发送失败而进入阻塞态。
二、参数配置
1、配置RCC、USART1、时钟84M
2、配置SYS,将Timebase Source修改为除滴答定时器外的其他定时器。
3、初始化LED的两个引脚、两个按键引脚
4、开启FreeRTOS,v1与v2版本不同,一般选用v1即可
5、打开以下功能,系统默认打开
6、创建三个线程,两个接收,一个发送
三、API
1、向指定的任务发送一个任务通知:osSignalSet
2、等待任务通知:osSignalWait
四、代码解释
①发送
#define KEY1_EVENT (0x01<<0)
#define KEY2_EVENT (0x01<<1)
void Send_thread_entry(void const * argument)
{
for(;;)
{
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8)==0)
{
printf("key1 down!\n");
osSignalSet(Receive1_stackHandle,KEY1_EVENT);
}
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_9)==0)
{
printf("key2 down!\n");
osSignalSet(Receive2_stackHandle,KEY2_EVENT);
}
osDelay(1000);
}
}
②接收1
void Receive1_thread_entry(void const * argument)
{
for(;;)
{
osEvent event=osSignalWait(KEY1_EVENT,osWaitForever);
if(event.status==osEventSignal)
{
if(event.value.signals & KEY1_EVENT)
{
printf("receive1 task\n");
}
}
}
}
③接收2
void Receive2_thread_entry(void const * argument)
{
for(;;)
{
osEvent event=osSignalWait(KEY2_EVENT,osWaitForever);
if(event.status==osEventSignal)
{
if(event.value.signals & KEY2_EVENT)
{
printf("receive1 task\n");
}
}
}
}