嵌入式面试——FreeRTOS篇(六) 任务通知

本篇为:FreeRTOS 任务通知篇

任务通知简介

1、任务通知介绍

答:

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

使用队列、信号量、事件标志组时都需要另外创建一个结构体,通过中间的结构体进行间接通信。

使用任务通知时,任务结构体TCB中就包含了内部对象,可以直接接收别人发过来的"通知"。

2、任务通知值的更新方式

答:

  • 不覆盖接收任务的通知值。
  • 覆盖接收任务的通知值。
  • 更新接收任务通知值的一个或多个位。
  • 增加接收任务的通知值。

只要合理,灵活的利用任务通知的特点,可以在一些场合中替代队列、信号量、事件标志组。

3、任务通知值的优势及劣势

答:

任务通知的优势:

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

任务通知的劣势:

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

任务通知值和通知状态

1、任务通知结构体

答:

任务都有一个结构体---任务控制块,它里面有两个结构体成员变量:

cpp 复制代码
typedef  struct  tskTaskControlBlock

{
          ......

      #if (configUSE_TASK_NOTIFICATIONS  ==  1)

           volatile  uint32_t    ulNotifiedValue[configTASK_NOTIFICATION_ARRAY_ENTRIES];

           volatile  uint8_t      ucNotifyState[configTASK_NOTIFICATION_ARRAY_ENTRIES];

       endif

              ......
}
tskTCB;

#define   configTASK_NOTIFICATION_ARRAY_ENTRIES  1   /* 定义任务通知数组的大小, 默认: 1 */
  • 一个是uint32_t类型,用来表示任务通知值。
  • 一个是uint16_t类型,用来表示任务通知状态。

2、任务通知值

答:

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

  1. 计数值(数值累加,类似信号量)。
  2. 相应位置1(类似事件标志组)。
  3. 任意数值(支持覆写或不覆写,类似队列)。

3、任务通知状态

答:

任务通知状态共有3种。

cpp 复制代码
#define     taskNOT_WAITING_NOTIFICATION    ( ( uint8_t ) 0 )        /* 任务未等待通知 */

#define     taskWAITING_NOTIFICATION        ( ( uint8_t ) 1 )        /* 任务在等待通知 */

#define     taskNOTIFICATION_RECEIVED       ( ( uint8_t ) 2 )        /* 任务在等待接收 */
  • 任务未等待通知:任务通知默认的初始化状态。
  • 等待通知:接收方已经准备好了(调用了接收任务通知函数),等待发送方给个通知。
  • 等待接收:发送方已经发送过去(调用了发送任务通知函数),等待接收方接收。

任务通知相关API函数

1、任务通知相关API函数介绍

答:

任务通知API函数主要有两类:1-发送通知,2-接收通知。

注意:

发送通知API函数可以用于任务和中断函数中,但接受通知API函数只能用在任务中。

发送通知相关API函数:

接收通知相关API函数:

Q&A

Q:已经有了这么多任务(进程)间通讯方式,为什么还要选择任务通知呢?

A:就是因为他的优点,速度比较快,所以效率更高;无需额外创建结构体,在创建任务时候,就已经存在于任务控制块TCB当中,所以内存占用相对其他方式更小。

不过由于他的劣势,所以在多对多,或者单对多的情况下很少使用;而在单对单的情况下大部分都会使用任务通知。

相关推荐
广州灵眸科技有限公司6 小时前
瑞芯微(EASY EAI)RV1126B CAN使用
linux·网络·单片机·嵌入式硬件
SmartRadio6 小时前
CH584M vs nRF52840 vs 主流BLE SoC全面对比
单片机·嵌入式硬件·mcu·物联网·开源·硬件工程
元亓亓亓6 小时前
LeetCode热题100--62. 不同路径--中等
算法·leetcode·职场和发展
前端要努力9 小时前
月哥创业3年,还活着!
前端·面试·全栈
航Hang*9 小时前
Photoshop 图形与图像处理技术——第8章:图像的色彩与色彩调整和图像的输出与优化
图像处理·笔记·ui·photoshop
小桥流水---人工智能9 小时前
风电机组故障诊断与状态监测方法的研究局限性整理(背景笔记)
笔记
菩提小狗10 小时前
小迪安全笔记_第4天|扩展&整理|30+种加密编码进制全解析:特点、用处与实战识别指南|小迪安全笔记|网络安全|
笔记·安全·web安全
xian_wwq10 小时前
【学习笔记】OSI安全架构体系
网络·笔记·学习
love530love10 小时前
Windows 11 下再次成功本地编译 Flash-Attention 2.8.3 并生成自定义 Wheel(RTX 3090 sm_86 专属版)
人工智能·windows·笔记·编译·flash_attn·flash-attn·flash-attention
好易学·数据结构11 小时前
可视化图解算法76:最大子数组和
数据结构·算法·leetcode·面试·动态规划·力扣·笔试