freeRTOS任务通知(1-17)

server/2024/9/25 8:22:22/
cle class="baidu_pl">
cle_content" class="article_content clearfix">
content_views" class="htmledit_views">

任务通知简介:

def: 任务通知是用来通知任务的࿰c;任务控制块中的结构体成员变量ulNotifiedValue就是这个通知值。

color:#fe2c24;">任务通知的内存消耗比较小

  • 1: 使用队列c;信号量࿰c;时间标志组都需要另外创建结构体࿰c;通过中间结构体进行间接通信。

center;"> c="https://img-blog.csdnimg.cn/direct/a0c8d05eefd1414cafb06be3473be7b8.png" width="609" />

  •  2:使用任务通知时࿰c;任务结构体TCB中就包含了内部对象࿰c;可以直接接收别人发送过来的通知。

class="img-center">c="https://img-blog.csdnimg.cn/direct/54bec9e0a85947689c9ee7b67a3b8ee3.png" width="602" />

ckquote>

任务通知值的更新方式

ckquote>
  • 1:不覆盖接收任务通知值
  • 2:覆盖接收任务的通知值
  • 3:更新接受任务通知值的一个或多个bit
  • 4:增加接受任务的通知值

color:#fe2c24;">注:合理的利用任务通知的特点࿰c;可以在一些场合中替代队列c;信号量࿰c;事件标志组

ckquote>

任务通知的优势和劣势

ckquote>

任务通知的优势:

  • 1:效率更高࿰c;使用任务通知向任务发送事件或数据比使用队列事件标志组或信号量快得多。
  • 2:使用内存更小࿰c;使用其他方法时都要先创建对应的结构体࿰c;使用任务通知时无需额外创建结构体。

任务通知劣势:

  • 1:ISR中没有任务结构体࿰c;无法给ISR发送数据࿰c;但是ISR可以使用任务通知功能࿰c;发数据给任务
  • 2:无法广播给多个任务࿰c;任务通知只能是被指定的一个任务接收处理
  • 3:无法缓存多个数据࿰c;任务通知是通过更新任务通知值来发送数据的࿰c;任务结构体中只有一个任务通知值࿰c;只能保持一个数据
  • 4:发送受阻不支持阻塞࿰c;发送方无法进入阻塞状态等待

任务通知状态栏:

任务都有一个结构体:任务控制块TCB࿰c;它里面有两个结构体成员变量

<code class="language-cpp">任务通知值和通知状态
每一个任务都有一个结构体:任务控制块TCB࿰c;它里面有两个结构体成员变量typedef struct tsTaskControlBlock
{............// 条件编译࿰c;符合下面这个宏程序继续往下运行#if(configUSE_TASK_NOTIFICATIONS == 1)volatile uint32_t ulNotifiedValue[configTASK_NOTIFICATION_ARRAY_ENTRIES];volatile uint8_t  ucNotifyState[configTASK_NOTIFICATION_ARRAY_ENTRIES];endif... ...
}tskTCB;#configTASK_NOTIFICATION_ARRAY_ENTRIES             /*任务通知数组大小࿰c;默认值为1*/uint32_t   表示任务通知值
uint8_t    用于表示通知状态code>

class="img-center">c="https://img-blog.csdnimg.cn/direct/38f396a5ebaf4fafa3dd52c3da77da4a.png" width="989" />

任务通知值:任务通知值的更新方式有多种类型

  • 1:计数值(数值累加࿰c;类似信号量)
  • 2:相应为设置为1(类似事件标志组)
  • 3:任意数值(支持覆写和不覆写࿰c;类似队列)------》覆写有没有数值都能将数据写进去࿰c;不覆写--------》 有数值就写不进去。
ckquote>

任务的通知状态

ckquote>

 任务通知状态的三种取值:

<code class="language-cpp">   \           #define taskNot_WAITING_NOTIFICATION       ((uint8_t)0)     // 任务未等待通知\           #define taskWAITING_NOTIFICATION          ((uint8_t)1)      // 任务在等待通知\           #define taskNOTIFICATION_RECEIVED         ((uint8_t)2)      // 任务在等待接收code>

color:#fe2c24;">注:

  • 1:任务未等待通知:任务通知默认的初始化状态
  • 2:任务等待通知:接收方已经准备好(调用接收任务通知函数)࿰c;等待发送方给个通知
  • 3:任务等待接收:发送方已经发送出去(调用了发送任务通知函数)࿰c;等待接收方接收

c="https://img-blog.csdnimg.cn/direct/2951a1fc76bb4f288b07f304774e3fe3.png" width="937" />

任务通知API函数

任务通知API函数主要有两类:

  • 1:发送通知
  • 2:接受通知

color:#fe2c24;">注:发送通知API函数可以用于任务和中断服务函数中࿰c;接收通知API函数只能用在任务中。

ckquote>

发送通知相关API函数

