FreeRTOS学习之路,以STM32F103C8T6为实验MCU(2-9:任务通知)

学习之路主要为FreeRTOS操作系统在STM32F103(STM32F103C8T6)上的运用,采用的是标准库编程的方式,使用的IDE为KEIL5。

注意!!!本学习之路可以通过购买STM32最小系统板以及部分配件的方式进行学习,也可以通过Proteus仿真的方式进行学习。

后续文章会同时发表在个人博客(jason1016.club)、CSDN;

视频会发布在bilibili(UID:399951374)

一、概念

FreeRTOS 新增了任务通知(Task Notifictions)这个功能,可以使用任务通知来代替信号量、消息队列、事件标志组等这些东西

#define configUSE_TASK_NOTIFICATIONS            1                       //为1时开启任务通知功能,默认开启

任务通知是一个事件,假如某个任务通知的接收任务因为等待任务通知而阻塞的话,向这个接收任务发送任务通知以后就会解除这个任务的阻塞状态。也可以更新接收任务的任务通知值,任务通知可以通过如下方法更新接收任务的通知值:

● 不覆盖接收任务的通知值(如果上次发送给接收任务的通知还没被处理)。

● 覆盖接收任务的通知值。

● 更新接收任务通知值的一个或多个 bit。

● 增加接收任务的通知值。

限制条件:

● FreeRTOS 的任务通知只能有一个接收任务,其实大多数的应用都是这种情况。

● 接收任务可以因为接收任务通知而进入阻塞态,但是发送任务不会因为任务通知发送失败而阻塞。

二、发送任务通知

 /* ***************************任务级*************************************************************************** */
 //可简单替代队列操作或事件标志组 xTaskNotify() 带有通知值并且不保留接收任务原通知值
 BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify, //xTaskToNotify: 任务句柄,指定任务通知是发送给哪个任务的。
                         uint32_t ulValue,           //ulValue: 任务通知值。
                         eNotifyAction eAction )     //eAction: 任务通知更新的方法,eNotifyAction 是个枚举类型,在文件 task.h 中有如下定义:
                                                         typedef enum
                                                         {eNoAction = 0,
                                                         eSetBits, //更新指定的 bit
                                                         eIncrement, //通知值加一
                                                         eSetValueWithOverwrite, //覆写的方式更新通知值
                                                         eSetValueWithoutOverwrite //不覆写通知值
                                                         } eNotifyAction; 
                                                         此参数可以选择枚举类型中的任意一个,不同的应用环境其选择也不同。
/*返回值:
    pdFAIL: 当参数 eAction 设置为 eSetValueWithoutOverwrite 的时候,如果任务通知值没有更新成功就返回 
    pdFAIL。pdPASS: eAction 设置为其他选项的时候统一返回 pdPASS。*/


//可替代二值信号量以及计数信号量 xTaskNotifyGive() 不带通知值并且不保留接收任务的通知值,此函数会将接收任务的通知值加一
BaseType_t xTaskNotifyGive( TaskHandle_t xTaskToNotify ); //xTaskToNotify: 任务句柄,指定任务通知是发送给哪个任务的。
/*返回值:
    pdPASS: 此函数只会返回 pdPASS。*/
    
    
// xTaskNotifyAndQuery() 带有通知值并且保留接收任务的原通知值
BaseType_t xTaskNotifyAndQuery ( TaskHandle_t xTaskToNotify,  //xTaskToNotify: 任务句柄,指定任务通知是发送给哪个任务的。
                                 uint32_t ulValue,            //ulValue: 任务通知值。
                                 eNotifyAction eAction,       //eAction: 任务通知更新的方法。
                                 uint32_t * pulPreviousNotificationValue); //pulPreviousNotificationValue:用来保存更新前的任务通知值。
/*返回值:
    pdFAIL: 当参数 eAction 设置为 eSetValueWithoutOverwrite 的时候,如果任务通知值没有更新成功就返回 
    pdFAIL。pdPASS: eAction 设置为其他选项的时候统一返回 pdPASS。*/ 
    
    
