README.md
1# 润和星闪派物联网开发套件--消息队列(MessageQueue)
2
3
4
5[润和星闪派物联网开发套件](https://item.taobao.com/item.htm?abbucket=16&id=816685710481&ns=1&priceTId=214783b117346662457694855ed644&skuId=5533042544092&spm=a21n57.sem.item.49.46a639031zWytE&utparam=%7B%22aplus_abtest%22%3A%22b28048df8f009463834be6bdac2a3713%22%7D&xxc=taobaoSearch) 基于海思WS63E解决方案的一套软硬件组合的综合性开发套件。
6
7
8
9## 一、MessageQueue API
10
11| API名称 | 说明 |
12| ------------------------- | ------------------------------------------------------------ |
13| osMessageQueueNew | 创建和初始化一个消息队列 |
14| osMessageQueueGetName | 返回指定的消息队列的名字 |
15| osMessageQueuePut | 向指定的消息队列存放1条消息,如果消息队列满了,那么返回超时 |
16| osMessageQueueGet | 从指定的消息队列中取得1条消息,如果消息队列为空,那么返回超时 |
17| osMessageQueueGetCapacity | 获得指定的消息队列的消息容量 |
18| osMessageQueueGetMsgSize | 获得指定的消息队列中可以存放的最大消息的大小 |
19| osMessageQueueGetCount | 获得指定的消息队列中当前的消息数 |
20| osMessageQueueGetSpace | 获得指定的消息队列中还可以存放的消息数 |
21| osMessageQueueReset | 将指定的消息队列重置为初始状态 |
22| osMessageQueueDelete | 删除指定的消息队列 |
23
24## 二、代码分析
25
26`osMessageQueueNew`创建一个消息队列
27
28发送者每次将自己`count`的值与线程ID发送,并将`count`加1;
29
30接受者从消息队列中获取一条信息,然后将其打印输出
31
32```c
33void sender_thread(void *arg) {
34 static int count=0;
35 message_entry sentry;
36 (void)arg;
37 while(1) {
38 sentry.tid = osThreadGetId();
39 sentry.count = count;
40 printf("[Message Test] %s send %d to message queue.\r\n", osThreadGetName(osThreadGetId()), count);
41 osMessageQueuePut(qid, (const void *)&sentry, 0, osWaitForever);
42 count++;
43 osDelay(5);
44 }
45}
46
47void receiver_thread(void *arg) {
48 (void)arg;
49 message_entry rentry;
50 while(1) {
51 osMessageQueueGet(qid, (void *)&rentry, NULL, osWaitForever);
52 printf("[Message Test] %s get %d from %s by message queue.\r\n", osThreadGetName(osThreadGetId()), rentry.count, osThreadGetName(rentry.tid));
53 osDelay(3);
54 }
55}
56```
57
58主程序创建了三个消息发送者和两个消息接收者,然后调用相关的API确认消息队列的装填
59
60```c
61void rtosv2_msgq_main(void *arg) {
62 (void)arg;
63
64 qid = osMessageQueueNew(QUEUE_SIZE, sizeof(message_entry), NULL);
65
66 osThreadId_t ctid1 = newThread("recevier1", receiver_thread, NULL);
67 osThreadId_t ctid2 = newThread("recevier2", receiver_thread, NULL);
68 osThreadId_t ptid1 = newThread("sender1", sender_thread, NULL);
69 osThreadId_t ptid2 = newThread("sender2", sender_thread, NULL);
70 osThreadId_t ptid3 = newThread("sender3", sender_thread, NULL);
71
72 osDelay(20);
73 uint32_t cap = osMessageQueueGetCapacity(qid);
74 printf("[Message Test] osMessageQueueGetCapacity, capacity: %d.\r\n",cap);
75 uint32_t msg_size = osMessageQueueGetMsgSize(qid);
76 printf("[Message Test] osMessageQueueGetMsgSize, size: %d.\r\n",msg_size);
77 uint32_t count = osMessageQueueGetCount(qid);
78 printf("[Message Test] osMessageQueueGetCount, count: %d.\r\n",count);
79 uint32_t space = osMessageQueueGetSpace(qid);
80 printf("[Message Test] osMessageQueueGetSpace, space: %d.\r\n",space);
81
82 osDelay(80);
83 osThreadTerminate(ctid1);
84 osThreadTerminate(ctid2);
85 osThreadTerminate(ptid1);
86 osThreadTerminate(ptid2);
87 osThreadTerminate(ptid3);
88 osMessageQueueDelete(qid);
89}
90```
91
92
93
94## 三、如何编译
95
961. 将05_message目录复制到openharmony源码的`applications\sample\wifi-iot\app`目录下,
972. 修改openharmony源码的`applications\sample\wifi-iot\app\BUILD.gn`文件,将其中的 `features` 改为:
98
99```
100 features = [
101 ...
102 "05_message:message_demo",
103 ...
104 ]
105```
1063. 在`device\soc\hisilicon\ws63v100\sdk\build\config\target_config\ws63\config.py`文件中,找到`'ws63-liteos-app'`部分,在其`'ram_component'`中,添加以下代码:
107```
108"message_demo"
109```
110
1114. 在`device\soc\hisilicon\ws63v100\sdk\libs_url\ws63\cmake\ohos.cmake`文件中,找到`"ws63-liteos-app"`部分,在其`set(COMPONENT_LIST`部分,添加以下代码:
112```
113"message_demo"
114```
1155. 在openharmony sdk根目录目录执行:`rm -rf out && hb set -p nearlink_dk_3863 && hb build -f`
116
117## 四、运行结果
118
119截取部分运行结果
120
121```
122[Message Test] recevier1 get 4 from sender2 by message queue.
123[Message Test] sender1 send 6 to message queue.
124[Message Test] recevier2 get 5 from sender3 by message queue.
125[Message Test] sender2 send 7 to message queue.
126[Message Test] sender3 send 8 to message queue.
127[Message Test] recevier1 get 6 from sender1 by message queue.
128[Message Test] recevier2 get 7 from sender2 by message queue.
129[Message Test] sender1 send 9 to message queue.
130[Message Test] recevier1 get 8 from sender3 by message queue.
131[Message Test] sender2 send 10 to message queue.
132[Message Test] sender3 send 11 to message queue.
133[Message Test] recevier2 get 9 from sender1 by message queue.
134[Message Test] recevier1 get 10 from sender2 by message queue.
135[Message Test] recevier2 get 11 from sender3 by message queue.
136[Message Test] osMessageQueueGetCapacity, capacity: 3.
137[Message Test] osMessageQueueGetMsgSize, size: 8.
138[Message Test] osMessageQueueGetCount, count: 0.
139[Message Test] osMessageQueueGetSpace, space: 3.
140[Message Test] sender1 send 12 to message queue.
141[Message Test] sender2 send 13 to message queue.
142[Message Test] sender3 send 13 to message queue.
143[Message Test] recevier1 get 12 from sender1 by message queue.
144[Message Test] recevier2 get 13 from sender2 by message queue.
145```
146
147### 【套件支持】
148
149##### 1. 套件购买 https://item.taobao.com/item.htm?abbucket=16&id=816685710481&ns=1&priceTId=214783b117346662457694855ed644&skuId=5533042544092&spm=a21n57.sem.item.49.46a639031zWytE&utparam=%7B%22aplus_abtest%22%3A%22b28048df8f009463834be6bdac2a3713%22%7D&xxc=taobaoSearch
150
151##### 2. 技术资料
152
153- Gitee码云网站(使用说明书、规格说明书、OpenHarmony开发案例等) **https://gitee.com/hihopeorg_group/near-link**
154- fbb_ws63代码仓(SDK包、技术文档下载)**https://gitee.com/HiSpark/fbb_ws63**
155
156##### 3. 互动交流
157- 海思社区星闪专区-论坛 **https://developer.hisilicon.com/forum/0133146886267870001**
158