0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

任务间通信和同步的三种范式

要长高 来源:embedded 作者:Colin Walls 2022-06-16 15:46 次阅读

任务间通信和同步有三种广泛的范式:

任务拥有的设施 ——RTOS 赋予提供通信(输入)设施的任务的属性。我们将再看的例子是信号

内核对象 ——由 RTOS 提供的工具,代表独立的通信或同步工具。示例包括:事件标志、邮箱、队列/管道、信号量和互斥体。

消息传递 ——一种合理化的方案,其中 RTOS 允许创建消息对象,这些对象可以从一个任务发送到另一个任务或多个其他任务。这是内核设计的基础,并导致将此类产品描述为“消息传递 RTOS”。

适合每种应用的设施会有所不同。它们的功能也有一些重叠,一些关于可扩展性的思考是值得的。例如,如果一个应用程序需要多个队列,但只需要一个邮箱,那么实现具有单项队列的邮箱可能会更高效。这个对象会有点不理想,但所有邮箱处理代码都不会包含在应用程序中,因此,可伸缩性将减少 RTOS 内存占用。

共享变量或内存区域

任务间通信的一种简单方法是只拥有所有相关任务都可以访问的变量或内存区域。虽然它非常原始,但这种方法可能适用于某些应用程序。需要控制访问。如果变量只是一个字节,那么对它的写入或读取可能是“原子”(即不可中断)操作,但如果处理器允许对内存字节进行其他操作,则需要小心,因为它们可能是可中断的并且可能会导致时间问题。实现锁定/解锁的一种方法是在短时间内禁用中断。

如果您正在使用内存区域,当然您仍然需要锁定。使用第一个字节作为锁定标志是可能的,假设内存体系结构促进对该字节的原子访问。一个任务将数据加载到内存区域,设置标志,然后等待它清除。另一个任务等待设置标志,读取数据并清除标志。使用中断禁用作为锁定不太明智,因为移动整个数据缓冲区可能需要时间。

这种类型的共享内存使用方式类似于在多核系统中实现许多处理器间通信设施的方式。在某些情况下,硬件锁和/或中断被合并到处理器间共享存储器接口中。

信号

信号可能是传统 RTOS 中提供的最简单的任务间通信工具。它们由一组位标志组成——可能有 8、16 或 32 个,具体取决于具体实现——与特定任务相关联。

任何任务都可以使用 OR 类型的操作设置一个信号标志(或多个标志)。只有拥有信号的任务才能读取它们。读取过程通常是破坏性的——即标志也被清除。

在某些系统中,信号以更复杂的方式实现,以便在设置任何信号标志时自动执行由信号拥有任务指定的特殊功能。这消除了任务监控标志本身的必要性。这有点类似于中断服务程序。

在以后的文章中将有更多关于信号的信息,其中描述了它们在 Nucleus SE 中的实现。

事件标志组

事件标志组类似于信号,因为它们是面向位的任务间通信设施。它们可以类似地以 8、16 或 32 位的组来实现。它们与信号的不同之处在于它们是独立的内核对象;它们不“属于”任何特定任务。

任何任务都可以使用 OR 和 AND 操作设置和清除事件标志。同样,任何任务都可以使用相同类型的操作询问事件标志。在许多 RTOS 中,可以对事件标志组合进行阻塞 API 调用;这意味着任务可能会暂停,直到设置了特定的事件标志组合。当询问事件标志时,还可能有一个“使用”选项可用,以便清除所有读取标志。

在以后的文章中提供有关事件标志组的更多信息,其中描述了它们在 Nucleus SE 中的实现。

信号

量 信号量是独立的内核对象,它提供了一种标记机制,通常用于控制对资源的访问。大致有两种类型:二进制信号量(只有两种状态)和计数信号量(具有任意数量的状态)。一些处理器支持便于轻松实现二进制信号量的(原子)指令。二进制信号量也可以被视为计数限制为 1 的计数信号量。

任何任务都可能尝试获取信号量以获取对资源的访问权。如果当前信号量值大于0,则获取成功,信号量值递减。在许多操作系统中,可以通过阻塞调用来获取信号量;这意味着一个任务可能会被挂起,直到另一个任务释放信号量。任何任务都可以释放一个信号量,这会增加它的值。

在以后的文章中有更多关于信号量的信息,其中描述了它们在 Nucleus SE 中的实现。

邮箱

邮箱是独立的内核对象,它为任务提供了一种传输消息的方法。消息大小取决于实现,但通常是固定的。一到四个指针大小的项目是典型的消息大小。通常,指向一些更复杂数据的指针是通过邮箱发送的。一些内核实现了邮箱,因此数据只存储在一个常规变量中,内核管理对它的访问。邮箱也可以称为“交换”,尽管这个名字现在已经不常见了。

