任务调度 - 控制函数的执行

时间:2011-03-22 09:59:05

标签: c embedded scheduling arduino interrupt

在嵌入式项目中,我们应该实现具有不同优先级的任务调度程序,项目实现在C中并在Arduino设备上运行。

现在我们正处于研究阶段,一个问题突然出现,但没有人有足够的经验来得到某个答案:

如何控制功能的执行时间?我们如何在函数返回之前跟踪时间,以便我们可以在例如超时发生时中断它?

一个建议是使用fork(),但由于Arduino不包含操作系统,因此没有内核可以处理线程。还是我错了?

任何输入都会有所帮助,非常感谢,

2 个答案:

答案 0 :(得分:3)

你需要一个计时器。所有非合作多任务系统(即那些不依赖于函数说“你现在可以打断我”的系统)使用计时器在一段时间后停止执行(比如100ms)。

在中断处理程序中,检查是否有另一个“线程”可以运行并切换上下文。

一个非常简单的实现是“就绪列表”:每当任务或线程可以完成某些工作时,将其添加到就绪列表中。

当计时器触发时,在列表末尾添加当前任务,并使列表的头部成为当前任务。

答案 1 :(得分:3)

在嵌入式系统中,任务调度程序是操作系统(通常是RTOS)的核心,因此要求您实现一个而不是来使用它。

Jean Labrosse的启动Micro C/OS-II中描述了这种调度程序如何工作的简单示例。它描述了一个包含调度和IPC的完整RTOS内核。对于您的项目,您可以获取此核心的描述并实现您自己的(或者您可以使用包含的源代码)。

这样的内核通过在某些OS调用和定时器中断时进行调度来工作。上下文切换涉及为一个任务存储处理器寄存器,然后用另一个任务替换teh寄存器。因为该寄存器保存/恢复包括堆栈指针和程序计数器,所以控制在线程之间切换。

可能需要更简单的调度形式(而不是抢占式)调度。一种方法是实现运行完成的任务函数,并在必要时存储它们自己的状态并实现为状态机,然后有一个简单的循环轮询定时器并根据调度表调用每个“任务”函数(即包括任务的周期性和指向其功能的指针,因此假设每秒调用一个函数,而每毫秒调用一个函数。