物联操作技术应用 6_第1页
物联操作技术应用 6_第2页
物联操作技术应用 6_第3页
物联操作技术应用 6_第4页
物联操作技术应用 6_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章时间管理

Chapter8TimeManagement《物联网操作系统技术与应用》制作人张亚军

在物联网操作系统中,时间是至关重要的。时间管理以系统时钟为基础,给应用程序提供和时间有关的服务。软件定时器提供软件层次的接口,通过软件定时器,系统可以定时、周期性的执行任务。本章将学习LiteOS的时间管理机制,包括系统时钟和软件定时器。前言01040302学习目标能够描述LiteOS系统时钟的计时单位会使用LiteOS中的时间转换、时间统计和时间延迟函数能够说出软件定时器的基本概念能够熟练使用LiteOS中软件定时器的相关函数目录CONTENTS系统时钟软件定时器8.18.2系统时钟8.1SystemClock8.1系统时钟系统时钟是由定时/计数器产生的输出脉冲触发中断而产生的,一般定义为整数或长整数。输出脉冲的周期叫做一个“时钟滴答”。系统时钟也称为时标或者Tick,一个Tick的时长可以静态配置,它是LiteOS的基本时间单位。系统最小的计时单位为Cycle,其时长由系统主频决定,系统主频就是每秒钟的Cycle数,本质上就是对由晶体振荡器产生的时钟周期进行计数,即晶体振荡器在1秒内产生的时钟脉冲个数,也就是时钟周期的频率。Cycle的时长由硬件决定,且无法更改,不同主频的设备对应的Cycle时长是不同的。系统的基本时间单位为Tick,对应的时长由系统主频及每秒Tick数决定,Tick与秒之间的对应关系能够配置。8.1.1系统时钟基本概念

8.1系统时钟用户是以秒、毫秒为单位计时,而芯片CPU的计时是以Tick为单位的,当用户需要对系统操作时,例如任务挂起、延时等,输入秒为单位的数值,此时需要时间管理模块对二者进行转换。LiteOS系统中的时间管理主要提供如下两种功能:时间转换:根据主频实现CPUTick数到毫秒、微秒的转换。时间统计:获取系统Tick数。LiteOS提供的时间转换、时间统计函数如表8-1所示:8.1.2时间转换和统计函数

表8-1LiteOS提供的时间转换、时间统计函数功能分类函数名功能时间转换LOS_MS2Tick毫秒转换成TickLOS_Tick2MSTick转化为毫秒时间统计LOS_CyclePerTickGet每一个Tick多少Cycle数LOS_TickCountGet获取系统当前的Tick数8.1系统时钟1.时间转换函数LOS_MS2Tick()

时间转换函数LOS_MS2Tick()用于将给定的毫秒数转换成对应的Tick数,其语法要点如表8-2所示。表8-2LOS_MS2Tick()函数语法要点函数原型LITE_OS_SEC_TEXT_MINORUINT32LOS_MS2Tick(UINT32uwMillisec)函数传入值uwMillisec:毫秒数函数返回值Tick数:转换后的Tick数错误代码:出错8.1系统时钟2.时间转换函数LOS_Tick2MS()

时间转换函数LOS_Tick2MS()用于将给定的Tick数转换成对应的毫秒数,其语法要点如表8-3所示。表8-3LOS_Tick2MS()函数语法要点函数原型LITE_OS_SEC_TEXT_MINORUINT32LOS_Tick2MS(UINT32uwTick)函数传入值uwTick:Tick数函数返回值毫秒数:转换后的毫秒数错误代码:出错8.1系统时钟3.时间统计函数LOS_CyclePerTickGet()

时间统计函数LOS_CyclePerTickGet()用于获得每一个Tick对应的Cycle数,其语法要点如表8-4所示。表8-4LOS_CyclePerTickGet()函数语法要点函数原型LITE_OS_SEC_TEXT_MINORUINT32LOS_CyclePerTickGet(VOID)函数返回值Cycle数:每Tick对应的Cycle数错误代码:出错8.1系统时钟4.时间统计函数LOS_TickCountGet()

