• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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>![](../public_sys-resources/icon-note.gif) **说明:**
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