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

    文章

    6446

    浏览量

    140243
  • RTOS
    +关注

    关注

    25

    文章

    868

    浏览量

    123206
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    ATE系统中这三种测量卡的架构和功能

    测试仪行业面临的一个挑战是,如何在不显著增加测试仪时间、尺寸或成本的情况下,满足对大量测试通道的需求。尽管半导体测试仪(也称为自动测试器件(ATE))种类繁多,但在大多数测试仪都包含三种主要卡:电压
    的头像 发表于 04-09 15:12 127次阅读
    ATE系统中这<b class='flag-5'>三种</b>测量卡的架构和功能

    数字疗法如何更有效?(得加生物反馈)

    训练任务:游戏包含三种任务类型——打蛋、数字和水果。这些任务要求儿童在时间压力下快速辨别目标并作出点击反应,同时抑制对非目标刺激的反应(Go/No-go
    的头像 发表于 03-18 18:01 303次阅读
    数字疗法如何更有效?(得加生物反馈)

    C语言中实现函数宏的三种方式

    在宏的第一个分号后便结束。即 a = b 和 b = tmp 均不受控制语句所作用。 因此,在工程中,一般使用三种方式来对函数宏进行封装,分别为 {}、do{...}while(0
    发表于 12-29 07:34

    请问CW32芯片的三种工作模式是什么?

    CW32芯片的三种工作模式是什么?
    发表于 12-26 06:48

    伺服电机的三种制动方式有什么区别?

    伺服电机作为自动化控制系统中执行元件的核心部件,其制动性能直接影响设备的定位精度和安全可靠性。目前主流的伺服电机制动方式包括动态制动、再生制动和电磁机械制动三种,它们在制动原理、应用场景及技术特点上
    的头像 发表于 09-19 18:26 2164次阅读
    伺服电机的<b class='flag-5'>三种</b>制动方式有什么区别?

    【干货】一文带你了解CAN、Modbus与LoRa三种通信协议的区别

    在工业自动化与物联网领域,CAN、Modbus和LoRa是三种主流通信技术。而亿佰特在该行业具有丰富的产品供客户选择与使用,帮助客户进一步确定需求,本文将结合技术细节与实际案例解析其核心区别。一
    的头像 发表于 08-28 19:32 2281次阅读
    【干货】一文带你了解CAN、Modbus与LoRa<b class='flag-5'>三种</b><b class='flag-5'>通信</b>协议的区别

    TC377配置SMU FSP时,如何配置频率参数;三种模式有何区别,配置上有何区别?

    TC377配置SMU FSP时,如何配置频率参数;三种模式有何区别,配置上有何区别?
    发表于 08-08 07:48

    三种SPWM波形生成算法的分析与实现

    摘要:变频技术作为现代电力电子的核心技术,集现代电子、信息和智能技术于一体。而SPW(正弦波脉宽调制)波的产生和控制则是变频技术的核心之一。本文对SPI波形生成的三种算法-对称规则采样法、不对称规则
    发表于 07-31 13:34

    CAN总线电容过大?三种解决方案来了

    在新能源汽车路试中,CAN总线传输异常是一个常见问题。本期我们将探讨由于总线电容过大导致的下降沿过缓问题,并介绍三种有效的解决方案。CAN总线下降沿过缓问题新能源路试工程师在分析CAN总线波形
    的头像 发表于 07-22 11:36 834次阅读
    CAN总线电容过大?<b class='flag-5'>三种</b>解决方案来了

    MEMS中的三种测温方式

    在集成MEMS芯片的环境温度测量领域,热阻、热电堆和PN结原理是三种主流技术。热阻是利用热敏电阻,如金属铂或注入硅的温度电阻系数恒定,即电阻随温度线性变化的特性测温,电阻变化直接对应绝对温度,需恒流源供电。
    的头像 发表于 07-16 13:58 1877次阅读
    MEMS中的<b class='flag-5'>三种</b>测温方式

    1553B总线常见三种组网方式

    1553B总线作为航空电子系统中的关键通信协议,其组网方式直接影响系统的可靠性和实时性。本文将深入解析1553B总线的三种典型组网结构:单总线结构、双冗余总线和多总线分层架构,并结合实际应用场景分析
    的头像 发表于 06-21 17:39 2401次阅读
    1553B总线常见<b class='flag-5'>三种</b>组网方式

    同步任务开发指导

    同步任务是指在多个线程之间协调执行的任务,其目的是确保多个任务按照一定的顺序和规则执行,例如使用锁来防止数据竞争。 同步
    发表于 06-19 07:57

    开关电源三种控制模式:PWM/PFM/PSM

    摘要 本文详细介绍了开关电源的三种主要调制方式:PWM(脉冲宽度调制)、PFM(脉冲频率调制)和PSM(脉冲跨周期调制)。PWM通过调整脉冲宽度保持恒定频率,适用于重负载,但轻负载效率低。PFM则在
    发表于 06-09 16:11

    HarmonyOS基础组件:Button三种类型的使用

    中的Button相较于Android原生来说,功能比较丰富,扩展性高,减少了开发者的代码数量,简化了使用方式。不仅可以自定义圆角还支持三种样式。 常用属性 名称 参数类型 描述 type
    的头像 发表于 06-09 15:48 2702次阅读
    HarmonyOS基础组件:Button<b class='flag-5'>三种</b>类型的使用

    介绍三种常见的MySQL高可用方案

    在生产环境中,为了确保数据库系统的连续可用性、降低故障恢复时间以及实现业务的无缝切换,高可用(High Availability, HA)方案至关重要。本文将详细介绍三种常见的 MySQL 高可用
    的头像 发表于 05-28 17:16 1430次阅读