时间统计函数LOS_TickCountGet()用于获得系统当前的Tick数,其语法要点如表8-5所示。表8-5LOS_TickCountGet()函数语法要点函数原型LITE_OS_SEC_TEXT_MINORUINT64LOS_TickCountGet(VOID)函数返回值Tick数:当前Tick数错误代码:出错

注意:(1)获取系统Tick数须要在系统时钟使能以后;(2)时间管理不是单独的功能模块,依赖于los_config.h中的OS_SYS_CLOCK和LOSCFG_BASE_CORE_TICK_PER_SECOND两个配置选项;(3)系统的Tick数在关中断的状况下不进行计数,故系统Tick数不能做为准确时间计算。

任务描述在LiteOS中创建两个任务TransformTime_Task和GetTick_Task,TransformTime_Task任务用作时间转换:将毫秒数转换为Tick数,将Tick数转换为毫秒数。GetTick_Task任务用作时间统计和时间延迟:统计每秒的Cycle数、Tick数和延迟后的Tick数。任务8-1时间转换、统计和延迟 软件定时器SoftwareTimer8.28.2软件定时器硬件定时器受硬件的限制,数量上不足以满足用户的实际需求。为了满足用户需求,提供更多的定时器,HuaweiLiteOS提供了软件定时器功能。8.2.1软件定时器基本概念

软件定时器是基于系统Tick时钟中断,且由软件来模拟的定时器,当经过设定的Tick时钟计数值后触发用户定义的回调函数(类似硬件的中断服务函数)。定时精度与系统Tick时钟的周期有关。

硬件定时器是芯片提供的定时功能,使用硬件定时器时,每次在定时时间到达之后就会自动触发一个中断,用户在中断中处理信息;而使用软件定时器时,需要在创建软件定时器时指定时间到达后要调用的函数(也称超时函数或回调函数),在回调函数中处理信息。

软件定时器扩展了定时器的数量,允许创建更多的定时业务。LiteOS软件定时器支持以下功能:

(1)静态裁剪:能通过宏关闭软件定时器功能;

(2)软件定时器的创建、启动、停止、删除;

(3)软件定时器剩余Tick数获取。8.2软件定时器

软件定时器是系统资源,在模块初始化的时候已经分配了一块连续的内存。系统支持的最大定时器个数由target_config.h中的LOSCFG_BASE_CORE_SWTMR_LIMIT宏配置。软件定时器使用了系统的一个队列和一个任务资源,软件定时器的触发遵循队列规则,先进先出。定时时间短的定时器总是比定时时间长的靠近队列头,满足优先触发的准则。

软件定时器以Tick为基本计时单位,当创建并启动一个软件定时器时,LiteOS会根据当前系统Tick时间及设置的定时时长确定该定时器的到期Tick时间,并将该定时器插入定时器列表。

系统会在SysTick中断处理函数中扫描软件定时器列表,如果有定时器超时,则通过“定时器命令队列”向软件定时器任务发送一个命令,任务在接收到命令就会去处理对应的程序,调用对应软件定时器的回调函数。8.2.2软件定时器运行机制

8.2软件定时器

软件定时器会按唤醒时间升序插入软件定时器列表中,距离唤醒时间最短的软件定时器排在列表头部,距离唤醒时间最长的软件定时器排在尾部。例如,软件定时器列表中一开始只有一个周期为200个Tick的软件定时器A,那么A定时器在200个Tick后就会被唤醒,调用对应的回调函数;此时插入一个周期为100个Tick的软件定时器B,那么100个Tick之后,软件定时器B就会被唤醒,而原来在200个Tick后唤醒的软件定时器A,将会在软件定时器B调用之后的100个Tick唤醒;同理,插入一个周期为50个Tick的软件定时器C也是一样的,如图8-3所示。如果插入的软件定时器C的周期是150个Tick的话,如图8-4。图8-3软件定时器插入队列排序1图8-4软件定时器插入队列排序28.2软件定时器

