政府网站建设自查整改报告,宁波网站优化公司价格,长春网站制作最专业,营销自动化工具相信许多朋友都有过这么一个需求#xff1a;固定一个时间#xff08;周期#xff09;去处理某一件事情。
比如#xff1a;固定间隔10ms去采集传感器的数据#xff0c;然后通过一种算法计算出一个结果#xff0c;最后通过指令发送出去。
你会通过什么方式解决呢#xf…相信许多朋友都有过这么一个需求固定一个时间周期去处理某一件事情。
比如固定间隔10ms去采集传感器的数据然后通过一种算法计算出一个结果最后通过指令发送出去。
你会通过什么方式解决呢
1解决办法
很多人肯定首先想到的是利用定时器定时10ms中断在中断里面处理。
这种利用定时器中断解决的办法在处理程序耗时很短微秒级以下的情况下是可以的。但是如果处理程序耗时较长毫秒级显然在中断里面处理不现实。
因此就引出了今天的绝对延时。在实时操作系统FreeRTOS任务中利用vTaskDelayUntil绝对延时即可完美解决这个问题。
2相对延时和绝对延时的含义
本文拿FreeRTOS中相对延时vTaskDelay函数绝对延时vTaskDelayUntil函数来说明。
相对延时指每次延时都是从执行函数vTaskDelay()开始直到延时指定的时间参数滴答值结束。
绝对延时指每隔指定的时间参数滴答值执行一次调用vTaskDelayUntil()函数的任务。
文字描述可能不够直观理解下面章节结合代码例子、延时值IO高低变化波形、任务执行图来详细讲述一下他们的区别。
3相对延时和绝对延时区别
以实际代码为例说明一个任务中添加一个10ms系统延时然后在执行任务耗时1ms左右例子以延时代替。
相对延时代码 绝对延时代码 提示
1.TestDelay这个延时函数仅仅用于测试延时1ms用于代替采集、算法、发送等耗时时间。
2.两个代码唯一区别在于系统延时不同一个vTaskDelay(10);一个vTaskDelayUntil(xLastWakeTime, 10);
3.系统时钟频率为1000也就是上面系统延时10个滴答即10ms。
看到代码你想到了他们输出结果的差异了吗
来看下结果的差异用PA0这个引脚输出的高低电平得出延时时间。
相对延时结果 绝对延时结果 相对延时周期系统延时10ms 执行任务1ms的时间总共11ms时间。
绝对延时周期即为10ms时间。
4换一种方式看区别
如果上面的区别还没明白再来讲一个更容易理解的区别通过文字 任务执行图来说明。
1.相对延时
先看任务执行图按照上面代码的方式呈现 这里会牵涉到操作系统任务切换、高优先级任务抢占等一些原理若不了解请转移直到了解再回来。
上电TEST任务进入延时阻塞状态此时系统执行其他就绪任务。FreeRTOS内核会周期性的检查TEST任务的阻塞是否达到如果阻塞时间达到则将TEST任务设置为就绪状态如果就绪任务中TEST任务的优先级最高则会抢占CPU再次执行任务主体代码不断循环。
TEST任务每次系统延时都是从调用延时函数vTaskDelay()开始算起的所以叫相对延时。
从上图可以看出
如果执行TEST任务的过程中发生中断或者具有更高优先级的任务抢占了那么TEST任务执行的周期就会变长所以使用相对延时函数vTaskDelay()不能周期性的执行TEST任务。
2.绝对延时 代码中定义的变量xLastWakeTime其实是用来保存上一次的系统计数器值方便检测下一个延时时间是否到来。
和上面相对延时程序执行图比较可以看出系统延时的时间包含了程序执行的时间。即时中途有中断或更高优先级任务打断不会影响下一次执行的时间也就是这个周期不会变当然打断时间不能超过系统延时值。
提示图片中添加了一段话一般来说程序执行时间要小于总间隔时间10ms。
如果打断时间太长回来之后延时都超过了则会立马执行程序不会再延时任务不会再阻塞延时。
理解了吗
------------ END ------------