作者|黄微信官方账号|嵌入式软件代码中的“嵌入式列延迟”非常常见,但是取决于您使用的延迟,延迟的类型很多。
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实际上用于保存最后的系统计数器值(方便检测下一个延迟时间是否到来)。
与上述相对延迟程序执行图相比,可以看出系统延迟时间包括程序执行时间。
如果中间出现中断,或优先级较高的任务中断,则不会影响下一次执行的时间(也就是说,周期不会改变,当然,中断时间不能超过系统延迟值) 。
提示:在图片中添加了一个段落:一般来说,程序执行时间少于总间隔时间