我们之前讲过信号量、消息队列、事件标志组,它们都可以实现任务间的通信和同步。本节我们讲解任务通知(Task Notifications),它是freeRTOS中实现的另一种通信和同步的方法,在一定程度上可以代替信号量、消息队列、事件标志组的功能;而且任务通知所需要的资源更少、执行速度更快。

1)freeRTOS中的任务通知

freeRTOS的任务通知,和信号量、消息队列、事件标准组一样,也是一种可以阻塞任务的事件。

每个任务对应有一个任务通知,任务可以在等待自己对应的任务通知时被阻塞,向该任务通知发送通知可以唤醒该任务;

任务通知的值,就是任务控制块结构体中的变量ulNotifiedValue,32bit;这也说明了任务通知是和任务一一对应的;

更新任务通知的值ulNotifiedValue,可以有多种方式:覆盖旧通知值、(如果上次未处理则)不覆盖旧通知值、更新任务通知的某几个bit、增加任务通知值。

灵活运用更新任务通知值的方法,可以使任务通知实现信号量、消息队列、事件标志组等的功能。

例如:向某个任务发送一个信号量,可以通过将该任务的通知值加1实现;获取信号量,可以将该任务的通知值减1实现;

向某个任务的通知值中写入一个数据,相对于向该任务发送了一个长度为1的消息;

设置某个任务通知值的bit0~bit31,可以实现事件标志组。

任务通知实现的信号量、消息队列、事件标志组,比之前讲过的实现方法占用内存更少、执行速度更快;但是,正是由于任务通知是和任务一一对应的,而且它只有一个32bit的变量ulNotifiedValue来传递信息,使用时有一些限制:

a) 不能同时使用任务通知来传递多个信息,也就是说同一时间对于某个任务,只能实现一个“信号量”或“消息队列”或“事件标志组”的作用;

b) 使用任务通知时,不支持发送信息的超时等待(这一点和之前讲过的信号量、消息队列、事件标志组不同,它们是可以支持超时等待的)。

使用任务通知功能,需要在FreeRTOS.h文件中,将configUSE_TASK_NOTIFICATIONS宏定义为1。

2)常用的任务通知函数

任务通知的值ulNotifiedValue是每个任务在创建时,任务控制块中就生成的,所以不需用户定义(这和信号量、消息队列、事件标志组等是不同的,它们都需要定义后再使用)。

几个常用的任务通知函数如下:

发送通知:

BaseType_t xTaskNotify(TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction ); //三个参数依次为:任务句柄、任务通知值、任务通知值更新方法;

其中,最后一个参数,任务通知值更新方法,是一个枚举值,在task.h文件中定义:

typedef enum

{

eNoAction = 0, //未使用,不更新

eSetBits, //更新指定的bit为1

eIncrement, //通知值加1

eSetValueWithOverwrite, //覆写的方式更新通知值

eSetValueWithoutOverwrite //不覆写通知值

} eNotifyAction;

BaseType_t xTaskNotifyGive( TaskHandle_t xTaskToNotify ); //发送通知,参数为任务句柄,对应任务通知值加1

BaseType_t xTaskNotifyAndQuery( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t * ulPreviousNotificationValue); //该函数和xTaskNotify很相似,多一个最后的参数,用来返回更新前的通知值

上述几个发送任务通知的函数都是在任务中使用的,如果需要在中断中使用,需要用带后缀ISR的一套函数。

获取通知:

uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait );

/*获任务通知;xClearCountOnExit参数为pdFALSE时任务通知值减1(类似计数信号量),参数为pdTRUE时任务通知值清零(类似二值信号量);该函数更适用于任务通知用作信号量时*/

BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t * pulNotificationValue, TickType_t xTicksToWait );

/*获取任务通知,函数在执行前,将ulBitsToClearOnEntry的值取反后,和通知值相与来改变通知值;在函数退出前,将ulBitsToClearOnExit的值取反后,和通知值相与来改变通知值;参数pulNotificationValue用来保存任务通知值,参数xTicksToWait为等待时间;该函数更适用于任务通知作为消息队列或者事件标志组时*/

3)编程试验1——任务通知模拟信号量

我们先来编程试验使用任务通知模拟信号量的功能。

在cubemx中配置时,使能任务通知功能:

也可以在keil工程里自己创建宏定义:

创建三个任务:

任务的实现如下:

Task02每1s发送一个任务通知,Task03则循环等待任务通知,defaultTask没有使用:

这个程序的输出如下所示:

尽管Task03的优先级最高,但是由于任务通知的阻塞作用,起到了信号量的作用,task02每发送一次任务通知,task03才能打印一次输出:

4)编程试验2——任务通知模拟事件标志组

我们仍然在上一个例子的基础上改写,如下图所示:

Task02每隔1s发送一个任务通知,先置bit0为1,再置bit1为1:

Task03循环等待通知,等待函数中,进入时不改变通知值,退出时将通知值清零;等到通知时,将当前的通知值打印输出:

这个程序运行结果如下所示,task03按预期打印出了1和2的通知:

好了,本节的内容就到这里了。

如果觉得有用可以关注作者微信号“小白白学电子”,在公众号可以找到代码和资料下载地址:

