【FreeRTOS学习 – vTaskDelay 与 xTaskGetTickCount】相对延时与绝对延时

  • Post author:
  • Post category:其他





跟着韦东山老师FreeRTOS教学资料的学习记录




FreeRTOS全部项目代码链接(更新中)


https://gitee.com/chenshao777/free-rtos_-study




1. 相对延时函数

void vTaskDelay( const TickType_t xTicksToDelay )


TickType_t 实际上是 uint32_t 的宏



如果定时10ms,可以这么写

void Task(void *pvParameters)
{
	const TickType_t xDelay_10ms = 10 / portTICK_PERIOD_MS;
	for(;;)
	{
		// ......
		// 该任务执行到下面这句,会阻塞10ms
		vTaskDelay(xDelay_10ms);
	}
}


portTICK_PERIOD_MS 代表一个时间片的时间 , 单位毫秒

portTICK_PERIOD_MS 在 portmacro.h 中有定义

#define portTICK_PERIOD_MS			( ( TickType_t ) 1000 / configTICK_RATE_HZ )


configTICK_RATE_HZ 在 FreeRTOSConfig.h 中定义,表示RTOS的系统节拍频率,即1秒内运行的次数,这里是 1000次,即1ms

//RTOS系统节拍中断的频率。即一秒中断的次数,每次中断RTOS都会进行任务调度
#define configTICK_RATE_HZ						  (( TickType_t )1000)


所以这里 RTOS 的 Tick 是1ms




2. 绝对延时函数

/* 获取当前系统时间 */
void Task(void *pvParameters)
{
	/* 获取当前系统时间 */
	u32 lastWakeTime = xTaskGetTickCount();  
	const TickType_t xDelayUntil_10ms = 10 / portTICK_PERIOD_MS;
	for(;;)
	{
		// ......
		// 该任务会以每10ms运行一次的频率运行
		vTaskDelayUntil(&lastWakeTime, xDelayUntil_10ms); //100Hz(10ms控制一次)
	}
}


vTaskDelayUntil 与 vTaskDelay 的区别



  • 相对延时是指每次延时都是从任务执行函数vTaskDelay()开始,延时指定的时间结束;



  • 绝对延时是指每隔指定的时间,执行一次调用vTaskDelayUntil()函数的任务,即以固定频率运行。



版权声明:本文为HuangChen666原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。