/* ***************************中断级****************************************************************************** */  
 // xTaskNotifyFromISR() 带有通知值并且不保留接收任务原通知值
 BaseType_t xTaskNotifyFromISR( TaskHandle_t xTaskToNotify, //xTaskToNotify: 任务句柄,指定任务通知是发送给哪个任务的。
                                uint32_t ulValue,           //ulValue: 任务通知值。
                                eNotifyAction eAction       //eAction: 任务通知更新的方法,定义参考上述
                                BaseType_t * pxHigherPriorityTaskWoken ); //pxHigherPriorityTaskWoken: 记退出此函数以后是否进行任务切换,这个变量的值函数会自动设置的,用户不用进行设置,用户只需要提供一个变量来保存这个值就行了。当此值为 pdTRUE 的时候在退出中断服务函数之前一定要进行一次任务切换。
/*返回值:
    pdFAIL: 当参数 eAction 设置为 eSetValueWithoutOverwrite 的时候,如果任务通知值没有更新成功就返回 
    pdFAIL。pdPASS: eAction 设置为其他选项的时候统一返回 pdPASS。*/


// vTaskNotifyGiveFromISR() 不带通知值并且不保留接收任务的通知值,此函数会将接收任务的通知值加一
BaseType_t vTaskNotifyGiveFromISR( TaskHandle_t xTaskToNotify,              //xTaskToNotify: 任务句柄,指定任务通知是发送给哪个任务的。
                                   BaseType_t * pxHigherPriorityTaskWoken );//pxHigherPriorityTaskWoken: 记退出此函数以后是否进行任务切换,这个变量的值函数会自动设置的,用户不用进行设置,用户只需要提供一个变量来保存这个值就行了。当此值为 pdTRUE 的时候在退出中断服务函数之前一定要进行一次任务切换。
/*返回值:无*/


// xTaskNotifyAndQueryFromISR() 带有通知值并且保留接收任务的原通知值
BaseType_t xTaskNotiryAndQueryFromISR ( TaskHandle_t xTaskToNotify,  //xTaskToNotify: 任务句柄,指定任务通知是发送给哪个任务的。
                                         uint32_t ulValue,            //ulValue: 任务通知值。
                                         eNotifyAction eAction,       //eAction: 任务通知更新的方法。
                                         uint32_t * pulPreviousNotificationValue,  //pulPreviousNotificationValue:用来保存更新前的任务通知值。
                                         BaseType_t * pxHigherPriorityTaskWoken ); //pxHigherPriorityTaskWoken: 记退出此函数以后是否进行任务切换,这个变量的值函数会自动设置的,用户不用进行设置,用户只需要提供一个变量来保存这个值就行了。当此值为 pdTRUE 的时候在退出中断服务函数之前一定要进行一次任务切换。
/*返回值:
    pdFAIL: 当参数 eAction 设置为 eSetValueWithoutOverwrite 的时候,如果任务通知值没有更新成功就返回 
    pdFAIL。pdPASS: eAction 设置为其他选项的时候统一返回 pdPASS。*/                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              

三、获取任务通知

//函数:ulTaskNotifyTake() //获取任务通知,可以设置在退出此函数的时候将任务通知值清零或者减一。当任务通知用作二值信号量或者计数信号量的时候使用此函数来获取信号量。
uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit,  //xClearCountOnExit: 参数为 pdFALSE 的话在退出函数 ulTaskNotifyTake()的时候任务通知值减一,类似计数型信号量。当此参数为 pdTRUE 的话在退出函数的时候任务任务通知值清零,类似二值信号量。
                           TickType_t xTicksToWait );     //xTickToWait: 阻塞时间。
/*返回值:任何值 : 任务通知值减少或者清零之前的值。*/

