首先介绍一下我的问题的背景和细节:

我工作的公司目前使用的平台是 Microchip PIC32 系列,使用 MPLAB IDE 作为我们的开发环境。此前,我们还为同一应用的 Microchip dsPIC 和 TI MSP 系列编写了固件。固件非常简单,代码分为三个主要模块:设备控制、数据采样和用户通信(通常是用户 PC)。设备控制是通过 GPIO 总线线路和至少一个需要 SPI 或 I2C 控制的部分的某种组合来实现的。数据采样由中断驱动,使用定时器模块来维持采样频率,并使用更多 SPI/I2C 和 GPIO 总线来控制采样硬件(即ADC)。目前,用户通信是使用 Microchip 应用框架通过 USB 实现的。


那么现在的问题是:鉴于我上面的描述,我什么时候会考虑在我的项目中使用 RTOS?目前我正在考虑这些可能的触发点作为使用 RTOS 的原因:

  • 代码复杂度? 代码库架构/组织仍然足够小,我可以将所有细节保留在脑海中。
  • 多任务/线程? 目前,通过中断对模块执行进行时间切片足以满足多任务处理的需要。
  • 测试? 目前,我们没有对硬件烟雾测试进行太多正式测试或验证(我希望在不久的将来纠正这一点)。
  • 沟通? 目前,我们使用自定义数据包格式和协议,该协议几乎仅执行 START、STOP、SEND DATA 命令,且数据为二进制 blob。
  • 项目范围? 在不久的将来,我们有可能会开展一个项目,将我们的设备集成到更大的系统中,目标是将该系统投入大规模生产。目前,我们所有的项目都是实验原型,大约一个月的快速周转,一次生产一到两个单位。

您认为我还应该考虑哪些其他要点?根据您的经验,是什么说服(或迫使)您考虑使用 RTOS,而不是仅在基本运行时上运行代码?关于 RTOS 设计/编程的其他资源的指针也非常受欢迎。

有帮助吗?

解决方案

您可能想要使用 RTOS 的原因有很多。它们多种多样,而且很难说它们在多大程度上适用于您的情况。(笔记:我倾向于这样思考:实时操作系统 暗示 硬实时 暗示 抢占式内核...)

  • 速率单调分析 (RMA) - 如果你想使用 速率单调分析 为了确保满足您的时间期限,您必须使用抢占式调度程序

  • 满足实时截止日期 - 即使不使用 RMA,通过基于优先级的抢占式 RTOS,您的调度程序也可以帮助确保满足最后期限。矛盾的是,RTOS 通常会增加 中断延迟 由于 临界区 在内核中,中断通常被屏蔽

  • 管理复杂性 —— 当然,RTOS(或大多数操作系统风格)可以帮助解决这个问题。通过允许项目分解为独立的线程或进程,并使用操作系统服务,如消息队列、互斥体、信号量、事件标志等。为了沟通和同步,您的项目(根据我的经验和观点)变得更易于管理。我倾向于从事较大的项目,大多数人都了解保护共享资源的概念,因此不会发生很多新手错误。但请注意,一旦采用多线程方法,事情可能会变得更加复杂,直到您完全解决问题为止。

  • 使用第 3 方包 - 许多 RTOS 提供其他软件组件,例如协议栈、文件系统、设备驱动程序、GUI 包、引导加载程序和其他中间件,通过成为几乎更像“集成商”而不是 DIY 商店,帮助您更快地构建应用程序。

  • 测试 - 是的,当然,您可以将每个控制线程视为具有定义良好的接口的可测试组件,特别是如果使用一致的方法(例如始终阻塞在消息队列上的单个位置)。当然,这并不能替代单元、集成、系统等。测试。

  • 鲁棒性/容错性 - RTOS 还可以为处理器的 MMU 提供支持(在您的 PIC 情况下,我认为这不适用)。这允许每个线程(或进程)在自己的受保护空间中运行;线程/进程不能“深入”彼此的内存并践踏它。甚至设备区域 (MMIO) 也可能禁止某些(或全部)线程访问。严格来说,您不需要 RTOS 来利用处理器的 MMU(或 MPU),但这两者可以很好地协同工作。

一般来说,当我可以使用 RTOS(或某种类型的抢占式多任务处理程序)进行开发时,结果往往会更干净、更模块化、更良好且更易于维护。当我有选择时,我会使用其中一个。

请注意,多线程开发有一定的学习曲线。如果您是 RTOS/多线程开发新手,您可能会对有关以下内容的一些文章感兴趣: 选择 RTOS, 先发制人的危险抢占式多任务处理简介.

最后,即使你没有寻求建议......除了众多的商业 RTOS 之外,还有免费产品(自由实时操作系统 是最受欢迎的之一),并且 量子平台 是一个基于事件驱动概念的框架 活动对象 其中包括一个抢占式内核。有 有很多选择, ,但我发现拥有源代码(即使 RTOS 不是免费的)是有利的,尤其是。调试时。

其他提示

RTOS,首先也是最重要的是允许您组织您的 并行流 到一组任务中,它们之间具有明确定义的同步。

IMO,非 RTOS 设计仅适用于单流架构,其中所有程序都是一个大的无限循环。如果您需要多流程(多个任务并行运行),那么使用 RTOS 会更好。如果没有 RTOS,您将被迫在内部实现此功能,重新发明轮子。

代码重用 -- 如果您使用 RTOS API 编写驱动程序/协议处理程序,它们可能会更容易地插入到未来的项目中

调试 -- 一些 IDE(例如 IAR Embedded Workbench)具有可以显示有关正在运行的进程的实时数据的插件,例如任务 CPU 利用率和堆栈利用率

如果有任何实时限制,通常您会想要使用 RTOS。如果没有实时限制,常规操作系统可能就足够了。RTOS/OS 提供运行时基础设施,例如消息队列和任务分配。如果您只是寻找可以降低复杂性、提供低级支持并帮助测试的代码,以下一些库可能可以:

  • 标准 C/C++ 库
  • 增强库
  • 可通过芯片制造商获得的库,可提供特定于硬件的支持
  • 商业图书馆
  • 开源库

除了前面提到的几点之外,如果您需要支持,使用 RTOS 也可能很有用

  • 标准存储设备(SD、CF、磁盘驱动器...)
  • 标准通信硬件(以太网、USB、火线、RS232、I2C、SPI...)
  • 标准通信协议(TCP-IP,...)

大多数 RTOS 提供这些功能或可扩展以支持它们

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top