在高度时间敏感的低功耗蓝牙应用中使用 RTOS

电子说

1.2w人已加入

描述

当您设计嵌入式系统时,您需要回答的问题之一是您的应用程序是否需要实时操作系统 (RTOS)。许多嵌入式设计人员都回避使用 RTOS 内核,因为他们担心内核在处理关键部分时会禁用中断,这会妨碍时间敏感型应用程序无法满足最后期限。

什么是实时操作系统? RTOS 是一种软件,可以尽可能高效地管理中央处理单元 (CPU)、微处理单元 (MPU) 甚至数字信号处理器 (DSP) 的时间。大多数 RTOS 内核是用 C 语言编写的,需要一小部分用汇编语言编写的代码来使内核适应不同的 CPU 架构。

内核为程序员提供了许多有用的服务,包括多任务处理、中断管理、任务间通信和信令、资源管理、时间管理和内存分区管理。应用程序基本上分为多个任务,每个任务负责应用程序的一部分。任务是一个简单的程序,它认为它自己拥有 CPU。每个任务都根据任务的重要性分配一个优先级。

大多数用于嵌入式系统的内核都是“抢占式”的,这意味着内核总是执行准备好运行的最重要的任务。抢占式内核也是事件驱动的,这意味着任务被设计为等待事件发生才能执行。当事件发生时,任务执行并执行其功能。如果任务等待的事件没有发生,内核将运行其他任务。等待任务消耗 CPU 时间为零;内核允许您避免使用轮询循环,这是对 CPU 时间的不好利用。

许多嵌入式程序员回避使用 RTOS 内核,因为他们担心内核会给他们的应用程序增加太多复杂性。事实证明,您只需要少数服务即可使用内核启动您的项目。至于开销,RTOS 确实可能需要 2% 到 5% 的 CPU 资源来执行其职责。

然而,更重要的是 RTOS 在进入临界区时需要禁用中断。根据 CPU 本身、时钟频率以及内存访问是否需要等待状态,RTOS 可以禁用中断数十微秒。对于大多数嵌入式应用程序而言,此限制通常不是问题,但在每微秒都很重要时可能会出现问题。

低功耗蓝牙 (BLE) IoT 设备越来越多地配备 BLE 链路,因为当与智能手机或类似手持设备结合使用时,BLE 使这些 IoT 设备的调试和配置变得简单方便。BLE 可以有多种操作模式、多种连接、多个广告商等等,其中一些甚至可以重叠。

扫描模式: 设备扫描其他设备发送的广告包。扫描由扫描之间的间隔和设备正在侦听的时间窗口组成。扫描仪在每个间隔改变频道频率。需要在收到请求后 150 µs 内做出响应。这称为帧间空间 (IFS)。

广告模式: BLE 设备也可以自行执行广告,广告时间可能在 20 毫秒到 3 小时之间。

连接模式: Master 在每个连接间隔发送一个数据包,BLE Slave 设备在 150 µs 后回复 Master,即 IFS。如果 Master 有其他东西要发送给 Slave,它会在 150 μs 后向 Slave 发送一个数据包。设备相互发送数据包,直到两端都没有数据要发送。

对于 32 位 CPU 来说,150 微秒可能看起来很长,但在处理传入请求时还有很多工作要做。数据包具有流控信息,指示从另一端请求什么序列号;可能有地址白名单过滤需要处理。

实际上,执行这些操作会消耗 120 µs 到 130 µs 的 CPU 时间。如果无法在 150 µs 内处理数据包,通常不会发生任何不良情况;数据吞吐量可能会略有下降或打开连接可能会延迟。从客户的角度来看,这种行为与无线电干扰相同。但是,连续错过这个截止日期不是一种选择,因为它会使最终产品无法使用。

BLE 应用程序中 的 RTOS 如果 RTOS 可能会在数十微秒内禁用中断,那么您为什么要考虑在基于 BLE 的应用程序中使用它呢?嗯,答案是这些时间紧迫的事件可以在 RTOS 之外轻松处理。具体来说,可以在 RTOS 范围之外分配特定的时间敏感中断服务例程 (ISR)。这些称为非内核感知 (nKA) ISR,顾名思义,它们只是绕过 RTOS 内核。nKA ISR 的优先级高于内核感知 (KA) ISR。

应用程序

图 1:Cortex-M3 CPU 上的 ISR 和任务优先级。

图 1 显示了典型 Cortex-M3 CPU 的 ISR 和任务的优先级。如果 RTOS 需要保护临界区,它会将 Cortex-M3 CPU 的 BASEPRI 寄存器设置为 0x40,从而禁用优先级为 0x40 及以下的 KA ISR。因为 0x00 和 0x20 是更高的优先级,它们将被允许中断 CPU,即使 RTOS 处于临界区的中间。

因此,时间敏感的 BLE ISR 可以简单地分配优先级 0x00 或 0x20,当它们发生时,将立即处理它们,而与低优先级 ISR 或任务的状态无关。

一项任务可能会为 nKA ISR 提供设置信息——操作模式、配置等。nKA ISR 可能还需要在任务级别执行进一步的非时间关键处理。因此,如果不允许 nKA ISR 进行任何 RTOS API 调用,nKA ISR 如何与任务通信?设置共享内存相当容易,如图2 所示。

应用程序

图 2:nKA ISR 和任务之间的通信。

nKA ISR 将信息存储到与其共享任务的内存中。

由于 nKA ISR 无法进行任何 RTOS API 调用,因此它需要触发 KA 中断,进而允许进行内核调用。ARM Cortex-M CPU 的嵌套向量中断控制器 (NVIC) 允许系统设计人员做到这一点,但设计人员需要识别应用程序未使用的 I/O 设备并窃取其中断向量以用于此目的。

因此,KA ISR 可以向任务发出信号,让其知道共享 RAM 中的数据可用。

当所有 ISR 都已完成,并且 RTOS 已决定发出信号的任务现在是最高优先级时,该任务可以读取 nKA ISR 发送给它的数据。

该任务可以根据需要将 nKA ISR 的信息存储在一个共享区域中,该共享区域只能由 nKA ISR 读取。数据写入共享 RAM,但只有在设置“数据可用”标志时才能读取。ARM Cortex-M3 CPU 和上面的处理器具有特殊指令,可确保设置或清除“数据可用”标志可以自动完成,以防止竞争条件,而无需禁用全局中断。

nKA ISR 将轮询任务提供的数据。这通常不是问题,因为无论如何都会在 nKA ISR 发生时发生这种情况。

总结 RTOS 和时间敏感的应用程序(如 BLE)可以通过制作非内核感知的时间敏感 ISR 轻松共存。使用与此类似的方案可确保时间关键代码不受 RTOS 存在的影响。同时,RTOS 可以最有效地利用 CPU 来处理时间不敏感的代码。  

      审核编辑:彭静
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分