在基于ARM7 (带有可移植性要求)的C上编程的嵌入式应用程序中,目前使用的是基于商业优先级的抢占式实时操作系统,我们需要根据客户的要求删除该实时操作系统和任何实时操作系统依赖项。我们有8个任务使用许多HW接口,睡眠语句,I2C通信。实际上,SW很好地利用了RTOS特性来简化代码,尽管没有RTOS的时间要求是可以管理的。
一些函数,包括在许多地方调用的例程,目前实现了对I2c驱动程序函数、睡眠语句等的阻塞序列调用。基于对I2C调用/睡眠的轮询不能为客户所接受的前提,这类调用必须是非阻塞的并返回。当然,问题是“返回”到“语句”,可能是在I2C完成或睡眠时间过去时,从顶级任务条目中向下调用4个。
我正在向每个任务的分层状态机设计靠拢,上面有一个简单的调度程序。但是处理几个例程,这些例程过去会产生阻塞调用的序列,现在变成了一个状态机,可以在多个地方和不同的函数调用深度被调用,这似乎需要为每个任务提供一个显式的堆栈特性,这样每次我启动子状态机时,我都可以为该进程分配状态,并将它们推到该任务的“状态堆栈”上,这样,下一个调度器调用该任务时,就能够在所有分层状态下继续处理它“结束”的地方。
您能看到适用于这个问题的其他设计架构,快速将代码移植到非抢占模式的考虑,还是指向丰富思想的资源和关于“RTOS-去除”技术和设计的讨论?
这三个答案合在一起描绘了基于状态机的开发相关性和相关工具的良好图景,以避免重新发明轮子。我们的客户不会获得任何许可,包括GPL。从答案来看,如果您想使用没有RTOS的分层状态机,并且禁止轮询调用,那么缓存状态就没有办法了。由于分层SM通过保存现有代码的结构(对例程的函数调用变成对子状态机的调用)来移植现有代码,我将使用提供的工具作为良好的示例。-谢谢.
发布于 2009-07-08 14:50:46
使用诸如IAR visualState这样的工具,您可以为分层状态机生成代码,而不需要单独的堆栈。有一个免费的SMC,它的效率有点低,功能更少,而且不支持漂亮的StateChart图片。
您还可以将代码状态机作为函数传递给开关语句和静态变量来保持状态。
有一些基于轻量级状态机的伪线程库可以使用C宏来实现这一点。查看原螺纹
发布于 2009-07-09 03:48:12
你查过亚当·邓克尔斯了吗?他称它们为“C中的轻量级、无堆栈线程”。
与其重新发明轮子,我将在这里直接引用原线程站点的一点内容:
Proto螺纹是为内存严重受限的系统(如小型嵌入式系统或无线传感器网络节点)设计的极其轻量级的无堆栈线程。Proto螺纹为用C实现的事件驱动系统提供线性代码执行。Proto螺纹可以与底层操作系统一起使用,也可以与底层操作系统一起使用,以提供阻塞事件处理程序。Proto螺纹不需要复杂的状态机或完全多线程,就可以提供顺序控制流.
我使用过Proto螺纹&Samek的QP -它们都是解决重叠域问题的好方法。为此,我可能会倾向于原丝。
你说过取消商业实时操作系统。想知道这是不是因为代码空间,成本,工程师学习曲线,性能.你能把RTOS换成(很多)免费的吗?我想没有但问也没什么坏处。
P.S.Dunkels还有一个为嵌入式开发人员提供大量有用的资源和软件的优秀网站--查看它(Contiki,协议栈等)
发布于 2009-07-08 20:53:53
我强烈建议看米罗·萨梅克的量子程序设计框架。他有一个最有效率的高速机床,运行在许多平台上,如ARM7。他还具有不同层次的复杂框架,以满足您的需要。我也建议你抓住他的书“C/C++中的实用StateCharts”。他在C和C++中都有一个分层状态机。这个框架的美妙之处在于,从UML或状态图以一定的效率从UML或状态图转到实际代码并不难。这个框架可以作为自己的调度程序运行,也可以在RTOS旁边使用。
实际上,我已经在C++中实现了我自己的HSM,这是我公司的一个国产实时操作系统,并取得了一些成功。我使用了许多Samek的设计原则,但由于GPL (免费版本)和商业许可证的定价(非GPL),没有使用他的代码。
https://stackoverflow.com/questions/1098544
复制相似问题