//函数:xTaskNotifyWait() //等待任务通知,比 ulTaskNotifyTak()更为强大,全功能版任务通知获取函数。
BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry,     //ulBitsToClearOnEntry:当没有接收到任务通知的时候将任务通知值与此参数的取反值进行按位与运算,当此参数为 0xffffffff 或者 ULONG_MAX 的时候就会将任务通知值清零。
                            uint32_t ulBitsToClearOnExit,      //ulBitsToClearOnExit:如果接收到了任务通知,在做完相应的处理退出函数之前将任务通知值与此参数的取反值进行按位与运算,当此参数为 0xffffffff 或者ULONG_MAX 的时候就会将任务通知值清零。
                            uint32_t * pulNotificationValue,   //pulNotificationValue:此参数用来保存任务通知值。
                            TickType_t xTicksToWait );         //xTickToWait: 阻塞时间。
/*返回值:
    pdTRUE: 获取到了任务通知。
    pdFALSE: 任务通知获取失败。*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/192164.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

非参数估计与参数估计的区别,以及详细列举了常用的非参数估计方法和参数估计方法,一网打尽非参数估计与参数估计!!!

文章目录 前言一、非参数估计与参数估计的区别二、常用的非参数估计方法三、常用的参数估计方法总结 前言 非参数估计和参数估计是统计学中的两种不同的估计方法。 一、非参数估计与参数估计的区别 参数估计是指,对于已知分布形式的数据,根据样本数据…

HTML5原生视频播放器组件video的videocontrolslist属性详解

HTML5提供了内置的视频播放控件,其中videocontrolslist是其中一个很有用的属性。videocontrolslist属性可以用于告诉浏览器在视频播放过程中应该显示哪些默认的用户界面控件。下面我们将从几个方面来介绍videocontrolslist的详细使用。 一、启用videocontrolslist videocont…

一个基于.NET Core开源、跨平台的仓储管理系统

前言 今天给大家推荐一个基于.NET Core开源、跨平台的仓储管理系统,数据库支持MSSQL/MySQL:ZEQP.WMS。 仓储管理系统介绍 仓储管理系统(Warehouse Management System,WMS)是一种用于管理和控制仓库操作的软件系统&…

扩散模型实战(十二):使用调度器DDIM反转来优化图像编辑

推荐阅读列表: 扩散模型实战(一):基本原理介绍 扩散模型实战(二):扩散模型的发展 扩散模型实战(三):扩散模型的应用 扩散模型实战(四&#xff…

vue3+ts 依赖注入 provide inject

父级&#xff1a; <template><div><h1>App.vue (爷爷级别)</h1><label><input type"radio" v-model"colorVal" value"red" name"color" />红色</label><label><input type"r…

Win11画图板的解决方法

Win11画图板的解决方法 现状: 伴随着windows由win10更新到win11,windows自带的画图板也随之更新,但是它就变得对我们用户就不太友善了,变得很难使用. 具体表现: 需求: 但是由于各种需求,就以我来举例,由于博主写博客的需要,去使用其它的软件,就找不到其它这么好用的画图软件进…

Linux的基本指令(三)

目录 前言 echo指令&#xff08;简述&#xff09; Linux的设计理念 输出重定向操作符 > 追加输出重定向操作符 >> 输入重定向操作符 < 补充知识 学前补充 more指令 less指令 head指令 tail指令 查看文件中间的内容 利用输出重定向实现 利用管道“ |…

python树的孩子链存储结构

树的孩子链存储结构是一种树的存储方式&#xff0c;它使用孩子兄弟表示法来表示树的结构。在这种存储结构中&#xff0c;树的每个节点都有一个指向其第一个孩子的指针和一个指向其下一个兄弟的指针。这样&#xff0c;可以通过这些指针来表示树的层次结构和节点之间的关系。 具…

大公司为什么喜欢centos系统写爬虫?

CentOS是一个基于Red Hat Enterprise Linux&#xff08;RHEL&#xff09;源代码构建的开源操作系统&#xff0c;它受到大企业喜欢大多数因为他系统的稳定性&#xff0c;安全性以及兼容性等。可以为企业提供更多的商业支持。以我个人为例&#xff0c;公司在做爬虫数据抓取多是采…

Vue 双向数据绑定

之前通过v-bind来完成的数据绑定&#xff0c;属性值和表达式进行绑定&#xff0c;表达式的值发生变化了属性值也跟着发生变化。 单向数据绑定&#xff1a; <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>首页</titl…

信息素养大赛知识点

基础理论准备 开放存储期刊 开放存取期刊是一种免费的网络期刊&#xff0c;旨在使所有用户都可以通过因特网无限制地访问期刊论文全文。此种期刊一般采用作者付费出版、读者免费获得、无限制使用的运作模式&#xff0c;论文版权由作者保留。在论文质量控制方面&#xff0c;oa…

Couchdb 命令执行漏洞复现 (CVE-2017-12636)

Couchdb 命令执行漏洞复现 &#xff08;CVE-2017-12636&#xff09; 1、下载couchdb.py 2、修改目标和反弹地址 3、Python3调用执行即可 couchdb.py文件下载地址: https://github.com/vulhub/vulhub/blob/master/couchdb/CVE-2017-12636/exp.py ‍ 在VULFocus上开启环境 …

虚拟内存的基本概念

文章目录 虚拟内存虚拟地址空间(其他 Unix 系统的设计也与此类似)。程序代码和数据堆共享库栈内核虚拟内存 参考 虚拟内存 虚拟内存是一个抽象概念&#xff0c;它为每个进程提供了一个假象&#xff0c;即每个进程都在独占地使用主存。每个进程看到的内存都是一致的&#xff0c…

城市安全守护者:分析无人机在交通领域的应用

随着科技的进步&#xff0c;无人机在交通领域的应用不断增加&#xff0c;为智慧交通管理提供了新便利。无人机凭借其灵活性&#xff0c;在违章取证、交通事故侦查、交通疏导等方面展现出巨大的应用潜力。无人机在交通领域的应用有哪些&#xff1f;跟着我们一探究竟。 1、违章取…

iOS移动应用程序的备案与SHA-1值查看

​ 目录 &#x1f4dd;iOS移动应用程序的备案与SHA-1值查看 引言 第一部分&#xff1a;App备案 第二部分&#xff1a;查看SHA-1值 引言 在开发和发布移动应用程序时&#xff0c;进行App备案是非常重要的一步&#xff0c;它是确保您的应用在合规性方面符合相关法规的过程。…

STM32入门

写在前面&#xff1a;本文是基于哔哩哔哩江协科技的STM32入门教程-2023版 细致讲解 中文字幕学习时写的笔记&#xff0c;复习查阅方便&#xff0c;如有侵权&#xff0c;联系删除。 另外本人也是初学者&#xff0c;有很多理解不透彻的或者错误的理解&#xff0c;希望大家多多批评…

JVM——垃圾回收算法(垃圾回收算法评价标准,四种垃圾回收算法)

目录 1.垃圾回收算法发展简介2.垃圾回收算法的评价标准1.吞吐量2.最大暂停时间3.堆使用效率 3.垃圾回收算法01-标记清除算法垃圾回收算法-标记清除算法的优缺点 4.垃圾回收算法02-复制算法垃圾回收算法-复制算法的优缺点 5.垃圾回收算法03-标记整理算法标记整理算法的优缺点 6.…

基于C#实现鸡尾酒排序(双向冒泡排序)

通俗易懂点的话&#xff0c;就叫“双向冒泡排序”。 冒泡是一个单向的从小到大或者从大到小的交换排序&#xff0c;而鸡尾酒排序是双向的&#xff0c;从一端进行从小到大排序&#xff0c;从另一端进行从大到小排序。 从图中可以看到&#xff0c;第一次正向比较&#xff0c;我们…

第二证券:煤炭板块震荡走高 潞安环能、晋控煤业涨超5%

证券时报网讯&#xff0c;煤炭板块27日盘中发力走高&#xff0c;到发稿&#xff0c;潞安环能、晋控煤业涨超5%&#xff0c;平煤股份、山西焦煤涨逾3%&#xff0c;恒源煤电、开滦股份等上扬。 职业方面&#xff0c;近期寒潮来袭&#xff0c;气温下降带动居民用电需求增加&#…