任何任务都可以发送到邮箱,然后邮箱已满。如果一个任务然后尝试发送到一个完整的邮箱,它将收到一个错误响应。在许多 RTOS 中,可以进行阻塞调用以发送到邮箱;这意味着一个任务可能会被挂起,直到邮箱被另一个任务读取。任何任务都可以从邮箱中读取,这会再次使其为空。如果任务尝试从空邮箱读取,它将收到错误响应。在许多 RTOS 中,可以进行阻塞调用以读取邮箱;这意味着一个任务可能会被挂起,直到邮箱被另一个任务填满。

一些 RTOS 支持“广播”功能。这使消息能够发送到当前在读取特定邮箱时暂停的所有任务。

某些 RTOS 根本不支持邮箱。建议改为使用单条目队列(见下文)。这在功能上是等效的,但会带来额外的内存和运行时开销。

在以后的文章中会提供有关邮箱的更多信息,该文章描述了它们在 Nucleus SE 中的实现。

队列

队列是独立的内核对象,它为任务提供了一种传输消息的方法。它们比邮箱更灵活、更复杂。消息大小取决于实现,但通常是固定大小和面向字/指针的。

任何任务都可能发送到队列,并且这可能会重复发生,直到队列已满,此后任何发送尝试都将导致错误。队列的深度通常是用户在创建或配置系统时指定的。在许多 RTOS 中,可以进行阻塞调用以发送到队列;这意味着,如果队列已满,一个任务可能会被挂起,直到队列被另一个任务读取。任何任务都可以从队列中读取。消息的读取顺序与发送顺序相同——先进先出 (FIFO)。如果一个任务试图从一个空队列中读取,它将收到一个错误响应。在许多 RTOS 中,可以进行阻塞调用以从队列中读取;这意味着,如果队列为空,则任务可能会暂停,直到另一个任务将消息发送到队列。

RTOS 可能会支持将消息发送到队列前面的功能——这也称为“干扰”。一些 RTOS 还支持“广播”功能。这使消息能够发送到在读取队列时暂停的所有任务。此外,RTOS 可以支持可变长度消息的发送和读取;这提供了更大的灵活性,但会带来一些额外的开销。

许多 RTOS 支持另一种称为“管道”的内核对象类型。管道本质上与队列相同,但处理面向字节的数据。

队列的内部操作在这里不感兴趣,但应该理解它们在内存和运行时的开销比邮箱要多。这主要是因为需要维护两个指针——指向队列的头部和尾部。

在以后的文章中有更多关于队列和管道的信息,这些文章描述了它们在 Nucleus SE 中的实现。

互斥

信号量互斥信号量——互斥量——是独立的内核对象,其行为方式与正常的二进制信号量非常相似。它们稍微复杂一些,并包含临时所有权的概念(资源的,对其的访问受到控制)。如果一个任务获得了一个互斥锁,那么只有同一个任务才能再次释放它——互斥锁(以及资源​​)暂时归任务所有。

并非所有 RTOS 都提供互斥锁,但调整常规二进制信号量非常简单。有必要编写一个“互斥量获取”函数,该函数获取信号量并记录任务标识符。然后一个互补的“互斥释放”函数将检查调用任务的标识符,只有当它与存储的值匹配时才释放信号量,否则它将返回错误。

Colin Walls 在电子行业拥有超过 30 年的经验,主要致力于嵌入式软件。Colin 经常在会议和研讨会上发表演讲,并着有大量技术文章和两本关于嵌入式软件的书籍,他是 Mentor Embedded [Mentor Graphics Embedded Software Division] 的嵌入式软件技术专家,常驻英国。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 通信
    +关注

    关注

    18

    文章

    6030

    浏览量

    135975
  • RTOS
    +关注

    关注

    22

    文章

    811

    浏览量

    119613
