当前位置: 首页 > 科技观察

RTOS相对延时和绝对延时的区别

时间:2023-03-17 12:30:32 科技观察

嵌入式软件代码中的延时很常见,但是延时有很多种,看你用什么延时。Adelayproblem问题:周期性(固定时间)去处理某件事。你将如何实现它?例如:每隔10ms采集传感器数据,然后通过算法计算出一个结果,最后通过串口发送出去。可能对于很多习惯了裸机编程的读者来说,首先想到的就是:用定时器设置一个10ms的中断,在中断中处理。中断函数适合处理简单的数据,不适合算法、通信等需要较长CPU时间的处理。定时器适用于对计时精度要求高的地方。像本章提到的周期性采集传感器数据,要求不是很高,所以引入本文提到的绝对延迟。在实时操作系统FreeRTOS任务中,使用vTaskDelayUntil绝对延时可以完美解决这个问题。相对延迟和绝对延迟的含义本文使用FreeRTOS中的相对延迟函数vTaskDelay和绝对延迟函数vTaskDelayUntil来说明。相对延迟:表示每次延迟从执行函数vTaskDelay()开始,直到延迟指定的时间(参数:tick值)结束。绝对延时:指每隔指定时间(参数:tick值)执行一个调用vTaskDelayUntil()函数的任务。文字描述可能不够直观,难以理解。后面的章节会结合代码示例、延时值(IO高低变化波形)、任务执行图详细描述它们的区别。相对延迟和绝对延迟的区别以实际代码为例进行说明:给一个任务添加10ms的系统延迟,然后执行该任务(大约需要1ms,例子中用延迟代替)。相对延时代码:绝对延时代码:说明:延时函数TestDelay仅用于测试(延时1ms),用于替代耗时的采集、算法、发送。两段代码唯一的区别就是系统延时不同,一个是vTaskDelay(10);和一个vTaskDelayUntil(&xLastWakeTime,10);系统时钟频率为1000,即上述系统延时为10个ticks,即10ms。看代码,你有没有想到他们输出的区别?下面看一下结果的区别:利用PA0引脚输出的高低电平,得到延时时间。相对延迟结果:绝对延迟结果:结果为:相对延迟周期为系统延迟10ms+任务执行时间1ms,共11ms。绝对延迟时间为10ms。换个角度看区别。如果上面的区别还不清楚,我们说一个更容易理解的区别,用文字+任务执行图来解释。1.先看相对延迟的任务执行图,按照上面的代码呈现:这里会涉及到操作系统任务切换,高优先级任务抢占等一些原理。如果您不明白,请转至您理解后再回来。上电后,TEST任务进入延迟(阻塞)状态,此时系统执行其他就绪任务。FreeRTOS内核会周期性的检查是否达到了TEST任务的阻塞。如果达到阻塞时间,TEST任务将被设置为就绪状态。如果就绪任务中TEST任务的优先级最高,则会抢占CPU,重新执行任务主代码。继续循环。TEST任务的每个系统延迟都是从延迟函数vTaskDelay()的调用中计算出来的,所以称为相对延迟。从上图可以看出,如果TEST任务在执行过程中发生中断,或者优先级更高的任务被抢占,那么TEST任务的执行周期就会变长,所以使用相对延时函数vTaskDelay(),您不能定期执行测试任务。2、绝对延时代码中定义的变量xLastWakeTime,实际上是用来保存上一次的系统计数器值(方便检测下一个延时时间的到来)。对比上面的相对延迟程序执行图,可以看出系统延迟时间包含了程序执行时间。即使中间出现中断,或者更高优先级的任务中断,也不会影响下一次执行时间(即这个周期不会改变,当然中断时间不能超过系统延时值)。提示:已在图片中添加一段:一般来说,程序的执行时间小于总间隔时间(10ms)。如果中断时间过长,返回后超过延时,程序将立即执行,不再延时(任务不再阻塞延时)。