FreeRTOS中相对延迟和绝对延迟之间的差异

作者|黄微信官方账号|嵌入式软件代码中的“嵌入式列延迟”非常常见,但是取决于您使用的延迟,延迟的类型很多。

1延迟的问题:定期处理某件事(固定时间)。

您将如何实现?例如:以10ms的间隔收集传感器数据,然后通过算法计算结果,最后通过串行端口将其发送出去。

也许对于习惯于裸机编程的许多读者而言,首先想到的是:使用计时器安排10ms的中断并在中断中进行处理。

中断功能适用于处理简单数据,但不适用于需要长时间占用CPU的算法,通信和其他处理。

计时器适用于对计时精度有较高要求的地方。

如本章所述定期收集传感器数据不适合高要求,因此介绍了本文所述的绝对延迟。

在实时操作系统FreeRTOS任务中,使用vTaskDelayUntil绝对延迟可以完美解决此问题。

2相对延迟和绝对延迟的含义本文以FreeRTOS中的相对延迟函数vTaskDelay和绝对延迟函数vTaskDelayUntil进行说明。

相对延迟:这意味着每个延迟都从函数vTaskDelay()的执行开始,直到延迟指定的时间(参数:滴答值)结束。

绝对延迟:指的是每指定时间调用一次vTaskDelayUntil()函数的任务(参数:滴答值)。

文字说明可能不够直观以至于无法理解。

以下各章将结合代码示例,延迟值(IO高低变化波形)和任务执行图详细描述它们之间的差异。

3相对延迟与绝对延迟之间的差异以实际代码为例进行说明:向任务添加10ms的系统延迟,然后执行任务(大约需要1ms,该示例由延迟代替)。

相对延迟代码:绝对延迟代码:说明:1.延迟功能TestDelay仅用于测试(延迟1毫秒),用于代替耗时的采集,算法和传输时间。

2.这两个代码之间的唯一区别是系统延迟,一个vTaskDelay(10);另一个是vTaskDelay(10)。

和一个vTaskDelayUntil(& xLastWakeTime,10); 3.系统时钟频率为1000,即上述系统延迟为10 ticks,即10ms。

看到代码,您是否认为它们的输出有所不同?查看结果之间的差异:使用PA0引脚输出的高电平和低电平来获取延迟时间。

相对延迟结果:绝对延迟结果:结果为:相对延迟的周期是系统延迟10ms +执行任务的时间1ms,总计11ms。

绝对延迟时间为10ms。

4用另一种方式看差异。

如果上述差异尚不清楚,那么我们来谈一谈更容易理解的差异,该差异可以通过文字+任务执行图来解释。

1.相对延迟首先查看任务执行图,并以上述代码的方式进行呈现:这里将涉及一些原理,例如操作系统任务切换,高优先级任务抢占等。

如果您不了解,请转移,直到您理解然后再回来。

上电,TEST任务进入延迟(阻塞)状态,此时系统将执行其他就绪任务。

FreeRTOS内核将定期检查是否达到了对TEST任务的阻止。

如果达到阻止时间,则TEST任务将设置为就绪状态。

如果就绪任务中的TEST任务具有最高优先级,它将抢占CPU并再次执行任务主体代码。

继续循环播放。

每当TEST任务的系统延迟从调用延迟函数vTaskDelay()开始时,就称为相对延迟。

从上图可以看出:如果在执行TEST任务期间发生中断,或者优先级更高的任务被抢占,则TEST任务的执行周期将变长,因此相对延迟函数vTaskDelay( ) 用来。

定期执行测试任务。

2.绝对延迟代码中定义的变量xLastWakeTime实际上用于保存最后的系统计数器值(方便检测下一个延迟时间是否到来)。

与上述相对延迟程序执行图相比,可以看出系统延迟时间包括程序执行时间。

如果中间出现中断,或优先级较高的任务中断,则不会影响下一次执行的时间(也就是说,周期不会改变,当然,中断时间不能超过系统延迟值) 。

提示:在图片中添加了一个段落:一般来说,程序执行时间少于总间隔时间

联系方式

金属膜柱状电阻,又称:晶圆电阻,柱状电阻,色环贴片电阻,无脚电阻,无引线电阻。金属膜柱状电阻介于贴片电阻与直插电阻之间,主要适用于电流较大/耐高压冲击/安全性要求高的高阶电路中,与直插电阻相比,由于去掉了引线,因此很大的降低了直插电阻在高频时引线所产生的寄生电感,同时能够解决直插电阻小阻值中精度与温度系数无法提高的难题,与片状电阻相比,由于更大的表面面积使之耐电流,耐高压的性能大大提升,不论在在功能上,机械结构上,电气特性上,或安全性上,都明显优于常规贴片电阻。

查看详情

在线咨询