本节主要介绍以下内容:
1,延时函数介绍(了解)
2,延时函数解析(熟悉)
3,延时函数演示实验(掌握)
4,课堂总结(掌握)
一、延时函数介绍(了解)
函数 | 描述 |
vTaskDelay() | 相对延时 |
xTaskDelayUntil() | 绝对延时 |
相对延时:指每次延时都是从执行函数vTaskDelay()开始,直到延时指定的时间结束
举个例子:从vTaskDelay()的前一句到vTaskDelay()执行结束,延迟100ms。
绝对延时:指将整个任务的运行周期看成一个整体,适用于需要按照一定频率运行的任务
举个例子:任务从开始执行到结束共100ms。
可以看下面这张图,xTimeIncrement就是绝对延时的时间,这三部分加起来就是绝对延时时间。
这个函数在官网里面也有说明:必须任务主体小于延迟时间
(1)为任务主体,也就是任务真正要做的工作
(2)是任务函数中调用vTaskDelayUntil()对任务进行延时
(3)为其他任务在运行
二,延时函数解析(熟悉)
又开始了我们对源码进行解读的时间了,大家有没有觉得解读源码是一件很有成就感的事情呢?
#if ( INCLUDE_vTaskDelay == 1 )
void vTaskDelay( const TickType_t xTicksToDelay )
{
/* 只有在延时时间大于0的时候,
* 才需要进行任务阻塞,
* 否则相当于强制进行任务切换,而不阻塞任务 */
BaseType_t xAlreadyYielded = pdFALSE;
/* A delay time of zero just forces a reschedule. */
if( xTicksToDelay > ( TickType_t ) 0U )
{
configASSERT( uxSchedulerSuspended == 0 );
/* 挂起任务调度器 */
vTaskSuspendAll();
{
/* 用于调试,不用理会 */
traceTASK_DELAY();
/* A task that is removed from the event list while the
* scheduler is suspended will not get placed in the ready
* list or removed from the blocked list until the scheduler
* is resumed.
*
* This task cannot be in an event list as it is the currently
* executing task. */
/* 将任务添加到阻塞态任务列表中 */
prvAddCurrentTaskToDelayedList( xTicksToDelay, pdFALSE );
}
/* 恢复任务调度器运行,
* 调用此函数会返回是否需要进行任务切换 */
xAlreadyYielded = xTaskResumeAll();
}
else
{
mtCOVERAGE_TEST_MARKER();
}
/* Force a reschedule if xTaskResumeAll has not already done so, we may
* have put ourselves to sleep. */
/* 根据标志进行任务切换 */
if( xAlreadyYielded == pdFALSE )
{
portYIELD_WITHIN_API();
}
else
{
mtCOVERAGE_TEST_MARKER();
}
}
#endif /* INCLUDE_vTaskDelay */
/*-----------------------------------------------------------*/
注意:
1. 使用函数 vTaskDelay()进行任务延时时,被延时的任务为调用该函数的任务,及调用该
函数时,系统中正在运行的任务,此函数无法指定将其他任务进行任务延时。
2. 函数 vTaskDelay()传入的参数 xTicksToDelay是任务被延时的具体延时时间,时间的单
位为系统时钟节拍,这里要特别注意,很多 FreeRTOS的初学者可能会一会 此函数延时的时间
单位为微妙、毫秒、秒等物理时间单位,FreeRTOS是以系统时钟节拍作为计量的时间单
位的 ,而系统时钟节拍对应的物理时间长短于 FreeRTOSConfig.h文件中的配置项ConfigTICK_RATE_HZ有关,配置项 configTICK_RATE_HZ是用于配置系统时钟节拍的频率的,
3. 在使用此函数进行任务延时时,如果传入的参数为 0,那表明不进行任务延时,而是强
制进行一次任务切换。
三,延时函数演示实验(掌握)
2.1、实验目的:
学习 FreeRTOS 相对延时和绝对延时 API 函数的使用
2.2、实验设计:
将设计三个任务:start_task、task1、task2
三个任务的功能如下:
- start_task:用来创建task1和task2任务
- task1:用于展示相对延时函数vTaskDelay ( )的使用
- task2:用于展示绝对延时函数vTaskDelayUntil( )的使用
为了直观显示两个延时函数的区别,将使用LED0(PB1) 和 LED1(PB0) 的翻转波形来表示
2.3 实验代码
demo.c
代码明天更新!