FreeRTOS学习第7篇--周期性延迟和相对性延迟函数

目录

FreeRTOS学习第7篇--周期性延迟和相对性延迟函数

本文目标:学习与使用FreeRTOS中的延迟函数,主要是学习两个函数的使用。

按照本文的描述,应该可以跑通实验并举一反三。

本文实验条件:拥有C语言基础,装有编译和集成的开发环境,比如:Keil uVision5

时间延迟

在freertos中的时间延迟有两个:vTaskDelayUntil和vTaskDelay,区别如下:

vTaskDelay是相对延时函数,它指定的是从调用该函数后开始计算的延时时间,单位是系统节拍时钟周期。这个函数适合需要固定时间间隔的延时操作,但是它可能受到其他任务和中断的影响,导致下一次执行的时间不准确。

vTaskDelayUntil是绝对延时函数,它指定的是一个绝对的唤醒时间,单位也是系统节拍时钟周期。这个函数适合实现周期性的延时操作,它可以保证任务以固定的频率执行,不受其他因素的干扰。但是如果指定的唤醒时间已经过去,那么该函数会立即返回,不会有延时效果。

vTaskDelay函数原型

c 复制代码
void vTaskDelay( const TickType_t xTicksToDelay );

函数描述:

函数 vTaskDelay 用于任务的延迟。

参数 xTicksToDelay 用于设置延迟的时钟节拍个数,范围 1- 0xFFFFFFFF。延迟时间的最大值在portmacro.h 文件里面有定义:

typedef uint32_t TickType_t;

#define portMAX_DELAY ( TickType_t )0xffffffffUL

即延迟时间的范围是:1- 0xFFFFFFFF

vTaskDelayUntil函数原型

复制代码
void vTaskDelayUntil( TickType_t *pxPreviousWakeTime, 
                      const TickType_t xTimeIncrement ); 

函数描述:

函数 vTaskDelayUntil 用于周期性延迟。

第 1 个参数,存储任务上次处于非阻塞状态时刻的变量地址。

第 2 个参数,周期性延迟时间。

使用这个函数要注意的点:

使用此函数需要在 FreeRTOSConfig.h 配置文件中配置如下宏定义为 1

复制代码
#define INCLUDE_vTaskDelayUntil             1

这个两个的函数使用举例可以看我下面的代码片段

PrintTask_Task任务相关代码片段

c 复制代码
void PrintTask(void *params)
{
	struct TaskPrintInfo *pInfo = params;
	uint32_t cnt = 0;
	OLED_Init();
	TickType_t ticks;
	BaseType_t preTime;
	uint64_t t1, t2;
	
	preTime = xTaskGetTickCount();
	while (1)
	{
		/* 打印信息 */
		if (g_LCDCanUse)
		{
			g_LCDCanUse = 0;
			OLED_ShowString(pInfo->x,pInfo->y,pInfo->name,16);
			OLED_ShowNum((pInfo->x + 8 * 6),pInfo->y,cnt++,4,16);
			g_LCDCanUse = 1;
			mdelay(cnt & 0x07);  // 简单限制  模拟干一些活  使得运行PrintTask这个函数有不一样的时长
		}
		

		t1 = system_get_ns();
		ticks = 500 / portTICK_PERIOD_MS;
		vTaskDelayUntil(&preTime, ticks);   // 绝对延迟 打印出来的时间差是跟下面的时间差有区别
//		vTaskDelay(ticks);  // 相对延迟函数 会进行Block 
		t2 = system_get_ns();
		
		OLED_ShowNum((pInfo->x + 8),pInfo->y + 16,t2-t1,9,16);
		OLED_Refresh();     
		
	}
}
c 复制代码
 xTaskCreate(PrintTask, "task1", 128, &g_Task1Info, osPriorityNormal, NULL);
c 复制代码
static struct TaskPrintInfo g_Task1Info = {0, 0,   "Task1"};

实验现象

下载代码到板子上,使用vTaskDelay的相对延迟函数时,我显示的时间差始终是稳定的,我使用vTaskDelayUntil的绝对延迟时,我显示的时间差就有部分变化。

本文中使用的测试工程

相关推荐
茯苓gao1 小时前
嵌入式开发笔记:电机参数辨识与自学习完全指南——从电气参数到机械特性的深度解析
笔记·嵌入式硬件·学习
西安景驰电子1 小时前
PCIe 授时卡原理及应用
运维·服务器·windows·单片机·嵌入式硬件·fpga开发
派勤电子2 小时前
5G物联网网关工控主板选型指南(超小尺寸工业级嵌入式硬件解决方案)
嵌入式硬件·工业网关·工控主板·工控主板选型·嵌入式工控主板·5g物联网网关·超小尺寸工控主板
&Hello Code3 小时前
2.一套可落地的 STM32 六层架构:基础工程框架搭建
stm32·嵌入式硬件·架构
sramdram3 小时前
高速低功耗stt-mram工业级存储方案
嵌入式硬件·mram·stt-mram·低功耗stt-mram
躺不平的理查德4 小时前
STM32 上拉和下拉
stm32·单片机·嵌入式硬件
嘶哈哈哈5 小时前
雷迅 CAN Babel 新品测评:一个小巧的 CAN/UART 双功能 USB 调试适配器
单片机·嵌入式硬件
Zevalin爱灰灰6 小时前
模拟信号链电路——感应触摸电路
单片机·嵌入式硬件
测试专家6 小时前
PCI-1553B板卡在 Windows Server 2016 服务器安装流程详解
服务器·windows·单片机
国科安芯6 小时前
还是4位?ASC8T245S 与 ASC4T245S 的双向电平转换选型实战
单片机·嵌入式硬件·物联网·fpga开发·机器人·云计算