【FreeRTOS】12 任务通知——更省资源的同步方式相关推荐

  1. EXCEL插件制作闪信霸屏通知让通知更高效

    说起快递通知提醒大家都不陌生,经常购物的小伙伴基本天天都有各家快递给发送的取货通知短信.丰巢及各家快递柜的迅速普及极大的减轻了送货员的时间和精力,取件通知短信的更多使用也带来了各种问题.比如短信被手机 ...

  2. 如何消耗更少资源?Unity优化技巧(上)

    什么是优化? 为了达成相同目标,寻求并采用消耗更少资源的办法的过程 对游戏来说通过特别的技巧,在实现相同的表现效果.流畅度的前提下对硬件机能的需求更低.更平民化.或者在相同性能的平台上,实现更好的画面 ...

  3. IntelliJ IDEA 12.0.3 更新版发布

    IntelliJ IDEA 12.0.3 更新版发布了,该版本更多还是 bug 的修复,详情请看发行说明. Android   IDEA-95988 (Usability Problem) Expor ...

  4. 消息通知系统详解1---通讯方式

    消息通知系统详解1-通讯方式 消息通知系统详解2-后端设计 消息通知系统详解3-Netty 消息通知系统详解4-整合Netty和WebSocket 目录 什么是消息通知系统 系统特性 通讯方式 短连接 ...

  5. im和音视频开发哪个更好_如何阅读成为更好的开发者的方式

    im和音视频开发哪个更好 by nolan grace 通过诺兰·格雷斯 如何阅读成为更好的开发者的方式 (How to read your way to becoming a better deve ...

  6. Unity游戏开发——新发教你做游戏(三):3种资源加载方式

    文章目录 一.前言 二.Unity的目录结构规范 1.Resources(不是很推荐把资源放这个目录) 2.RawAssets(存放生资源) 3.GameRes(存放熟资源) 4.StreamingA ...

  7. 使用Grunt实现资源自动化同步

    同步美术.策划资源是日常开发中极为频繁的事情,shawn借用Web前端的一些思想和工具,将Grunt自动化框架引入Cocos Creator项目,可以实现相对高效地将图片.动画.配置.音效等游戏资源导 ...

  8. 刚刚,华为云找到了更安全更卫生的乘坐电梯方式

    马上申请无接触智能电梯 疫情当下,电梯已成为易感染高危区,为了避免人与电梯按键的接触,降低病毒感染风险,华为云IoT联合旺龙智能推出无接触智能乘梯解决方案,基于园区物联网平台实现电梯.门禁.摄像头.蓝 ...

  9. 巴里克黄金CEO:加密货币并不是比黄金更好的价值储存方式

    据新浪财经消息,全球最大黄金生产商巴里克黄金公司CEO马克-布里斯托(Mark Bristow)周四驳斥了加密货币是比传统黄金更好的价值储存方式的观点. 比特币牛派认为,这种数字货币的有限供应及其令人 ...

最新文章

  1. windows 下 sublime Text3 做 Python 编辑器
  2. 使用Python解析nginx日志文件
  3. Spring AOP编程-传统aop开发总结
  4. [Python人工智能] 二十八.Keras深度学习中文文本分类万字总结(CNN、TextCNN、LSTM、BiLSTM、BiLSTM+Attention)
  5. Oracle常用字符串操作
  6. windows安装程序创建_如何在Windows上创建已安装程序的列表
  7. 每日一题:leetcode190.颠倒二进制位
  8. perl里面隐式的继承
  9. 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  10. Audio播放流程(一)---MediaPlayer流程
  11. OpenCV实现摄像机标定和像素转换,surf寻找特征点,FLANN匹配算子进行匹配
  12. 在知网下载硕士的论文PDF格式无需安装CAJ软件
  13. 激光锡焊在SMA连接器领域的应用
  14. 计算机考研专业课数字,2020北京航空航天大学计算机考研初试专业课经验
  15. 【ATSC】ATSC数字测试专用ATSC Frequency
  16. 【小程序从0到1】小程序常用组件一览
  17. (3)聚类算法之DBSCAN算法
  18. 学习记录553@flowable候选人机制
  19. 【python】Python实现模拟按键切换浏览器标签
  20. github网页打不开

热门文章

  1. 如何用木板做桥_用木板做桥 工具跟做家具的一样 大小跟办公桌差不多大 能承重 参加比赛 主要是承重 给个设计方案...
  2. 网络攻防|CVE-2021-42287、CVE-2021-42278域内提权
  3. 【LeetCode - Java】14. 最长公共前缀 (简单)
  4. linux 对称加密命令,linux安全和加密篇(三)—openssl工具和CA证书
  5. 对“佩戴低度数近视镜可延缓近视发展?”的一些疑问
  6. NBUT1225 NEW RDSP MODE I(快速幂,规律)
  7. java计算机毕业设计网上宠物商城管理系统源码+系统+数据库+lw文档+mybatis+运行部署
  8. 图片放大不模糊,如何实现?
  9. CUDA编程——GPU架构,由sp,sm,thread,block,grid,warp说起
  10. 解读CUDA Compiler Driver NVCC - Ch.5