每个软件定时器都有对应的软件定时器控制块,其都包含了软件定时器的基本信息,如软件定时器的状态、工作模式、计数值、回调函数等信息,软件定时器控制块信息定义在LiteOS源码目录下的\kernel\include\los_swtmr.h文件中,代码结构如下:8.2.3软件定时器控制块

typedefstructtagSwTmrCtrl{structtagSwTmrCtrl*pstNext;UINT8ucState;UINT8ucMode;#if(LOSCFG_BASE_CORE_SWTMR_ALIGN==YES)UINT8ucRouses;UINT8ucSensitive;#endifUINT16usTimerID;UINT32uwCount;UINT32uwInterval;UINT32uwArg;SWTMR_PROC_FUNCpfnHandler;}SWTMR_CTRL_S;8.2软件定时器

软件定时器控制块中包含信息的说明如下:(1)*pstNext:链接下一个SWTMR_CTRL_S结构的指针,单链表形式链接,主要用于将当前控制块链接到空闲链表或排序链表中;(2)ucState:软件定时器的状态,三种状态分别是:OS_SWTMR_STATUS_UNUSED:未使用状态,该控制块处于空闲链表中,初始化时或定时器被删除后均处于该状态;OS_SWTMR_STATUS_CREATED:创建未启动/停止状态,创建成功,已经从空闲链表中取出,但并未加入到排序链表中启动,或者定时器停止,从排序链表取下后均处于该状态;OS_SWTMR_STATUS_TICKING:计数状态,表示定时器被加入到排序链表,正在运行。(3)ucMode:软件定时器的触发模式,三种触发模式分别是:LOS_SWTMR_MODE_ONCE:单次触发模式,启动后只触发一次定时器事件,执行一次回调函数,然后定时器自动删除,重新放回到空闲链表中;LOS_SWTMR_MODE_PERIOD:周期触发模式,周期性的触发定时器事件,直到用户手动停止定时器为止,否则将永远执行下去;LOS_SWTMR_MODE_OPP:表示在一次性计时器完成计时之后,启用周期性软件定时器,此模式目前不支持,为将来预留。8.2软件定时器(4)ucRouses:如果定义了LOSCFG_BASE_CORE_SWTMR_ALIGN==YES,则使能软件定时器唤醒功能;(5)ucSensitive:如果定义了LOSCFG_BASE_CORE_SWTMR_ALIGN==YES,则使能软件定时器对齐功能;(6)usTimerID:软件定时器的ID号,初始化时分配,创建软件定时器成功后返回给用户,用户通过ID号操作对应的软件定时器;(7)uwCount:软件定时器计数,以Tick为单位,在启动定时器(加入到排序链表中)时会设置该计数值,在每个Tick中断中减1,减到0意味着定时时间到;(8)uwInterval:周期性软件定时器的定时间隔;(9)uwArg:软件定时器回调函数的参数;(10)pfnHandler:软件定时器的回调函数,定时时间到时执行该函数。8.2软件定时器

HuaweiLiteOS中软件定时器相关的常用函数及功能如表8-6所示。8.2.4软件定时器函数

表8-6软件定时器相关的常用函数及功能功能分类函数名功能创建/删除定时器LOS_SwtmrCreate创建软件定时器,设置定时器的定时时长、定时器模式、回调函数,并返回定时器IDLOS_SwtmrDelete删除软件定时器启动/停止定时器LOS_SwtmrStart启动软件定时器LOS_SwtmrStop停止软件定时器获得软件定时器剩余Tick数LOS_SwtmrTimeGet获得软件定时器剩余Tick数8.2软件定时器1.软件定时器创建函数LOS_SwtmrCreate()

在使用软件定时器前,需要先创建软件定时器,同时还需要定义一个软件定时器ID变量,用于保存创建成功后返回的软件定时器ID,创建软件定时器的函数为LOS_SwtmrCreate(),其语法要点如表8-7所示。表8-7LOS_SwtmrCreate()函数语法要点函数原型LITE_OS_SEC_TEXT_INITUINT32LOS_SwtmrCreate(UINT32uwInterval,UINT8ucMode,SWTMR_PROC_FUNCpfnHandler,UINT16*pusSwTmrID,UINT32uwArg#if(LOSCFG_BASE_CORE_SWTMR_ALIGN==YES),UINT8ucRouses,UINT8ucSensitive#endif)函数传入值uwInterval:软件定时器的定时时间ucMode:软件定时器的工作模式pfnHandler:软件定时器的回调函数*pusSwTmrID:软件定时器的ID指针uwArg:软件定时器回调函数的传入参数ucRouses:软件定时器唤醒功能ucSensitive:软件定时器对齐功能函数返回值LOS_OK:创建成功错误代码:出错注意:如果不使用ucRouses和ucSensitive参数的话,需要将配置文件target_config.h中的LOSCFG_BASE_CORE_SWTMR_ALIGN设置成NO。8.2软件定时器2.软件定时器删除函数LOS_SwtmrDelete()LiteOS允许用户主动删除软件定时器,被删除的软件定时器不会继续执行,回调函数也无法再次被调用,关于该软件定时器的所有资源都会被系统回收。删除软件定时器的函数为LOS_SwtmrDelete(),其语法要点如表8-8所示。表8-8LOS_SwtmrDelete()函数语法要点函数原型LITE_OS_SEC_TEXTUINT32LOS_SwtmrDelete(UINT16usSwTmrID)函数传入值usSwTmrID:软件定时器的ID函数返回值LOS_OK:删除成功错误代码:出错8.2软件定时器3.软件定时器启动函数LOS_SwtmrStart()

软件定时器创建成功后,其状态从OS_SWTMR_STATUS_UNUSED(未使用状态)变成OS_SWTMR_STATUS_CREATED(创建未启动/停止状态),用户在需要的时候可以启动它。启动软件定时器的函数为LOS_SwtmrStart(),其语法要点如表8-9所示。表8-9LOS_SwtmrStart()函数语法要点函数原型LITE_OS_SEC_TEXTUINT32LOS_SwtmrStart(UINT16usSwTmrID)函数传入值usSwTmrID:软件定时器的ID函数返回值LOS_OK:启动成功错误代码:出错8.2软件定时器4.软件定时器停止函数LOS_SwtmrStop()

软件定时器在不需要使用的时候,可以停止,或者是需要删除某个软件定时器之前,应先把软件定时器停止。停止软件定时器的函数为LOS_SwtmrStop(),其语法要点如表8-10所示。表8-10LOS_SwtmrStop()函数语法要点函数原型LITE_OS_SEC_TEXTUINT32LOS_SwtmrStop(UINT16usSwTmrID)函数传入值usSwTmrID:软件定时器的ID函数返回值LOS_OK:停止成功错误代码:出错

使用软件定时器时需要注意以下几点:(1)软件定时器的回调函数中不应执行过多操作,不建议使用可能引起任务挂起或者阻塞的函数或操作,如果使用,会导致软件定时器响应不及时,造成的影响无法确定;(2)软件定时器使用了系统的一个队列和一个任务资源。软件定时器任务的优先级设定为0,且不允许修改;(3)系统可配置的软件定时器个数是指:整个系统可使用的软件定时器总个数,并非用户可使用的软件定时器个数。例如:系统多占用一个软件定时器,那么用户能使用的软件定时器资源就会减少一个;(4)创建单次不自删除属性的定时器,用户需要自行调用定时器删除接口删除定时器,回收定时器资源,避免资源泄露;(5)软件定时器的定时精度与系统时钟的周期有关。

任务描述在LiteOS中创建两个软件定时器,其中一个软件定时器是单次模式,5000Ticks后调用一次回调函数,另一个软件定时器是周期模式,每1000Ticks调用一次回调函数,在回调函数中输出相关信息。任务8-2软件定时器使用 谢谢观看THANKYOUFORWATCHING任务8-1时间转换、统计和延迟Task8-1TimeConversion,Statistics,andDelay《物联网操作系统技术与应用》制作人张亚军

任务描述在LiteOS中创建两个任务TransformTime_Task和GetTick_Task,TransformTime_Task任务用作时间转换:将毫秒数转换为Tick数,将Tick数转换为毫秒数。GetTick_Task任务用作时间统计和时间延迟:统计每秒的Cycle数、Tick数和延迟后的Tick数。

任务实现1.打开第2章中移植好LiteOS的裸机工程TEST,修改main.c文件,添加头文件。任务8-1时间转换、统计和延迟 26

/*USERCODEBEGINIncludes*/27

/*LiteOS头文件*/28#include"los_sys.h"29#include"los_task.ph"30

/*USERCODEENDIncludes*/2.定义任务ID变量。59

/*USERCODEBEGIN0*/60

/*定义任务ID*/61UINT32TransformTime_Task_Handle;62UINT32GetTick_Task_Handle;3.创建和管理任务TransformTime_Task、任务GetTick_Task。1)定义任务实现函数TransformTime_Task()、GetTick_Task()。任务8-1时间转换、统计和延迟 63

/***********************************************************64*@函数名

:TransformTime_Task65*@功能说明:TransformTime_Task任务实现66*@参数

:NULL67*@返回值

:NULL68***********************************************************/69VOIDTransformTime_Task(void)70{

71UINT32uwMs;72UINT32uwTick;

73uwTick=LOS_MS2Tick(10000);

//10000ms数转换为Tick数74printf("uwTick=%d\n",uwTick);75uwMs=LOS_Tick2MS(100);

//100Ticks数转换为ms数76printf("uwMs=%d\n",uwMs);77

}78

/***********************************************************79*@函数名

:GetTick_Task80*@功能说明:GetTick_Task任务实现81*@参数

:NULL82*@返回值

:NULL83***********************************************************/任务8-1时间转换、统计和延迟 84VOIDGetTick_Task(VOID)85

{86UINT32uwcyclePerTick;87UINT64uwTickCount;88uwcyclePerTick=LOS_CyclePerTickGet();//每个Tick多少Cycle数89

if(0

!=uwcyclePerTick)90

{91printf("LOS_CyclePerTickGet=%d\n",uwcyclePerTick);92

}93uwTickCount=LOS_TickCountGet();//获取Tick数94

if(0

!=uwTickCount)95

{96printf("LOS_TickCountGet=%d\n",

(UINT32)uwTickCount);97

}98LOS_TaskDelay(200);//延迟200Ticks99uwTickCount=LOS_TickCountGet();100

if(0

!=uwTickCount)101

{102printf("LOS_TickCountGetafterdelay=%d\n",

(UINT32)uwTickCount);103

}104

}2)定义任务创建函数Creat_TransformTime_Task()、Creat_GetTick_Task()。任务8-1时间转换、统计和延迟 105/************************************************************106*@函数名

:Creat_TransformTime_Task107*@功能说明:

创建TransformTime_Task任务108*@参数

109*@返回值

无110***********************************************************/111staticUINT32Creat_TransformTime_Task()112{113

//定义一个返回类型变量,初始化为LOS_OK114UINT32uwRet=LOS_OK;

115

//定义一个用于创建任务的参数结构体116TSK_INIT_PARAM_Stask_init_param;

117task_init_param.usTaskPrio=

5;

/*任务优先级,数值越小,优先级越高*/118task_init_param.pcName=

"TransformTime_Task";/*任务名*/119task_init_param.pfnTaskEntry=

(TSK_ENTRY_FUNC)TransformTime_Task;/*任务函数入口*/120task_init_param.uwStackSize=

1024;

/*堆栈大小*/121uwRet=LOS_TaskCreate(&TransformTime_Task_Handle,

&task_init_param);/*创建任务*/122

returnuwRet;123}124/*************************************************************任务8-1时间转换、统计和延迟 125*@函数名

:Creat_GetTick_Task126*@功能说明:

创建GetTick_Task任务127*@参数

128*@返回值

无129************************************************************/130staticUINT32Creat_GetTick_Task()131{132

//定义一个返回类型变量,初始化为LOS_OK133UINT32uwRet=LOS_OK;

134TSK_INIT_PARAM_Stask_init_param;135task_init_param.usTaskPrio=

4;

/*任务优先级,数值越小,优先级越高*/136task_init_param.pcName=

"GetTick_Task";

/*任务名*/137task_init_param.pfnTaskEntry=

(TSK_ENTRY_FUNC)GetTick_Task;/*任务函数入口*/138task_init_param.uwStackSize=

1024;

/*堆栈大小*/

139uwRet=LOS_TaskCreate(&GetTick_Task_Handle,

&task_init_param);/*创建任务*/140

returnuwRet;141}3)定义任务管理函数AppTaskCreate()。任务8-1时间转换、统计和延迟 142/***********************************************************143*@函数名

:AppTaskCreate144*@功能说明:

任务创建,为了方便管理,所有的任务创建函数都可以放在这个函数里面145*@参数

146*@返回值

无147***********************************************************/148staticUINT32AppTaskCreate(void)149{150

/*定义一个返回类型变量,初始化为LOS_OK*/151UINT32uwRet=LOS_OK;

152uwRet=Creat_TransformTime_Task();153

if

(uwRet!=LOS_OK)154

{155printf("LED_Task任务创建失败!失败代码0x%X\n",uwRet);156

returnuwRet;157

}

158uwRet=Creat_GetTick_Task();159

if

(uwRet!=LOS_OK)160

{161printf("Key_Task任务创建失败!失败代码0x%X\n",uwRet);162

returnuwRet;163

}164

returnLOS_OK;165}166/*USERCODEEND0*/4.在主函数中修改代码。任务8-1时间转换、统计和延迟 172intmain(void)173{174

/*USERCODEBEGIN1*/175UINT32uwRet=LOS_OK;

//定义一个返回类型变量,初始化为LOS_OK176

/*USERCODEEND1*/177

/*MCUConfiguration-----------------------------*/178

/*Resetofallperipherals,InitializestheFlashinterfaceandtheSystick.*/179HAL_Init();180

/*Configurethesystemclock*/181SystemClock_Config();182

/*Initializeallconfiguredperipherals*/183MX_GPIO_Init();184MX_USART1_UART_Init();185MX_USART2_UART_Init();186MX_USART3_UART_Init();187

/*LiteOS内核初始化*/188uwRet=LOS_KernelInit();189

if

(uwRet!=LOS_OK)190

{191printf("LiteOS核心初始化失败!失败代码0x%X\n",uwRet);192

returnLOS_NOK;193

}194printf("任务8-1时间转换、统计和延迟!\n\n");195uwRet=AppTaskCreate();196

if

(uwRet!=LOS_OK)197

{198printf("AppTaskCreate创建任务失败!失败代码0x%X\n",uwRet);199

returnLOS_NOK;200

}201

/*开启LiteOS任务调度*/202LOS_Start();203

/*Infiniteloop*/204

while

(1)205

{206

}207}5.添加串口发送函数。任务8-1时间转换、统计和延迟 265/*USERCODEBEGIN4*/266intfputc(intch,

FILE

*f)267{268HAL_UART_Transmit(&huart3,

(uint8_t

*)&ch,

1,

0xFFFF);

269

returnch;270}271/*USERCODEEND4*/6.查看运行结果。编译并下载程序到开发板中。打开串口调试助手,按下开发板RST复位键,串口打印信息如图8-1所示。图8-1任务8-1运行结果谢谢观看THANKYOUFORWATCHING任务8-2软件定时器使用Task8-2UsingSoftwareTimer《物联网操作系统技术与应用》制作人张亚军

