[5-6] 两个Delay函数

在本节课程中,我们将深入了解如何使用延时函数以及它们在多任务调度中的作用。通过这次学习,你将掌握两个不同类型的延时函数——vtaskdelayxtaskdelayuntil,并了解它们在任务调度和周期性任务管理中的实际应用。

1. 延时函数的基本概念

在任务调度过程中,我们常常需要让任务等待一段时间再继续执行。这时,延时函数就派上了用场。通常,我们有两种延时函数:vtaskdelayxtaskdelayuntil,它们的工作方式有所不同,适用于不同的场景。

1.1 vtaskdelay函数

vtaskdelay是一个常用的延时函数,它会让任务进入阻塞状态,直到指定的时间过去后,它才会重新进入就绪状态并准备运行。与传统的死循环延时不同,vtaskdelay允许其他任务在这段时间内获得CPU执行时间。

工作原理:
  • 任务调用vtaskdelay(x)时,它会阻塞x个tick。
  • 当tick中断次数达到指定值时,任务会变为就绪状态,等待调度器选择执行。

1.2 xtaskdelayuntil函数

xtaskdelayuntil函数与vtaskdelay类似,但它的工作方式有所不同。它不仅延时,还能确保任务周期性执行,间隔时间是固定的。

工作原理:
  • 任务调用xtaskdelayuntil(startTime, period)时,必须传入一个起始时间和一个周期
  • 每次任务被调度时,xtaskdelayuntil会确保任务的执行时间间隔是固定的,而不是像vtaskdelay那样受任务执行时间的影响。

2. vtaskdelayxtaskdelayuntil的区别

两者虽然都用于延时,但在实现和适用场景上有所不同。

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 调度机制

vtaskdelayxtaskdelayuntil的使用过程中,调度机制确保了任务延时后能够被唤醒并继续执行。每个任务的延时时间是以tick为单位,而tick的产生依赖于系统时钟的中断。

4.2 优先级和调度

在任务延时期间,调度器会检查所有就绪状态的任务,并根据优先级来决定下一个运行的任务。如果当前任务的优先级较低,它将被推迟执行,直到有其他任务完成或当前任务的延时时间达到。

5. 总结

通过本节课的学习,我们深入了解了两种常用的延时函数:vtaskdelayxtaskdelayuntil。这两者的区别在于:

  • vtaskdelay 用于非周期性的任务延时,任务在延时后会立即进入就绪状态。
  • xtaskdelayuntil 用于周期性任务,确保任务之间的执行间隔固定。

在实际开发中,选择合适的延时函数不仅能提高任务的执行效率,还能避免任务调度中的不确定性,保证系统的稳定性。


希望通过这篇博客,你对这两个延时函数的理解能更加深入,并且能够在实际项目中灵活应用它们。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