• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 开发指导<a name="ZH-CN_TOPIC_0000001123763635"></a>
2
3-   [接口说明](#section158501652121514)
4-   [开发流程](#section783435801510)
5-   [编程实例](#section460018317164)
6    -   [实例描述](#section2148236125814)
7    -   [示例代码](#section121451047155716)
8    -   [结果验证](#section2742182082117)
9
10
11## 接口说明<a name="section158501652121514"></a>
12
13<a name="table10903105695114"></a>
14<table><thead align="left"><tr id="row1293645645110"><th class="cellrowborder" valign="top" width="23.56%" id="mcps1.1.4.1.1"><p id="p59361562512"><a name="p59361562512"></a><a name="p59361562512"></a>功能分类</p>
15</th>
16<th class="cellrowborder" valign="top" width="24.29%" id="mcps1.1.4.1.2"><p id="p1393665645118"><a name="p1393665645118"></a><a name="p1393665645118"></a>接口名</p>
17</th>
18<th class="cellrowborder" valign="top" width="52.15%" id="mcps1.1.4.1.3"><p id="p119363564516"><a name="p119363564516"></a><a name="p119363564516"></a>描述</p>
19</th>
20</tr>
21</thead>
22<tbody><tr id="row1693665613516"><td class="cellrowborder" rowspan="2" valign="top" width="23.56%" headers="mcps1.1.4.1.1 "><p id="p193675615514"><a name="p193675615514"></a><a name="p193675615514"></a>创建/删除消息队列</p>
23</td>
24<td class="cellrowborder" valign="top" width="24.29%" headers="mcps1.1.4.1.2 "><p id="p11936115612514"><a name="p11936115612514"></a><a name="p11936115612514"></a>LOS_QueueCreate</p>
25</td>
26<td class="cellrowborder" valign="top" width="52.15%" headers="mcps1.1.4.1.3 "><p id="p1593620562517"><a name="p1593620562517"></a><a name="p1593620562517"></a>创建一个消息队列,由系统动态申请队列空间。</p>
27</td>
28</tr>
29<tr id="row79361156175113"><td class="cellrowborder" valign="top" headers="mcps1.1.4.1.1 "><p id="p893615567517"><a name="p893615567517"></a><a name="p893615567517"></a>LOS_QueueDelete</p>
30</td>
31<td class="cellrowborder" valign="top" headers="mcps1.1.4.1.2 "><p id="p4936155695111"><a name="p4936155695111"></a><a name="p4936155695111"></a>根据队列ID删除一个指定队列。</p>
32</td>
33</tr>
34<tr id="row093614566519"><td class="cellrowborder" rowspan="3" valign="top" width="23.56%" headers="mcps1.1.4.1.1 "><p id="p1593685614513"><a name="p1593685614513"></a><a name="p1593685614513"></a>读/写队列(不带拷贝)</p>
35</td>
36<td class="cellrowborder" valign="top" width="24.29%" headers="mcps1.1.4.1.2 "><p id="p6936556155118"><a name="p6936556155118"></a><a name="p6936556155118"></a>LOS_QueueRead</p>
37</td>
38<td class="cellrowborder" valign="top" width="52.15%" headers="mcps1.1.4.1.3 "><p id="p11936556155118"><a name="p11936556155118"></a><a name="p11936556155118"></a>读取指定队列头节点中的数据(队列节点中的数据实际上是一个地址)。</p>
39</td>
40</tr>
41<tr id="row199369565518"><td class="cellrowborder" valign="top" headers="mcps1.1.4.1.1 "><p id="p393655620513"><a name="p393655620513"></a><a name="p393655620513"></a>LOS_QueueWrite</p>
42</td>
43<td class="cellrowborder" valign="top" headers="mcps1.1.4.1.2 "><p id="p12936256175120"><a name="p12936256175120"></a><a name="p12936256175120"></a>向指定队列尾节点中写入入参bufferAddr的值(即buffer的地址)。</p>
44</td>
45</tr>
46<tr id="row1293615635114"><td class="cellrowborder" valign="top" headers="mcps1.1.4.1.1 "><p id="p893625665119"><a name="p893625665119"></a><a name="p893625665119"></a>LOS_QueueWriteHead</p>
47</td>
48<td class="cellrowborder" valign="top" headers="mcps1.1.4.1.2 "><p id="p193620566515"><a name="p193620566515"></a><a name="p193620566515"></a>向指定队列头节点中写入入参bufferAddr的值(即buffer的地址)。</p>
49</td>
50</tr>
51<tr id="row593675635117"><td class="cellrowborder" rowspan="3" valign="top" width="23.56%" headers="mcps1.1.4.1.1 "><p id="p293675615111"><a name="p293675615111"></a><a name="p293675615111"></a>读/写队列(带拷贝)</p>
52</td>
53<td class="cellrowborder" valign="top" width="24.29%" headers="mcps1.1.4.1.2 "><p id="p14936356155113"><a name="p14936356155113"></a><a name="p14936356155113"></a>LOS_QueueReadCopy</p>
54</td>
55<td class="cellrowborder" valign="top" width="52.15%" headers="mcps1.1.4.1.3 "><p id="p11936155616510"><a name="p11936155616510"></a><a name="p11936155616510"></a>读取指定队列头节点中的数据。</p>
56</td>
57</tr>
58<tr id="row093619569510"><td class="cellrowborder" valign="top" headers="mcps1.1.4.1.1 "><p id="p179361256175117"><a name="p179361256175117"></a><a name="p179361256175117"></a>LOS_QueueWriteCopy</p>
59</td>
60<td class="cellrowborder" valign="top" headers="mcps1.1.4.1.2 "><p id="p6936155616515"><a name="p6936155616515"></a><a name="p6936155616515"></a>向指定队列尾节点中写入入参bufferAddr中保存的数据。</p>
61</td>
62</tr>
63<tr id="row16936856185111"><td class="cellrowborder" valign="top" headers="mcps1.1.4.1.1 "><p id="p49361156195113"><a name="p49361156195113"></a><a name="p49361156195113"></a>LOS_QueueWriteHeadCopy</p>
64</td>
65<td class="cellrowborder" valign="top" headers="mcps1.1.4.1.2 "><p id="p1193625675116"><a name="p1193625675116"></a><a name="p1193625675116"></a>向指定队列头节点中<em id="i1183903561620"><a name="i1183903561620"></a><a name="i1183903561620"></a>写入入参</em>bufferAddr中保存的数据。</p>
66</td>
67</tr>
68<tr id="row1936756155114"><td class="cellrowborder" valign="top" width="23.56%" headers="mcps1.1.4.1.1 "><p id="p149371956105114"><a name="p149371956105114"></a><a name="p149371956105114"></a>获取队列信息</p>
69</td>
70<td class="cellrowborder" valign="top" width="24.29%" headers="mcps1.1.4.1.2 "><p id="p7937145613516"><a name="p7937145613516"></a><a name="p7937145613516"></a>LOS_QueueInfoGet</p>
71</td>
72<td class="cellrowborder" valign="top" width="52.15%" headers="mcps1.1.4.1.3 "><p id="p19371356175110"><a name="p19371356175110"></a><a name="p19371356175110"></a>获取指定队列的信息,包括队列ID、队列长度、消息节点大小、头节点、尾节点、可读节点数量、可写节点数量、等待读操作的任务、等待写操作的任务。</p>
73</td>
74</tr>
75</tbody>
76</table>
77
78## 开发流程<a name="section783435801510"></a>
79
801.  用LOS\_QueueCreate创建队列。创建成功后,可以得到队列ID。
812.  通过LOS\_QueueWrite或者LOS\_QueueWriteCopy写队列。
823.  通过LOS\_QueueRead或者LOS\_QueueReadCopy读队列。
834.  通过LOS\_QueueInfoGet获取队列信息。
845.  通过LOS\_QueueDelete删除队列。
85
86>![](../public_sys-resources/icon-note.gif) **说明:**
87>-   系统支持的最大队列数是指:整个系统的队列资源总个数,而非用户能使用的个数。例如:系统软件定时器多占用一个队列资源,那么用户能使用的队列资源就会减少一个。
88>-   创建队列时传入的队列名和flags暂时未使用,作为以后的预留参数。
89>-   队列接口函数中的入参timeOut是相对时间。
90>-   LOS\_QueueReadCopy和LOS\_QueueWriteCopy及LOS\_QueueWriteHeadCopy是一组接口,LOS\_QueueRead和LOS\_QueueWrite及LOS\_QueueWriteHead是一组接口,每组接口需要配套使用。
91>-   鉴于LOS\_QueueWrite和LOS\_QueueWriteHead和LOS\_QueueRead这组接口实际操作的是数据地址,用户必须保证调用LOS\_QueueRead获取到的指针所指向的内存区域在读队列期间没有被异常修改或释放,否则可能导致不可预知的后果。
92>-   鉴于LOS\_QueueWrite和LOS\_QueueWriteHead和LOS\_QueueRead这组接口实际操作的是数据地址,也就意味着实际写和读的消息长度仅仅是一个指针数据,因此用户使用这组接口之前,需确保创建队列时的消息节点大小,为一个指针的长度,避免不必要的浪费和读取失败。
93
94## 编程实例<a name="section460018317164"></a>
95
96### 实例描述<a name="section2148236125814"></a>
97
98创建一个队列,两个任务。任务1调用写队列接口发送消息,任务2通过读队列接口接收消息。
99
1001.  通过LOS\_TaskCreate创建任务1和任务2。
1012.  通过LOS\_QueueCreate创建一个消息队列。
1023.  在任务1 SendEntry中发送消息。
1034.  在任务2 RecvEntry中接收消息。
1045.  通过LOS\_QueueDelete删除队列。
105
106### 示例代码<a name="section121451047155716"></a>
107
108示例代码如下:
109
110```
111#include "los_task.h"
112#include "los_queue.h"
113static UINT32 g_queue;
114#define BUFFER_LEN 50
115
116VOID SendEntry(VOID)
117{
118    UINT32 ret = 0;
119    CHAR abuf[] = "test message";
120    UINT32 len = sizeof(abuf);
121
122    ret = LOS_QueueWriteCopy(g_queue, abuf, len, 0);
123    if(ret != LOS_OK) {
124        printf("Failed to send the message. Error: %x\n", ret);
125    }
126}
127
128VOID RecvEntry(VOID)
129{
130    UINT32 ret = 0;
131    CHAR readBuf[BUFFER_LEN] = {0};
132    UINT32 readLen = BUFFER_LEN;
133
134    ret = LOS_QueueReadCopy(g_queue, readBuf, &readLen, 0);
135    if(ret != LOS_OK) {
136        printf("Failed to receive the message. Error: %x\n", ret);
137    }
138
139    printf("Message received: %s\n", readBuf);
140
141    ret = LOS_QueueDelete(g_queue);
142    if(ret != LOS_OK) {
143        printf("Failed to delete the queue. Error: %x\n", ret);
144    }
145
146    printf("Queue deleted.\n");
147}
148
149UINT32 ExampleQueue(VOID)
150{
151    printf("Start queue example.\n");
152    UINT32 ret = 0;
153    UINT32 task1, task2;
154    TSK_INIT_PARAM_S initParam = {0};
155
156    initParam.pfnTaskEntry = (TSK_ENTRY_FUNC)SendEntry;
157    initParam.usTaskPrio = 9;
158    initParam.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE;
159    initParam.pcName = "SendQueue";
160
161    LOS_TaskLock();
162    ret = LOS_TaskCreate(&task1, &initParam);
163    if(ret != LOS_OK) {
164        printf("Failed to create task1. Error: %x\n", ret);
165        return ret;
166    }
167
168    initParam.pcName = "RecvQueue";
169    initParam.pfnTaskEntry = (TSK_ENTRY_FUNC)RecvEntry;
170    initParam.usTaskPrio = 10;
171    ret = LOS_TaskCreate(&task2, &initParam);
172    if(ret != LOS_OK) {
173        printf("Failed to create task2. Error: %x\n", ret);
174        return ret;
175    }
176
177    ret = LOS_QueueCreate("queue", 5, &g_queue, 0, 50);
178    if(ret != LOS_OK) {
179        printf("Failed to create the queue. Error: %x\n", ret);
180    }
181
182    printf("Queue created.\n");
183    LOS_TaskUnlock();
184    return ret;
185}
186```
187
188### 结果验证<a name="section2742182082117"></a>
189
190编译运行得到的结果为:
191
192```
193Start queue example.
194Queue created.
195Message received: test message.
196Queue deleted.
197```
198
199