RTOS删除练习中显式堆栈的替代方法?

Emb*_*ike 6 architecture embedded multithreading rtos

在基于ARM7的C上编程的嵌入式应用程序(具有可移植性要求)中,当前使用基于商业优先级的抢占式RTOS,我们需要根据客户要求删除该RTOS和任何RTOS依赖关系.我们有8个任务使用许多HW接口,睡眠语句,I2C通信.实际上,SW很好地利用了RTOS功能来简化代码,尽管在没有RTOS的情况下可以管理时序要求.

几个函数,包括在许多地方调用的例程,当前实现阻塞(对于该线程)调用I2c驱动程序函数,睡眠语句等的序列.基于对客户不接受对I2C调用/休眠进行轮询的前提,此类调用必须然后是非阻塞并返回.问题当然是"返回"到"声明",当I2C完成或睡眠时间已经过去时,可能从顶层任务进入4次调用.

我正在为每项任务收集分层状态机设计,并在顶部安装一个简单的调度程序.但是处理几个例程,用于制作当时阻塞调用的序列,现在变成每个状态机,可以在几个地方和不同的函数调用深度调用,似乎需要为每个任务提供显式的堆栈功能,以便每次我启动子状态机时,我都可以为该进程分配状态并将它们推送到该任务的"状态堆栈",以便下一个调度程序对该任务的调用将能够完成所有分层状态继续处理它"停止"的地方.

您是否可以看到适用于该问题的其他设计架构,将代码快速移植到非抢占式范例的注意事项,或者指向富含思想的资源以及有关"RTOS移除"技术和设计的讨论?


这三个答案共同描绘了基于状态机的开发相关性和相关工具的良好画面,以避免重新发明轮子.我们的客户不会获得任何形式的许可,包括GPL.从答案中可以看出,如果想要使用没有RTOS的分层状态机并且禁止轮询呼叫,则无法绕过缓存状态.由于分层SM通过保留其结构(对例程的函数调用变为子状态机的调用)来帮助移植现有代码,所以我将使用提供的工具作为好例子.- 谢谢.

Dan*_*Dan 5

你有没有看过Adam Dunkels的Protothreads?他称之为"C中的轻量级,无堆叠线程"

我不是重新发明轮子,而是直接在线直接引用protothreads网站:

Protothread是非常轻量级的无堆栈线程,专为严重的内存受限系统而设计,例如小型嵌入式系统或无线传感器网络节点.Protothreads为在C中实现的事件驱动系统提供线性代码执行.Protothreads可以在有或没有底层操作系统的情况下使用,以提供阻塞事件处理程序.Protothreads提供顺序的控制流,无需复杂的状态机或完整的多线程.

我使用过Protothreads和Samek的QP HSM - 它们都是重叠域问题的好方法.为此我可能倾向于protothreads.

你提到消除商业RTOS.想知道这是因为代码空间,成本,工程师学习曲线,性能.​​.....你能用其中一个(多个)免费替换RTOS吗?我猜不是,但问问题并没有坏处.

PS Dunkels还有一个很棒的网站,为嵌入式开发人员提供了大量有用的资源和软件 - 检查出来(Contiki,协议栈等).


Dou*_*rie 4

使用IAR VisualState等工具,您可以为分层状态机生成代码,而无需单独的堆栈。有一个免费的SMC,效率稍低,功能较少,而且不支持漂亮的 UML StateChart 图片。

您还可以将状态机手动编码为带有 switch 语句和静态变量的函数来保存状态。

有一些基于轻量级状态机的伪线程库可以使用 C 宏来执行此操作。查看原型线程