• Home
Name Date Size #Lines LOC

..--

.application_configD12-May-2024687 1614

BUILD.gnD12-May-2024889 2723

README_zh.mdD12-May-20245.4 KiB215156

os_message_example.cD12-May-20242.7 KiB10270

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