任务描述在LiteOS中创建两个软件定时器,其中一个软件定时器是单次模式,5000Ticks后调用一次回调函数,另一个软件定时器是周期模式,每1000Ticks调用一次回调函数,在回调函数中输出相关信息。

任务实现1.打开第2章中移植好LiteOS的裸机工程TEST,修改OS_CONFIG\target_config.h文件。任务8-2软件定时器使用 242

#defineLOSCFG_BASE_CORE_SWTMR_ALIGNNO2.修改main.c文件,添加头文件。26

/*USERCODEBEGINIncludes*/27

/*LiteOS头文件*/28#include"los_sys.h"29#include"los_task.ph"30#include"los_swtmr.h"31/*USERCODEENDIncludes*/3.定义软件定时器句柄(ID),声明全局变量。任务8-2软件定时器使用 60

/*USERCODEBEGIN0*/61

/*定义定时器句柄(ID)*/62UINT16Timer1_Handle;63UINT16Timer2_Handle;64

/******************全局变量声明********************/65

staticUINT32TmrCb_Count1=

0;66

staticUINT32TmrCb_Count2=

0;4.定义软件定时器回调函数Timer1_Callback()、Timer2_Callback()。67

/*************************************************************68*@函数名

:Timer1_Callback69*@功能说明:

软件定时器回调函数170*@参数

传入1个参数,但未使用

71*@返回值

无72***********************************************************/73

