在上一期内容中我们简单的介绍了任务通知的几个函数以及简单的使用了任务通知来实现两个信号之间的通信。
本期我们将利用任务通知来模拟三种方式的任务间通信。
信号量
在我们介绍信号量的文章中介绍过,信号分为二进制信号量和计数信号量。
接着我们使用任务通知来模拟这两项功能。
二进制信号量可以看作长度为1的队列,我们不关心其值为多少,只关心它的状态。


在直达任务通知中我们可以用xTaskNotifyGive来模拟二进制信号量的释放以及ulTaskNotifyTake()来模拟二进制信号量的读取。
在ulTaskNotifyTake()中需要注意的是,我们需要设置一个参数用来确定我们模拟的是二进制信号量还是计数信号量。


代码测试
void Mid_Task(void * pvParameters)//参数为 void * pvParameters
{
while(1)
{
if(KEY_Scan(0)==1)
{
printf('Key_Pressrn');
xTaskNotifyGive(High_Handler);//传入任务函数句柄,模拟信号量释放
}
}
vTaskDelay(10);
}
void High_Task(void * pvParameters)
{
BaseType_t err;
while(1)
{
err = ulTaskNotifyTake(pdFALSE,10);//读取后清零,模拟二进制信号量
if(err == pdTRUE)
{
printf('Recieve Message!rn');
}
vTaskDelay(10);
}
}
模拟二进制信号量成功。
之后,我们将接收的函数中的pdFALSE修改为pdTRUE,这样子我们就可以模拟我们的计数信号量了。
这里就不作演示了,但是要注意的是,只用这样子的模拟二进制信号量也要注意优先级反转问题,关于优先级反转的问题可以参考公众号中的关于二进制信号量的文章。
事件组
合理的运用RTOS中的事件组可以很好的处理许多事件,在事件组的介绍中我们说过,我们常用的事件组可以做到24位事件位。而在直达任务通知中,我们也同样可以指定某些位的改变来实现事件组的效果。

我们可以修改xTaskNotify中的eAction来将通知值作为事件组,修改特定位来实现事件位的效果。
代码测试
复制
void Mid_Task(void * pvParameters)//参数为 void * pvParameters
{
int i = 0;
while(1)
{
if(KEY_Scan(0)==1)
{
printf('Key_Press keynumber : 1rn');
xTaskNotify( (TaskHandle_t) High_Handler,//目标任务句柄
(uint32_t) 0x04,//第二位 00000100
(eNotifyAction) eSetBits);//位设置模式,模拟事件组
}
if(KEY_Scan(0)==2)
{
printf('Key_Press keynumber : 2rn');
xTaskNotify( (TaskHandle_t) High_Handler,//目标任务句柄
(uint32_t) 0x08,//第三位 00001000
(eNotifyAction) eSetBits);//位设置模式,模拟事件组
}
}
vTaskDelay(10);
}
void High_Task(void * pvParameters)
{
BaseType_t err;
uint32_t number;//存放通知值
uint32_t Value; //模拟事件组
while(1)
{
err = xTaskNotifyWait( (uint32_t) 0x0000,//不清理
(uint32_t) 0xffff,//清理当前
(uint32_t*) &number,//接收任务值
(TickType_t) 10 );//等待事件
Value = Value | number ; //获得事件位
if((Value&(0x08+0x04)) == (0x08+0x04))
{
printf('KEY1 and KEY2 have Pressedrn');
Value = 0;//事件组清零
}
vTaskDelay(10);
}
}
上一篇:stm32一个强制类型转换死机bug解读
下一篇:基于STM32F407的FreeRTOS学习笔记(8)
推荐阅读最新更新时间:2026-03-23 04:52
- LDK120M12R 1.2V低压降稳压器典型应用(可调版)电路
- EVB-UTC2000-DFP、EVK-UTC2000 评估套件基于 UTC2000 USB 3.0/2.0 Type-A,即插即用 Type-C DFP
- LTC3219 演示板、250mA 通用九通道 LED 驱动器
- DC919A-D,LTC2204 CMOS 输出演示板,直流输入,40Msps 16 位 ADC,DC
- AD8618ARZ-REEL 二阶低通滤波器运算放大器的典型应用电路
- 使用 NXP Semiconductors 的 PCA9511A 的参考设计
- LT3091MPDE 恒流恒压实验室电源的典型应用
- ADR392B 4.096 Vout 微功率、低噪声精密电压基准的典型应用
- LT3470HDDB 5V 降压转换器的典型应用电路
- 使用 Diodes Incorporated 的 AZ7042ZTR-E1 的参考设计

基于 X-Cube-FreeRTOS_Heap4 和 CubeMX 生成 UCPD 项目介绍
基于开发板frdmmcxn947利用lwip_httpsrv_freertos程序开发
现代雷达系统的信号设计
BFR340T






京公网安备 11010802033920号