README_zh.md
1# NiobeU4开发板OpenHarmony内核编程开发——message
2本示例将演示如何在Niobe u4开发板上使用cmsis 2.0 接口进行消息队列开发
3
4
5## message API分析
6
7### LOS_QueueCreate()
8
9```c
10UINT32 LOS_QueueCreate(const CHAR *queueName,
11 UINT16 len,
12 UINT32 *queueID,
13 UINT32 flags,
14 UINT16 maxMsgSize);
15```
16**描述:**
17
18创建消息队列
19> **注意** :不能在中断服务调用该函数
20
21
22**参数:**
23
24|名字|描述|
25|:--|:------|
26| queueName | 消息队列名称,暂时未使用 |
27| len |消息队列长度,该值的范围:[1,0xffff]|
28| queueID |消息队列ID,属输出|
29| flags | 队列模式,暂未用,可传0 |
30| maxMsgSize | 消息的大小,该值范围:[1,0xffff-4] |
31
32### LOS_QueueReadCopy()
33
34```c
35UINT32 LOS_QueueReadCopy(UINT32 queueID, VOID *bufferAddr, UINT32 *bufferSize, UINT32 timeOut);
36```
37**描述:**
38
39读取消息队列,用于读取指定队列中的数据,并将获取到的数据存储到bufferAddr指定的地址中。 要读取的数据的地址和大小由用户定义。
40> **注意** :不能在中断服务调用该函数
41
42
43**参数:**
44
45|名字|描述|
46|:--|:------|
47| queueID | 队列ID |
48| bufferAddr | 指针,存放读取到的消息 |
49| bufferSize | 在读取之前维护缓冲区的期望大小,和读取后消息的实际大小 |
50| timeOut | 超时值,范围:[0,LOS_WAIT_FOREVER],单位tick |
51
52### LOS_QueueWriteCopy()
53
54```c
55UINT32 LOS_QueueWriteCopy(UINT32 queueID, VOID *bufferAddr, UINT32 bufferSize, UINT32 timeOut);
56
57```
58**描述:**
59
60发送消息,用于将bufferSize指定的大小和存储在bufferAddr指定地址的数据写入队列中。
61> **注意** :如果参数timeout设置为0,可以从中断服务例程调用
62
63**参数:**
64
65|名字|描述|
66|:--|:------|
67| queueID |消息队列ID|
68| bufferAddr |要发送的消息|
69| bufferSize |消息大小|
70| timeout |超时值|
71
72
73### LOS_QueueRead()
74
75```c
76UINT32 LOS_QueueRead(UINT32 queueID, VOID *bufferAddr, UINT32 bufferSize, UINT32 timeOut);
77```
78**描述:**
79
80获取消息,用于读取指定队列中的数据地址,并将其存储到由bufferAddr指定的地址中。
81> **注意** :不能在中断服务调用该函数
82
83**参数:**
84
85|名字|描述|
86|:--|:------|
87| queueID |消息队列ID|
88| bufferAddr | 存储获取数据的起始地址。起始地址不能为空。 |
89| bufferSize | 传入的缓冲区大小,不能为0,范围:[1,0xffffffff]|
90| timeout |超时值,范围:[0,LOS_WAIT_FOREVER],单位tick|
91返回 0 - 成功,非0 - 失败
92
93
94### LOS_QueueWrite()
95
96```c
97UINT32 LOS_QueueWrite(UINT32 queueID, VOID *bufferAddr, UINT32 bufferSize, UINT32 timeOut);
98```
99**描述:**
100
101发送消息
102
103**参数:**
104
105|名字|描述|
106|:--|:------|
107| queueID |消息队列ID|
108| bufferAddr |要发送的消息|
109| bufferSize |消息大小|
110| timeout |超时值|
111
112
113## 软件设计
114
115### 主要代码分析
116
117创建一个队列,两个任务。任务1调用写队列接口发送消息,任务2通过读队列接口接收消息。
118
119```c
120VOID SendEntry(VOID)
121{
122 UINT32 ret = 0;
123 CHAR abuf[] = "test message";
124 UINT32 len = sizeof(abuf);
125
126 ret = LOS_QueueWriteCopy(g_queue, abuf, len, 0);
127 if(ret != LOS_OK) {
128 printf("send message failure, error: %x\n", ret);
129 }
130}
131
132VOID RecvEntry(VOID)
133{
134 UINT32 ret = 0;
135 CHAR readBuf[BUFFER_LEN] = {0};
136 UINT32 readLen = BUFFER_LEN;
137
138 //休眠1s
139 usleep(1000000);
140 ret = LOS_QueueReadCopy(g_queue, readBuf, &readLen, 0);
141 if(ret != LOS_OK) {
142 printf("recv message failure, error: %x\n", ret);
143 }
144
145 printf("recv message: %s\n", readBuf);
146
147 ret = LOS_QueueDelete(g_queue);
148 if(ret != LOS_OK) {
149 printf("delete the queue failure, error: %x\n", ret);
150 }
151
152 printf("delete the queue success.\n");
153}
154
155UINT32 ExampleQueue(VOID)
156{
157 printf("start queue example.\n");
158 UINT32 ret = 0;
159 UINT32 task1, task2;
160 TSK_INIT_PARAM_S initParam = {0};
161
162 initParam.pfnTaskEntry = (TSK_ENTRY_FUNC)SendEntry;
163 initParam.usTaskPrio = 9;
164 initParam.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE;
165 initParam.pcName = "SendQueue";
166
167 LOS_TaskLock();
168 ret = LOS_TaskCreate(&task1, &initParam);
169 if(ret != LOS_OK) {
170 printf("create task1 failed, error: %x\n", ret);
171 return ret;
172 }
173
174 initParam.pcName = "RecvQueue";
175 initParam.pfnTaskEntry = (TSK_ENTRY_FUNC)RecvEntry;
176 initParam.usTaskPrio = 10;
177 ret = LOS_TaskCreate(&task2, &initParam);
178 if(ret != LOS_OK) {
179 printf("create task2 failed, error: %x\n", ret);
180 return ret;
181 }
182
183 ret = LOS_QueueCreate("queue", 5, &g_queue, 0, 50);
184 if(ret != LOS_OK) {
185 printf("create queue failure, error: %x\n", ret);
186 }
187
188 printf("create the queue success.\n");
189 LOS_TaskUnlock();
190 return ret;
191}
192
193```
194
195## 编译调试
196
197- 进入//kernel/liteos_m目录, 在menuconfig配置中进入如下选项:
198 `(Top) → Platform → Board Selection → select board niobeu4 → use openvalley niobeu4 application → niobeu4 application choose`
199- 选择 `007_system_los_message`
200- 回到sdk根目录,执行`hb build`脚本进行编译。
201
202
203### 运行结果<a name="section_os_message_example"></a>
204
205示例代码编译烧录代码后,按下开发板的RESET按键,通过串口助手查看日志
206```c
207 start queue example.
208 create the queue success.
209 recv message: test message
210 delete the queue success.
211```
212
213
214
215