在一个小型嵌入式系统项目中,我们有一些代码,我们希望在一个线程中运行,因此我们选择在嵌入式RTOS(eCos)之上构建。

以前,我们在main()中使用了一个循环执行程序,它驱动每个作为状态机实现的任务。对于某些任务,我们遇到了需要将任务分解为许多细粒度状态的问题,从而使代码更加复杂。

当切换到RTOS时,如果我们为每个独立的任务提供自己的线程,我们发现每个线程堆栈的内存使用量会快速增加。 (我们只有64k,需要内存用于我们的通信缓冲区)

我们正在考虑使用轮胎进行通信任务,并考虑使用其他线程进行循环执行。循环执行程序将驱动其他逻辑任务。

像这样混合RTOS和循环执行是否有意义?

有帮助吗?

解决方案

这是一个非常有效的设计。
在我们的一个产品中,我们使用了类似的设计,其中异步I / O通道(TCP / IP,2个串行流)在他们自己的任务中,并且我们有一个“主”通道。任务将负责多个功能领域。

将任务简单地视为一种分区机制,可以简化您的设计。

其他提示

是的,在一个运行多个“任务”的操作系统线程中拥有循环执行程序是有意义的。实际上,除非两个任务与调度需求冲突(一个需要阻塞,一个优先级高于另一个,低优先级执行需要很长时间等),我建议将它们放在同一个线程中。

在使用轻量级RTOS且没有内存保护的情况下尤其如此:单独的线程并不比一个线程更安全(没有地址空间的MMU保护),事实上它们可能更危险因为更需要并发保护。即使您的IPC方案是健壮的并且不容易被程序员误用,它的开销通常也不为零,因此避免使用它可以带来性能提升。

如果您查看FreeRTOS ,他们实际上在任务中运行另一个调度程序,类似于: )

为了回应其他人,设计中没有任何错误。没有理由(某些)你的任务不能成为状态机,如果有一种明确的方式来表达某种方式。

这是一个有效的设计,但我想我完全没有使用操作系统的原因。

您打算使用哪些操作系统设施?

从可用信息来看,您最终会将任务的复杂性转移到新的主循环中。

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