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、创建三个线程,两个接收,一个发送

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");
- }
- }
- }
- }