static

voidTimer1_Callback(UINT32arg)74

{75UINT32tick_num1;76TmrCb_Count1++;

/*每回调一次加一*/77HAL_GPIO_TogglePin(GPIOD,GPIO_PIN_5);

//LED1翻转78tick_num1=

(UINT32)LOS_TickCountGet();

/*获取滴答定时器的计数值*/

79printf("全局变量TmrCb_Count1=%d\n",TmrCb_Count1);80printf("软件定时器Timer1的计数值tick_num1=%d\n",tick_num1);81

}任务8-2软件定时器使用 82

/************************************************************83*@函数名

:Timer2_Callback84*@功能说明:

软件定时器回调函数285*@参数

传入1个参数,但未使用

86*@返回值

无87***********************************************************/88

static

voidTimer2_Callback(UINT32arg)89

{90UINT32tick_num2;

91TmrCb_Count2++;

/*每回调一次加一*/92HAL_GPIO_TogglePin(GPIOD,GPIO_PIN_4);

//LED2翻转93tick_num2=

(UINT32)LOS_TickCountGet();

/*获取滴答定时器的计数值*/

94printf("全局变量TmrCb_Count2=%d\n",TmrCb_Count2);

95printf("软件定时器Timer2的计数值tick_num2=%d\n",tick_num2);

96

}5.定义创建、启动软件定时器的函数AppTaskCreate()。任务8-2软件定时器使用 97

