基于STM32F407的FreeRTOS学习笔记(12)

在上一期内容中我们简单的介绍了任务通知的几个函数以及简单的使用了任务通知来实现两个信号之间的通信。
本期我们将利用任务通知来模拟三种方式的任务间通信。
信号量
在我们介绍信号量的文章中介绍过,信号分为二进制信号量和计数信号量。
接着我们使用任务通知来模拟这两项功能。
二进制信号量可以看作长度为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); }}

NB物联网智能电能表解决方案的说明
最新电子书拆解评测系列报道(三):某些产品仍存在画面亮度低的问题
HDMI的TMDS信号是什么?HDMI带宽和TMDS的关系分析
新闻:海康威视董事被查 雷军投资小鹏汽车
首届全国智能制造(中国制造2025)创新创业大赛华北区决赛启动
基于STM32F407的FreeRTOS学习笔记(12)
小米11 Pro发布,起售价4999元
OPPO Reno2和Enco Q1已上线OPPO官网并开启预约
全自动洗衣机原理电路图
中国移动4G基站突破200万个
工信部王志军:芯片行业已出现盲目投资和烂尾项目
关于运算放大器增益误差设计的分析和介绍
“灯泡价格”问题渐行渐远 2012 LED照明市场值得期待
新无人机移动回收系统使无人机一直处于移动状态
电影院使用的三色激光,家用投影中有同款吗?
华为mate10,荣耀note9曝光,华为三旗舰来临
慈善机构锁定区块链 区块链为内容定价
聚焦新能源智能制造 烽禾升多款自研设备将首发亮相
继电器的常见类型
降压型转换器提高效率、降低功率损耗在供应线中