本小节介绍怎样在RTOS进行延时。

主要内容

首先要明确的两点:

  • 任务在延时过程中,应当尽可能地让出CPU给其它任务,从而提升CPU地利用率。
  • 应当选择合适的延时方式,保证延时准确度。

所以,在实现任务的延时时,需要考虑以下要素:
任务延时的配置 - 图1

系统延时接口

RTOS提供的系统延时接口采用的是基于系统时钟节拍为基准,结合在《自己动手从0到1写嵌入式操作系统》课程中的描述,这种接口的延时往往精度不高,如下图列出了几种延时不准确的情况。
任务延时的配置 - 图2

软延时

这种方式是通过让CPU执行无效地空指令,白白浪费CPU来执行延时。
任务延时的配置 - 图3
在课程中,提到过这种延时有两大缺点:
具体延时时间难以计算。需要确定具体执行哪些指令,每条指令的执行时间。如果采用C语言编写,开启编译优化后,延时时间发生生变化。
受CPU从Flash取指时间影响、流水线工作影响等。
所以,这种方式很难做到准确的延时。

硬件定时器

采用硬件定时器来软延时,只需要判断定时器的溢出标志位,不需要再统计指令执行时间,也不易受Flash、流水线影响,较为准确和容易,但是仍然会耗用CPU。
任务延时的配置 - 图4
如果不想耗费CPU,可以在定时器中断处理函数中完成。
任务延时的配置 - 图5

重点难点

RTOS上延时问题

无论是采用哪种方式,都会受到系统中更高优先级任务、中断的打断影响,造成最终延时不准确。所以,如果想避免这些因素的影响,可以采用关中断、调度锁等方式来避免,当然缺点就是会影响到整个系统任务调度和中断响应。

具体选择

具体对于某种延时应当选择哪一种,在视频中有举一个案例。

注意事项

没有一种延时方式是同时百分百准确同时没有副作用。在选择用时,需根据实际延时的精度,选择尽可能对系统影响小的选择的一种。

常见问题