/************************************************************98*@函数名

:AppTaskCreate99*@功能说明:

创建、启动软件定时器100*@参数

101*@返回值

无102***********************************************************/103staticUINT32AppTaskCreate(void)104{105

/*定义一个返回类型变量,初始化为LOS_OK*/106UINT32uwRet=LOS_OK;

107

/*创建一个软件定时器定时器*/108uwRet=LOS_SwtmrCreate(5000,

/*软件定时器的定时时间*/

109LOS_SWTMR_MODE_ONCE,

/*软件定时器模式,一次模式*/110

(SWTMR_PROC_FUNC)Timer1_Callback,

/*软件定时器的回调函数*/111

&Timer1_Handle,

/*软件定时器的id*/112

0);

113

if

(uwRet!=LOS_OK)114

{115printf("软件定时器Timer1创建失败!\n");116

}117uwRet=LOS_SwtmrCreate(1000,

/*软件定时器的定时时间(ms)*/

118LOS_SWTMR_MODE_PERIOD,

/*软件定时器模式,周期模式*/119

(SWTMR_PROC_FUNC)Timer2_Callback,

/*软件定时器的回调函数*/120

&Timer2_Handle,

/*软件定时器的id*/121

0);

122

if

(uwRet!=LOS_OK)

123

{124printf("软件定时器Timer2创建失败!\n");125

returnuwRet;126

}

127

/*启动一个软件定时器定时器*/128uwRet=LOS_SwtmrSta

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论