# 开发指导 - [接口说明](#section158501652121514) - [开发流程](#section783435801510) - [编程实例](#section460018317164) - [实例描述](#section3741753191918) - [示例代码](#section20760101182016) - [结果验证](#section11244112818172) ## 接口说明 OpenHarmony LiteOS-M内核的软件定时器模块提供下面几种功能,接口详细信息可以查看API参考。 **表 1** 软件定时器接口

功能分类

接口名

描述

创建、删除定时器

LOS_SwtmrCreate

创建定时器

LOS_SwtmrDelete

删除定时器

启动、停止定时器

LOS_SwtmrStart

启动定时器

LOS_SwtmrStop

停止定时器

获得软件定时器剩余Tick数

LOS_SwtmrTimeGet

获得软件定时器剩余Tick数

## 开发流程 软件定时器的典型开发流程: 1. 配置软件定时器。 - 确认配置项LOSCFG\_BASE\_CORE\_SWTMR和LOSCFG\_BASE\_IPC\_QUEUE为1打开状态; - 配置LOSCFG\_BASE\_CORE\_SWTMR\_LIMIT最大支持的软件定时器数; - 配置OS\_SWTMR\_HANDLE\_QUEUE\_SIZE软件定时器队列最大长度; 2. 创建定时器LOS\_SwtmrCreate。 - 创建一个指定计时时长、指定超时处理函数、指定触发模式的软件定时器; - 返回函数运行结果,成功或失败; 3. 启动定时器LOS\_SwtmrStart。 4. 获得软件定时器剩余Tick数LOS\_SwtmrTimeGet。 5. 停止定时器LOS\_SwtmrStop。 6. 删除定时器LOS\_SwtmrDelete。 >![](../public_sys-resources/icon-note.gif) **说明:** >- 软件定时器的回调函数中不要做过多操作,不要使用可能引起任务挂起或者阻塞的接口或操作。 >- 软件定时器使用了系统的一个队列和一个任务资源,软件定时器任务的优先级设定为0,且不允许修改 。 >- 系统可配置的软件定时器资源个数是指:整个系统可使用的软件定时器资源总个数,而并非是用户可使用的软件定时器资源个数。例如:系统软件定时器多占用一个软件定时器资源数,那么用户能使用的软件定时器资源就会减少一个。 >- 创建单次软件定时器,该定时器超时执行完回调函数后,系统会自动删除该软件定时器,并回收资源。 >- 创建单次不自删除属性的定时器,用户需要调用定时器删除接口删除定时器,回收定时器资源,避免资源泄露。 ## 编程实例 ### 实例描述 在下面的例子中,演示如下功能: 1. 软件定时器创建、启动、删除、暂停、重启操作。 2. 单次软件定时器,周期软件定时器使用方法。 ### 示例代码 前提条件: - 在los\_config.h中,将LOSCFG\_BASE\_CORE\_SWTMR配置项打开。 - 在los\_config.h中,将LOSCFG\_BASE\_CORE\_SWTMR\_ALIGN配置项关闭,示例代码中演示代码不涉及定时器对齐。 - 配置好LOSCFG\_BASE\_CORE\_SWTMR\_LIMIT最大支持的软件定时器数。 - 配置好OS\_SWTMR\_HANDLE\_QUEUE\_SIZE软件定时器队列最大长度。 代码实现如下: ``` #include "los_swtmr.h" /* Timer count */ UINT32 g_timerCount1 = 0; UINT32 g_timerCount2 = 0; /* 任务ID */ UINT32 g_testTaskId01; void Timer1_Callback(UINT32 arg) // 回调函数1 { UINT32 tick_last1; g_timerCount1++; tick_last1=(UINT32)LOS_TickCountGet(); // 获取当前Tick数 printf("g_timerCount1=%d, tick_last1=%d\n", g_timerCount1, tick_last1); } void Timer2_Callback(UINT32 arg) // 回调函数2 { UINT32 tick_last2; tick_last2=(UINT32)LOS_TickCountGet(); g_timerCount2++; printf("g_timerCount2=%d tick_last2=%d\n", g_timerCount2, tick_last2); } void Timer_example(void) { UINT32 id1; // timer id UINT32 id2; // timer id UINT32 uwTick; /*创建单次软件定时器,Tick数为1000,启动到1000Tick数时执行回调函数1 */ LOS_SwtmrCreate (1000, LOS_SWTMR_MODE_ONCE, Timer1_Callback, &id1, 1); /*创建周期性软件定时器,每100Tick数执行回调函数2 */ LOS_SwtmrCreate(100, LOS_SWTMR_MODE_PERIOD, Timer2_Callback, &id2, 1); printf("create Timer1 success\n"); LOS_SwtmrStart (id1); //启动单次软件定时器 printf("start Timer1 sucess\n"); LOS_TaskDelay(200); //延时200Tick数 LOS_SwtmrTimeGet(id1, &uwTick); // 获得单次软件定时器剩余Tick数 printf("uwTick =%d\n", uwTick); LOS_SwtmrStop(id1); // 停止软件定时器 printf("stop Timer1 sucess\n"); LOS_SwtmrStart(id1); LOS_TaskDelay(1000); LOS_SwtmrDelete(id1); // 删除软件定时器 printf("delete Timer1 sucess\n"); LOS_SwtmrStart(id2); // 启动周期性软件定时器 printf("start Timer2\n"); LOS_TaskDelay(1000); LOS_SwtmrStop(id2); LOS_SwtmrDelete(id2); } UINT32 Example_TaskEntry(VOID) { UINT32 ret; TSK_INIT_PARAM_S task1; /* 锁任务调度 */ LOS_TaskLock(); /* 创建任务1 */ memset(&task1, 0, sizeof(TSK_INIT_PARAM_S)); task1.pfnTaskEntry = (TSK_ENTRY_FUNC)Timer_example; task1.pcName = "TimerTsk"; task1.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE; task1.usTaskPrio = 5; ret = LOS_TaskCreate(&g_testTaskId01, &task1); if (ret != LOS_OK) { printf("TimerTsk create failed.\n"); return LOS_NOK; } /* 解锁任务调度 */ LOS_TaskUnlock(); return LOS_OK; } ``` ### 结果验证 编译烧录运行,输出结果如下: ``` create Timer1 success start Timer1 sucess uwTick =798 stop Timer1 sucess g_timerCount1=1, tick_last1=1208 delete Timer1 sucess start Timer2 g_timerCount2=1 tick_last2=1313 g_timerCount2=2 tick_last2=1413 g_timerCount2=3 tick_last2=1513 g_timerCount2=4 tick_last2=1613 g_timerCount2=5 tick_last2=1713 g_timerCount2=6 tick_last2=1813 g_timerCount2=7 tick_last2=1913 g_timerCount2=8 tick_last2=2013 g_timerCount2=9 tick_last2=2113 g_timerCount2=10 tick_last2=2213 ```