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

    文章

    5947

    浏览量

    135772
  • RTOS
    +关注

    关注

    21

    文章

    809

    浏览量

    119358
收藏 人收藏

    评论

    相关推荐

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

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

    单片机的三种总线结构

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

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

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

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

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

    信号调制的三种基本方法

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

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

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

    VMware虚拟机的三种网络模式

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

    运放的三种应用

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

    运动控制的三种控制方式

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

    常见的socket三种类型

    常见的socket三种类型  Socket是计算机网络中常用的通信机制,在网络编程中起到了非常重要的作用。Socket可以分为三种类型:流套接字(Stream Socket)、数据报套接字
    的头像 发表于 12-08 11:18 2299次阅读

    电路短路的三种情况

    电路短路的三种情况  电路短路是指电路中某个部分的导线或元器件出现故障,导致电流绕过原本的路径,直接通过短路部分。短路会导致电路不正常工作,并可能引起火灾、电击等危险。本文将详细介绍电路短路的三种
    的头像 发表于 11-23 10:33 5238次阅读

    修复锂电池的三种方法

    电子发烧友网站提供《修复锂电池的三种方法.doc》资料免费下载
    发表于 11-15 10:40 5次下载
    修复锂电池的<b class='flag-5'>三种</b>方法

    单工通信、半双工通信和全双工通信三种方式的不同之处

    首先,不要被生涩的文字吓到了,通讯在我们日常中通讯是无处不在的,三种通讯方式也是随处可见。下面分别举例说明三种方式的不同之处以及在工业和电子设备上常用的一些案例。
    的头像 发表于 11-14 16:09 5119次阅读
    单工<b class='flag-5'>通信</b>、半双工<b class='flag-5'>通信</b>和全双工<b class='flag-5'>通信</b><b class='flag-5'>三种</b>方式的不同之处

    什么是电池化成?电池化成的三种方式 三种电池化成对比

    什么是电池化成?电池化成的三种方式 三种电池化成对比  电池化成是指将物体或设备改造为可以使用电池供电的过程。在电池化成过程中,常见的电源例如燃油、电线甚至是替换掉,以便更高效、便捷地提供
    的头像 发表于 11-10 14:49 2193次阅读

    如何用三种不同的方法来用按钮控制灯光

    在电子和自动化中,一个常见的任务是使用按钮来控制灯的开/关状态。这可以用不同的方式实现,取决于设备的类型和涉及的逻辑。在本文中,我们将比较使用单片机、PLC和硬件连接来实现这个任务三种方法。我们将讨论每种方法的优缺点,以及所需
    的头像 发表于 11-10 11:47 2614次阅读
    如何用<b class='flag-5'>三种</b>不同的方法来用按钮控制灯光