1# 开发指导<a name="ZH-CN_TOPIC_0000001078718194"></a> 2 3- [接口说明](#section158501652121514) 4- [开发流程](#section783435801510) 5- [编程实例](#section460018317164) 6 - [实例描述](#section3741753191918) 7 - [示例代码](#section20760101182016) 8 - [结果验证](#section11244112818172) 9 10 11## 接口说明<a name="section158501652121514"></a> 12 13OpenHarmony LiteOS-M内核的软件定时器模块提供下面几种功能,接口详细信息可以查看API参考。 14 15**表 1** 软件定时器接口 16 17<a name="table14277123518139"></a> 18<table><thead align="left"><tr id="row152771935131315"><th class="cellrowborder" valign="top" width="17.77177717771777%" id="mcps1.2.4.1.1"><p id="p1127733591316"><a name="p1127733591316"></a><a name="p1127733591316"></a>功能分类</p> 19</th> 20<th class="cellrowborder" valign="top" width="23.782378237823785%" id="mcps1.2.4.1.2"><p id="p22771357138"><a name="p22771357138"></a><a name="p22771357138"></a>接口名</p> 21</th> 22<th class="cellrowborder" valign="top" width="58.44584458445845%" id="mcps1.2.4.1.3"><p id="p327714358130"><a name="p327714358130"></a><a name="p327714358130"></a>描述</p> 23</th> 24</tr> 25</thead> 26<tbody><tr id="row159539510586"><td class="cellrowborder" rowspan="2" valign="top" width="17.77177717771777%" headers="mcps1.2.4.1.1 "><p id="p1194410585810"><a name="p1194410585810"></a><a name="p1194410585810"></a>创建、删除定时器</p> 27</td> 28<td class="cellrowborder" valign="top" width="23.782378237823785%" headers="mcps1.2.4.1.2 "><p id="p10944105115814"><a name="p10944105115814"></a><a name="p10944105115814"></a>LOS_SwtmrCreate</p> 29</td> 30<td class="cellrowborder" valign="top" width="58.44584458445845%" headers="mcps1.2.4.1.3 "><p id="p9944105175818"><a name="p9944105175818"></a><a name="p9944105175818"></a>创建定时器</p> 31</td> 32</tr> 33<tr id="row17953454580"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p094419505814"><a name="p094419505814"></a><a name="p094419505814"></a>LOS_SwtmrDelete</p> 34</td> 35<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p39445585817"><a name="p39445585817"></a><a name="p39445585817"></a>删除定时器</p> 36</td> 37</tr> 38<tr id="row79531357589"><td class="cellrowborder" rowspan="2" valign="top" width="17.77177717771777%" headers="mcps1.2.4.1.1 "><p id="p139443595820"><a name="p139443595820"></a><a name="p139443595820"></a>启动、停止定时器</p> 39</td> 40<td class="cellrowborder" valign="top" width="23.782378237823785%" headers="mcps1.2.4.1.2 "><p id="p1894435175815"><a name="p1894435175815"></a><a name="p1894435175815"></a>LOS_SwtmrStart</p> 41</td> 42<td class="cellrowborder" valign="top" width="58.44584458445845%" headers="mcps1.2.4.1.3 "><p id="p1194415518581"><a name="p1194415518581"></a><a name="p1194415518581"></a>启动定时器</p> 43</td> 44</tr> 45<tr id="row1095320545814"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p20944355589"><a name="p20944355589"></a><a name="p20944355589"></a>LOS_SwtmrStop</p> 46</td> 47<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p169441515816"><a name="p169441515816"></a><a name="p169441515816"></a>停止定时器</p> 48</td> 49</tr> 50<tr id="row119525513581"><td class="cellrowborder" valign="top" width="17.77177717771777%" headers="mcps1.2.4.1.1 "><p id="p109442053586"><a name="p109442053586"></a><a name="p109442053586"></a>获得软件定时器剩余Tick数</p> 51</td> 52<td class="cellrowborder" valign="top" width="23.782378237823785%" headers="mcps1.2.4.1.2 "><p id="p9944354585"><a name="p9944354585"></a><a name="p9944354585"></a>LOS_SwtmrTimeGet</p> 53</td> 54<td class="cellrowborder" valign="top" width="58.44584458445845%" headers="mcps1.2.4.1.3 "><p id="p39441257586"><a name="p39441257586"></a><a name="p39441257586"></a>获得软件定时器剩余Tick数</p> 55</td> 56</tr> 57</tbody> 58</table> 59 60## 开发流程<a name="section783435801510"></a> 61 62软件定时器的典型开发流程: 63 641. 配置软件定时器。 65 - 确认配置项LOSCFG\_BASE\_CORE\_SWTMR和LOSCFG\_BASE\_IPC\_QUEUE为1打开状态; 66 - 配置LOSCFG\_BASE\_CORE\_SWTMR\_LIMIT最大支持的软件定时器数; 67 - 配置OS\_SWTMR\_HANDLE\_QUEUE\_SIZE软件定时器队列最大长度; 68 692. 创建定时器LOS\_SwtmrCreate。 70 - 创建一个指定计时时长、指定超时处理函数、指定触发模式的软件定时器; 71 - 返回函数运行结果,成功或失败; 72 733. 启动定时器LOS\_SwtmrStart。 744. 获得软件定时器剩余Tick数LOS\_SwtmrTimeGet。 755. 停止定时器LOS\_SwtmrStop。 766. 删除定时器LOS\_SwtmrDelete。 77 78> **说明:** 79>- 软件定时器的回调函数中不要做过多操作,不要使用可能引起任务挂起或者阻塞的接口或操作。 80>- 软件定时器使用了系统的一个队列和一个任务资源,软件定时器任务的优先级设定为0,且不允许修改 。 81>- 系统可配置的软件定时器资源个数是指:整个系统可使用的软件定时器资源总个数,而并非是用户可使用的软件定时器资源个数。例如:系统软件定时器多占用一个软件定时器资源数,那么用户能使用的软件定时器资源就会减少一个。 82>- 创建单次软件定时器,该定时器超时执行完回调函数后,系统会自动删除该软件定时器,并回收资源。 83>- 创建单次不自删除属性的定时器,用户需要调用定时器删除接口删除定时器,回收定时器资源,避免资源泄露。 84 85## 编程实例<a name="section460018317164"></a> 86 87### 实例描述<a name="section3741753191918"></a> 88 89在下面的例子中,演示如下功能: 90 911. 软件定时器创建、启动、删除、暂停、重启操作。 922. 单次软件定时器,周期软件定时器使用方法。 93 94### 示例代码<a name="section20760101182016"></a> 95 96前提条件: 97 98- 在los\_config.h中,将LOSCFG\_BASE\_CORE\_SWTMR配置项打开。 99- 在los\_config.h中,将LOSCFG\_BASE\_CORE\_SWTMR\_ALIGN配置项关闭,示例代码中演示代码不涉及定时器对齐。 100- 配置好LOSCFG\_BASE\_CORE\_SWTMR\_LIMIT最大支持的软件定时器数。 101- 配置好OS\_SWTMR\_HANDLE\_QUEUE\_SIZE软件定时器队列最大长度。 102 103代码实现如下: 104 105``` 106#include "los_swtmr.h" 107 108/* Timer count */ 109UINT32 g_timerCount1 = 0; 110UINT32 g_timerCount2 = 0; 111 112/* 任务ID */ 113UINT32 g_testTaskId01; 114 115void Timer1_Callback(UINT32 arg) // 回调函数1 116{ 117 UINT32 tick_last1; 118 g_timerCount1++; 119 tick_last1 = (UINT32)LOS_TickCountGet(); // 获取当前Tick数 120 printf("g_timerCount1=%d, tick_last1=%d\n", g_timerCount1, tick_last1); 121} 122 123void Timer2_Callback(UINT32 arg) // 回调函数2 124{ 125 UINT32 tick_last2; 126 tick_last2 = (UINT32)LOS_TickCountGet(); 127 g_timerCount2++; 128 printf("g_timerCount2=%d tick_last2=%d\n", g_timerCount2, tick_last2); 129} 130 131void Timer_example(void) 132{ 133 UINT32 ret; 134 UINT32 id1; // timer id1 135 UINT32 id2; // timer id2 136 UINT32 tickCount; 137 138 /*创建单次软件定时器,Tick数为1000,启动到1000Tick数时执行回调函数1 */ 139 LOS_SwtmrCreate(1000, LOS_SWTMR_MODE_ONCE, Timer1_Callback, &id1, 1); 140 141 /*创建周期性软件定时器,每100Tick数执行回调函数2 */ 142 LOS_SwtmrCreate(100, LOS_SWTMR_MODE_PERIOD, Timer2_Callback, &id2, 1); 143 printf("Timer 1 created.\n"); 144 145 LOS_SwtmrStart(id1); //启动单次软件定时器 146 printf("Timer 1 started.\n"); 147 148 LOS_TaskDelay(200); //延时200Tick数 149 LOS_SwtmrTimeGet(id1, &tickCount); // 获得单次软件定时器剩余Tick数 150 printf("tickCount=%d\n", tickCount); 151 152 LOS_SwtmrStop(id1); // 停止软件定时器 153 printf("Timer 1 stopped.\n"); 154 155 LOS_SwtmrStart(id1); 156 LOS_TaskDelay(1000); 157 158 LOS_SwtmrStart(id2); // 启动周期性软件定时器 159 printf("Timer 2 started.\n"); 160 161 LOS_TaskDelay(1000); 162 LOS_SwtmrStop(id2); 163 ret = LOS_SwtmrDelete(id2); // 删除软件定时器 164 if (ret == LOS_OK) { 165 printf("Timer 2 deleted.\n"); 166 } 167} 168 169UINT32 Example_TaskEntry(VOID) 170{ 171 UINT32 ret; 172 TSK_INIT_PARAM_S task1; 173 174 /* 锁任务调度 */ 175 LOS_TaskLock(); 176 177 /* 创建任务1 */ 178 (VOID)memset(&task1, 0, sizeof(TSK_INIT_PARAM_S)); 179 task1.pfnTaskEntry = (TSK_ENTRY_FUNC)Timer_example; 180 task1.pcName = "TimerTsk"; 181 task1.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE; 182 task1.usTaskPrio = 5; 183 ret = LOS_TaskCreate(&g_testTaskId01, &task1); 184 if (ret != LOS_OK) { 185 printf("Failed to create the timer task.\n"); 186 return LOS_NOK; 187 } 188 189 /* 解锁任务调度 */ 190 LOS_TaskUnlock(); 191 192 return LOS_OK; 193} 194``` 195 196### 结果验证<a name="section11244112818172"></a> 197 198编译烧录运行,输出结果如下: 199 200``` 201Timer 1 created. 202Timer 1 started. 203tickCount=798 204Timer 1 stopped. 205g_timerCount1=1, tick_last1=1208 206Timer 2 started. 207g_timerCount2=1 tick_last2=1313 208g_timerCount2=2 tick_last2=1413 209g_timerCount2=3 tick_last2=1513 210g_timerCount2=4 tick_last2=1613 211g_timerCount2=5 tick_last2=1713 212g_timerCount2=6 tick_last2=1813 213g_timerCount2=7 tick_last2=1913 214g_timerCount2=8 tick_last2=2013 215g_timerCount2=9 tick_last2=2113 216g_timerCount2=10 tick_last2=2213 217Timer 2 deleted. 218``` 219 220