|嵌入式开发:开发人员在使用 RTOS 时面临的 5 个挑战

|嵌入式开发:开发人员在使用 RTOS 时面临的 5 个挑战

实时操作系统 (RTOS) 正在成为大多数嵌入式开发人员需要在其应用程序中使用的必要组件 。 随着他们的微控制器转向 32 位架构以及他们的设备开始连接到互联网 , 曾经是传统裸机开发人员的开发人员开始过渡到使用 RTOS 。 无论你是刚刚开始使用 RTOS 还是已经使用多年 , 开发人员在使用 RTOS 时都会面临一些挑战 。

挑战 #1 – 决定何时使用 RTOS
裸机开发人员面临的首要挑战是决定何时使用 RTOS 。 事实上 , 在需要进行切换之前 , 开发人员可以做很多事情来模拟抢占式调度 。 那么 , 有哪些关键指标表明 RTOS 是正确的选择? 以下是开发人员应考虑的几个问题:
应用程序是否包含连接堆栈 , 例如 USB、WiFi、TCP/IP 等?
使用 RTOS 会简化系统时间管理吗?
如果使用 RTOS , 应用程序管理和维护会得到改善吗?
是否需要确定性行为?
程序任务是否需要相互抢占的能力?
MCU 是否具有至少 32 kB 的代码空间和 4 kB 的 RAM?
如果大多数问题的答案是肯定的 , 那么使用 RTOS 将有助于简化应用程序开发 。
挑战 #2 – 设定任务优先级
选择任务优先级可能是一项挑战 。 哪个任务应该具有最高优先级? 下一个最高? 甚至可以安排任务吗? 这些是使用 RTOS 的嵌入式开发人员经常想到的问题 。 不少开发人员似乎只是根据他们认为任务的重要性随机分配优先级 。 以这种方式选择优先级是灾难的根源 。 开发人员应该首先使用速率单调调度来大致了解他们的周期性任务是否可以成功调度 。 RMS 假设任务是周期性的并且不会相互交互 , 因此它只是一个起点 , 但可以让开发人员完成 80% 的工作 。 之后 , 开发人员可以使用跟踪工具来观察他们的系统行为并进行微调 。

挑战#3——调试
调试嵌入式系统是一项重大挑战 。 开发人员可以花费 20% 到 80% 的开发周期来调试他们的应用程序代码 , 平均通常在 40% 左右 。 那是花费大量时间进行调试 。 使用 RTOS 会使调试复杂化 。 RTOS 可能会引入诸如优先级反转、死锁和任务抖动等问题 。 刚开始使用 RTOS 的开发人员可能没有意识到可以使用全新的调试技术(例如跟踪)来调试他们的系统 。 这些工具可以记录任务开始和结束执行的时间以及事件发生的时间 , 例如数据被放入消息队列或互斥锁被锁定 。 甚至可以使用跟踪工具来验证应用程序是否按预期执行 。 不用说 , 调试是每个开发团队都面临并需要解决的大问题 。
挑战#4——管理记忆
开发人员面临的一个重要挑战是管理内存 。 使用 RTOS 时 , 内存管理有几个层次 。 首先 , 如果开发人员使用资源受限的设备 , 他们可能需要配置他们的 RTOS 以最小化代码大小 。 通常 RTOS 优化需要调整 RTOS 配置文件以禁用使用大量代码空间或 RAM 的功能 。 其次 , 嵌入式开发人员需要正确管理他们的 RTOS 对象以及他们如何在系统中分配内存 。 使用堆和字节池可能会导致不确定的行为以及内存碎片 。 使用 RTOS 默认堆栈大小可能会导致使用过多 RAM , 或者更糟糕的是 , 堆栈溢出 。 这些问题可以通过执行最坏情况堆栈分析和使用块内存池来解决 , 但这并不能使问题变得微不足道 。
挑战#5——学习曲线
从裸机编码技术切换到 RTOS 环境的开发人员经常在学习 RTOS 方面遇到困难 。 网络上和书籍中有很多很棒的材料 , 它们提供了有关主要 RTOS 对象以及如何使用它们的想法 , 但是拥有 RTOS 应用程序的理论知识是一回事 。 设计和实现一个真正的应用程序并解决所有的细微差别和问题是另一回事 。 进行过渡的开发人员应该选择他们最喜欢的开发套件 , 即他们感兴趣的 RTOS 端口 , 然后开始设计一些简单的东西 , 以缩短学习曲线 。