ckquote> cellpadding="1" cellspacing="1" style="width:500px;">
center;width:231px;">函数center;width:267px;">描述
xTaskNotify()发送通知࿰c;带有通知值
xTaskNotifyAndQuery()发送通知࿰c;带有通知值并且保留接收任务的原通知值
xTaskNotifyGive()发送通知࿰c;不带通知值
xTaskNotifyFromISR()colspan="1" rowspan="3" style="width:267px;">在中断中发送任务通知
xTaskNotifyAndQueryFromISR()
vTaskNotifyGiveFromISR
ckquote>

xTaskNotifyAndQuery()  函数原形:发送通知࿰c;带有通知值࿰c;并且保留接收任务的原通知值

ckquote>
<code class="language-cpp">#define xTaskNotifyAndQuery( xTaskToNotify , ulValue , eAction , pulPreviousNotifyValue ) \xTaskGenericNotify( ( xTaskToNotify ),( tskDEFAULT_INDEX_TO_NOTIFY),( ulValue ),( eAction ),( pulPreviousNotifyValue ) )
code>

class="img-center">c="https://img-blog.csdnimg.cn/direct/4a9d17c2d63a49e098dd4975ac99e974.png" width="781" />

ckquote>

xTaskNotify() 函数原形:发送通知࿰c;带有通知值(不保留接收任务原通知值)

ckquote>
<code class="language-cpp">#deine xTaskNotify ( xTaskToNotify , ulValue , eAction )xTaskGenericNotify((xTaskToNotify ) ,(tskDEFAULT_INDEX_TO_NOTIFY), ( ulNalue),( eAction ),NULL );code>

class="img-center">c="https://img-blog.csdnimg.cn/direct/3be8932b76e34b2a868f688b7767cb67.png" width="719" />

ckquote>

xTaskNotifyGive()函数原形:发送通知࿰c;不带通知值(不保留接收任务原通知值)

ckquote>
<code class="language-cpp">  #define xTaskNotifyGive( xTaskToNotify )    xTaskGenericNotify(( xTaskToNotify ) ,     (tskDEFAULT_INDEX_TO_NOTIFY),  ( 0 )࿰c;elncrement ,NULL);code>
ckquote>ckquote>
<code class="language-cpp">BaseType_t xTaskGenericNotify(TaskHandle_t   xTaskToNotify    // 接收任务通知的任务句柄UBaseType_t    uxIndexToNotify  // 任务的指定通知uint32_t       ulValue          // 任务通知值eNotifyAction  eAction          // 通知方式pulPreviousNotificationValue    // 用于保存更新前任务通知值NULL表示不保存
)code>

class="img-center">c="https://img-blog.csdnimg.cn/direct/5275c1d22e85453cbb92c761ecc51e70.png" width="836" />

参数含义解读:

  • 1:第一个参数表示哪一个任务用于接收通知
  • 2:数组的第几个成员
  • 3:任务的通知值࿰c;需要发送什么给任务
  • 4:任务的通知方式(更新的方式...)
  • 5:保存更新前的任务通知值࿰c;NULL表示不保存

 

cellpadding="1" cellspacing="1" style="width:500px;">
center;">形参center;">描述
xTaskToNotify   接收任务通知的任务句柄
uxIndexToNotify 任务的指定通知(任务通知相关数组)
ulValue         任务通知值
eAction         通知方式
pulPreviousNotificationValue   用于保存更新前任务通知值࿰c; NULL表示不保存
ckquote>

任务通知的几种方式

ckquote>

class="img-center">c="https://img-blog.csdnimg.cn/direct/31c1563f1e2c481a840c2c7fbb08e469.png" width="653" />

ckquote>

接收通知相关API函数

ckquote> cellpadding="1" cellspacing="1" style="width:650px;">
center;width:143px;">函数center;width:506px;">描述
ulTaskNotifyTask()

获取任务通知࿰c;可以设置在退出次函数的时候将任务通知值清零或者减去1

当任务通知用于二值信号量或者计数信号量时࿰c;使用此函数获取信号量

xTaskNotifyWait()

获取任务通知࿰c;比ulTaskNotifyTak()更复杂࿰c;可以获取通知值和清除通知值

指定位

color:#fe2c24;">注:

  • 1:当任务通知用作于信号量时࿰c;使用函数获取信号量:ulTaskNotifyTake()
  • 2: 当任务通知作用于事件标志组或队列时࿰c;使用此函数来获取:xTaskNoyifyWait()

 【用于模拟信号量参数】

<code class="language-cpp">#define ulTaskNotifyTake( xClearCountOnExit , xTicksToWait )ulTaskGenericNotifyTake( ( tskDEFAULT_INDEX_TO_NOTIFY),( xClearCountOnExit ),( xTicksToWait ) )code>

class="img-center">c="https://img-blog.csdnimg.cn/direct/4297623382264c4f8112caaf24e1a5d7.png" width="760" />