收藏 人收藏

    评论

    相关推荐

    I2S有左对齐,右对齐跟标准的I2S三种格式,那么这三种格式各有什么优点呢?

    大家好,关于I2S格式,有两个疑问请教一下 我们知道I2S有左对齐,右对齐跟标准的I2S三种格式,那么这三种格式各有什么优点呢? 而且对于标准的I2S格式,32FS传输16bit的数据,48fs传输24bit的数据,最低位会移动到右声道,是否意味着该数据被丢弃了?还是有
    发表于 10-21 08:23

    基本放大电路有哪三种

    基本放大电路是电子电路中至关重要的组成部分,它能够将输入信号放大到所需的电平,以便后续电路进行处理。在电子工程中,基本放大电路主要有三种形式,分别是共发射极放大电路(简称共射放大电路)、共基极放大
    的头像 发表于 10-15 11:07 1245次阅读

    mosfet的三种工作状态及工作条件是什么

    的工作状态及工作条件对于理解和设计相关电路至关重要。以下是MOSFET的三种主要工作状态及其工作条件的介绍。 一、MOSFET的三种工作状态 MOSFET根据其栅源电压(VGS)和漏源电压(VDS
    的头像 发表于 10-06 16:51 1796次阅读

    单片机的三种总线结构

    单片机的三种总线结构包括地址总线(Address Bus, AB)、数据总线(Data Bus, DB)和控制总线(Control Bus, CB)。这三种总线在单片机内部及与外部设备之间的数据传输
    的头像 发表于 09-10 11:32 2603次阅读

    计算机网络中的三种通信方式

    计算机网络中的三种通信方式,即单工通信、半双工通信和全双工通信,是理解和设计高效网络架构的基础。每种通信
    的头像 发表于 08-07 15:00 2551次阅读

    放大电路的三种组态可以放大什么

    放大电路是电子学中非常重要的组成部分,它们可以将输入信号的幅度放大,以满足各种应用的需求。放大电路的三种基本组态包括共射放大电路、共集放大电路和共基放大电路。每种组态都有其特定的应用和特点。以下
    的头像 发表于 07-09 14:31 1072次阅读

    信号调制的三种基本方法

    号调制的三种基本方法:调幅(AM)、调频(FM)和调相(PM),并分析它们的优缺点及应用场景。 调幅(AM) 2.1 调幅原理 调幅(Amplitude Modulation,AM)是一将低频信号的幅度变化映射到高频载波信号的幅度变化上的调制方式。在调
    的头像 发表于 06-03 09:38 3879次阅读

    晶体管的三种工作状态

    晶体管作为现代电子技术的基石,其工作状态直接影响电子设备的性能和功能。晶体管通常具备三种基本的工作状态:截止状态、放大状态和饱和状态。这三种状态不仅决定了晶体管在电路中的行为,也反映了晶体管作为半导体器件的基本特性。本文将详细阐述晶体管的这
    的头像 发表于 05-28 14:53 1444次阅读

    浅析FreeRTOS任务调度器的三种调度算法和应用

    FreeRTOS在MCU领域应用非常广泛,今天就给大家讲解一下FreeRTOS调度器中的三种调度算法,以及在瑞萨RZ/T2L MPU中的应用。
    的头像 发表于 05-10 14:02 7370次阅读
    浅析FreeRTOS<b class='flag-5'>任务</b>调度器的<b class='flag-5'>三种</b>调度算法和应用

    进程通信的消息队列介绍

    消息队列是一非常常见的进程通信方式。
    的头像 发表于 04-08 17:27 309次阅读

    VMware虚拟机的三种网络模式

    VMware虚拟机的三种网络模式 VMware是一广泛使用的虚拟机软件,可以创建和管理多个虚拟机。在使用VMware虚拟机时,网络设置非常重要,因为它决定了虚拟机如何与物理网络或其他虚拟机进行通信
    的头像 发表于 02-04 11:17 1996次阅读

    运放的三种应用

    运放在电路中主要存在三种应用,放大器,滤波器,振荡器。再这三种应用电路中,运放的两大特点虚短虚断仍然成立吗? 在阻尼振荡器中,工作过程是否按照我描述的这样,在反相输入端加一个近似锯齿波的电流源,正半
    发表于 01-26 16:18

    运动控制的三种控制方式

    非标项目中有非常多的运动控制,根据系统配置、电机类型以及精度需求的不同主要有三种控制方式:开环控制、半闭环控制、全闭环控制。
    的头像 发表于 01-23 09:48 1477次阅读
    运动控制的<b class='flag-5'>三种</b>控制方式

    嵌入式Linux开发的三种方式

    嵌入式Linux开发主要有三种方式:裸机开发、SDK开发和驱动开发。
    的头像 发表于 01-22 14:22 970次阅读

    示波器的三种触发模式

    示波器的触发模式有自动模式(Auto)、正常模式(Norm)和单次模式(Single)三种。在测不同信号时,采用不同的触发模式,才能准确测量到所需要的波形。下面以我司静电发生器TEH-10030
    的头像 发表于 01-18 08:12 2603次阅读
    示波器的<b class='flag-5'>三种</b>触发模式