基于STM32F407的FreeRTOS学习笔记(12)
2024-04-02 来源:elecfans
在上一期内容中我们简单的介绍了任务通知的几个函数以及简单的使用了任务通知来实现两个信号之间的通信。
本期我们将利用任务通知来模拟三种方式的任务间通信。
信号量
在我们介绍信号量的文章中介绍过,信号分为二进制信号量和计数信号量。
接着我们使用任务通知来模拟这两项功能。
二进制信号量可以看作长度为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);
}
}
- [STM32F407系列学习]按键开关控制单个数码管加减计数
- STM32F407 ADC 模式详解:单次转换、连续转换、扫描模式、非扫描模式
- STM32F407 ------ 使用定时器实现精确延时
- stm32f103和stm32f407的GPIO口模式设置以及相互对应的关系
- SPI 串行Flash闪存W25Q128FV 的使用(STM32F407)_硬件篇
- SPI 串行Flash闪存W25Q128FV 的使用(STM32F407)_基础篇
- freeRTOS V10.0.1移植到STM32F407标准库 - 环境Keil5
- 基于STM32F407和OV7670的低端视频监控系统
- STM32F407工程移植--STM32F401,F400
- 在stm32f407上移植openharmony遇到的问题
- 六大全新产品系列推出,MCX A微控制器家族迎来创新
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 模组复用与整机重测在SRRC、CCC、CTA/NAL认证中的实践操作指南
- 有源晶振与无源晶振的六大区别详解
- 英飞凌持续巩固全球微控制器市场领导地位
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- 从控制到系统:TI利用边缘AI重塑嵌入式MCU的边界
- 蓝牙信道探测技术原理与开发套件实践
- Microchip 推出生产就绪型全栈边缘 AI 解决方案,赋能MCU和MPU实现 智能实时决策
- LoRa、LoRaWAN、NB-IoT与4G DTU技术对比及工业无线方案选型分析