cellpadding="1" cellspacing="1" style="width:500px;">
center;">形参center;">描述
uxIndexToWaitOn任务的指定通知(任务通知相关数组成员)
xClearCountOnExit

指定在成功接收通知后࿰c;将通知值清0或则减1

pdTRUE:把通知值清0

pdFALSE:把通知值减1

xTicksToWait阻塞等待任务通知值的最大时间
cellpadding="1" cellspacing="1" style="width:500px;">
center;width:155px;">返回值center;width:343px;">描述
center;width:155px;">0center;width:343px;">接收失败
center;width:155px;">非0center;width:343px;">接收成功࿰c;返回任务通知的通知值
ckquote>

获取通知值/清除通知值的指定位置

ckquote>
<code class="language-cpp">#define xTaskNotifyWait
(     ulBitsToClearOnEntry,ulBitsToClearOnExit,pulNotificationValue,xTicksToWait
)
xTaskGenericNotifyWait
( tskDEFAULT_INDEX_TO_NOTIFY,( ulBitsToClearOnEntry ),( ulBitsToClearOnExit ),( pulNotificationValue ),( xTicksToWait )
)
code>

class="img-center">c="https://img-blog.csdnimg.cn/direct/fb14a059b7404339af74a53b528b210a.png" width="456" />

ckquote>

 任务通知API函数

ckquote>

class="img-center">c="https://img-blog.csdnimg.cn/direct/369ffe7147f04a018118a2dc7c97cf01.png" width="764" />

返回值 ----------------------》

  • 返回        pdTRUE                    表示任务通知成功
  • 返回        pdFALSE                    表示等待任务通知失败

任务通知实验

1: 任务通知模拟信号量实验

c="https://img-blog.csdnimg.cn/direct/8d41ad38a63a4fbe83200e8b6bb0edc3.png" width="777" />


http://www.ppmy.cn/server/35037.html

相关文章

C语言知识点补充——ASCLL码表

1、ASCLL码表 ASCII码表&#xff08;American Standard Code for Information Interchange&#xff09;是一种用于将字符编码为数字的标准。它定义了128个字符的编码方式&#xff0c;包括数字、字母、标点符号和控制字符等。每个字符都对应一个唯一的7位或8位二进制数 2、Ascl…

百度下拉框负面信息如何删除?

百度头条360等搜索引擎&#xff0c;作为人们获取信息的主要途径之一。然而&#xff0c;一些知名的企业或个人可能会面临在搜索的下拉框中出现负面信息的问题&#xff0c;这可能对其声誉和形象造成不良影响。小马识途营销顾问根据自身从业经验&#xff0c;针对这类情况提出以下建…

React面试题(一)

react的优缺点 优点 虚拟DOM&#xff1a;减少对真实DOM的操作&#xff0c;提高性能。组件化&#xff1a;将代码分成一个个小的、可复用的组件&#xff0c;利于管理、维护。使用JSX&#xff1a;在React中可以嵌入HTML和JavaScript。单向数据流&#xff1a;React的单向数据流使得…

在Ubuntu 24.04 LTS (Noble Numbat)上安装nfs server以及nfs client

在Ubuntu 24.04 LTS (Noble Numbat)上,我使用的是最小化安装, 当然server版本的Ubuntu在安装的时候可能会有网络不通的问题,解决办法见如下文章: ubuntu 24.04 server 仅NAT模式上网设置静态IP设置-CSDN博客文章浏览阅读489次,点赞9次,收藏3次。在Ubuntu 24.04 上设置网…

【毕业设计】基于微信小程序的智慧校园管理系统设计与实现

1.项目介绍 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对高校教师成果信息管理混乱&#xff0c;出错率高&#xff0c;信…

Unity3D DOTween

简单介绍一下 DOTween 插件的使用。 导入插件 先到 Asset Store 获取 DOTween 插件&#xff0c;然后在 Package Manager 的 My Assets 中搜索&#xff0c;下载并导入插件。 导入后&#xff0c;会自动弹出一个窗口&#xff0c;提示需要先对插件进行配置。 点击上图中的按钮&am…

音响的无源辐射器

定义&#xff1a; 无源辐射器通常被用来调整低音&#xff0c;使得设计者能够调节音箱整体的音色。无源辐射器在音箱内主动单元对箱体内空气的带动下进行被动发声。 通常使用无源辐射器来代替倒相管都是用以调节较小箱体的音质和使其具有更好的低音表现。尤其是在一些情况下&a…

02——线性表

线性表 基本操作 Initlist(&L):初始化表 Length(L):求表长 LocateElem(L,e):按值查找操作 GetElem(L,i):按位查找操作 ListInsert(&L,i,e):插入操作 ListDelete(&L,i,&e):删除操作 PrintList(L):输出操作 Empty(L):判空操作 DestroyList(&L):销毁操作 顺序…