[5-6] 两个Delay函数
vtaskdelay和。vtaskdelay用于非周期性的任务延时,任务在延时后会立即进入就绪状态。用于周期性任务,确保任务之间的执行间隔固定。在实际开发中,选择合适的延时函数不仅能提高任务的执行效率,还能避免任务调度中的不确定性,保证系统的稳定性。希望通过这篇博客,你对这两个延时函数的理解能更加深入,并且能够在实际项目中灵活应用它们。
[5-6] 两个Delay函数
在本节课程中,我们将深入了解如何使用延时函数以及它们在多任务调度中的作用。通过这次学习,你将掌握两个不同类型的延时函数——vtaskdelay和xtaskdelayuntil,并了解它们在任务调度和周期性任务管理中的实际应用。
1. 延时函数的基本概念
在任务调度过程中,我们常常需要让任务等待一段时间再继续执行。这时,延时函数就派上了用场。通常,我们有两种延时函数:vtaskdelay和xtaskdelayuntil,它们的工作方式有所不同,适用于不同的场景。
1.1 vtaskdelay函数
vtaskdelay是一个常用的延时函数,它会让任务进入阻塞状态,直到指定的时间过去后,它才会重新进入就绪状态并准备运行。与传统的死循环延时不同,vtaskdelay允许其他任务在这段时间内获得CPU执行时间。
工作原理:
- 任务调用
vtaskdelay(x)时,它会阻塞x个tick。 - 当tick中断次数达到指定值时,任务会变为就绪状态,等待调度器选择执行。
1.2 xtaskdelayuntil函数
xtaskdelayuntil函数与vtaskdelay类似,但它的工作方式有所不同。它不仅延时,还能确保任务周期性执行,间隔时间是固定的。
工作原理:
- 任务调用
xtaskdelayuntil(startTime, period)时,必须传入一个起始时间和一个周期。 - 每次任务被调度时,
xtaskdelayuntil会确保任务的执行时间间隔是固定的,而不是像vtaskdelay那样受任务执行时间的影响。
2. vtaskdelay和xtaskdelayuntil的区别
两者虽然都用于延时,但在实现和适用场景上有所不同。
2.1 vtaskdelay的特性
- 适用场景:适用于那些只需要延时一段时间而不关心周期性执行的任务。
- 工作方式:每次延时指定的tick数,在此期间任务不会占用CPU资源。
- 调度:任务延时后,立即进入就绪状态,等待调度器选择执行。
2.2 xtaskdelayuntil的特性
- 适用场景:适用于需要周期性执行的任务,确保任务之间的间隔时间是固定的。
- 工作方式:基于起始时间和周期的固定间隔,确保任务的执行时间是恒定的。
- 调度:任务会被延时到下一个固定时间点,确保任务在每个周期的相同位置被调度。
3. 示例分析
让我们通过代码示例来看看这两个延时函数的具体表现。
3.1 使用vtaskdelay进行延时
假设我们有一个函数doSomething,每次执行后需要延时5个tick。
void doSomething(void) {
// 执行某些操作
vTaskDelay(5); // 延时5个tick
}
每次调用doSomething,它会执行一定的操作后延时5个tick。这个过程是非周期性的,执行时间会根据操作本身的持续时间不同而有所变化。
3.2 使用xtaskdelayuntil进行周期性延时
如果我们希望确保doSomething每隔15个tick执行一次,可以使用xtaskdelayuntil。
void doSomething(void) {
TickType_t xLastWakeTime = xTaskGetTickCount();
while (1) {
// 执行某些操作
xTaskDelayUntil(&xLastWakeTime, 15); // 每15个tick执行一次
}
}
在这个例子中,doSomething每次执行后的时间间隔是固定的,确保每次执行时间间隔为15个tick,即使操作执行时间不同。
4. 调度和延时函数
延时函数不仅仅是让任务等待的工具,它们在任务调度中起到了非常重要的作用。通过合理使用延时函数,我们可以确保任务调度的公平性,并且给系统中的其他任务留出执行的机会。
4.1 调度机制
在vtaskdelay和xtaskdelayuntil的使用过程中,调度机制确保了任务延时后能够被唤醒并继续执行。每个任务的延时时间是以tick为单位,而tick的产生依赖于系统时钟的中断。
4.2 优先级和调度
在任务延时期间,调度器会检查所有就绪状态的任务,并根据优先级来决定下一个运行的任务。如果当前任务的优先级较低,它将被推迟执行,直到有其他任务完成或当前任务的延时时间达到。
5. 总结
通过本节课的学习,我们深入了解了两种常用的延时函数:vtaskdelay和xtaskdelayuntil。这两者的区别在于:
vtaskdelay用于非周期性的任务延时,任务在延时后会立即进入就绪状态。xtaskdelayuntil用于周期性任务,确保任务之间的执行间隔固定。
在实际开发中,选择合适的延时函数不仅能提高任务的执行效率,还能避免任务调度中的不确定性,保证系统的稳定性。
希望通过这篇博客,你对这两个延时函数的理解能更加深入,并且能够在实际项目中灵活应用它们。
更多推荐



所有评论(0)