• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Niobe407开发板OpenHarmony内核编程开发——message
2本示例将演示如何在Niobe407开发板上使用cmsis 2.0 接口进行消息队列开发
3
4## message API分析
5
6## osThreadNew()
7
8```c
9osThreadId_t osThreadNew(osThreadFunc_t	func, void *argument,const osThreadAttr_t *attr )
10```
11**描述:**
12
13函数osThreadNew通过将线程添加到活动线程列表并将其设置为就绪状态来启动线程函数。线程函数的参数使用参数指针*argument传递。当创建的thread函数的优先级高于当前运行的线程时,创建的thread函数立即启动并成为新的运行线程。线程属性是用参数指针attr定义的。属性包括线程优先级、堆栈大小或内存分配的设置。可以在RTOS启动(调用 osKernelStart)之前安全地调用该函数,但不能在内核初始化 (调用 osKernelInitialize)之前调用该函数。
14> **注意** :不能在中断服务调用该函数
15
16
17**参数:**
18
19|名字|描述|
20|:--|:------|
21| func | 线程函数.  |
22| argument |作为启动参数传递给线程函数的指针|
23| attr |线程属性|
24
25## osMessageQueueNew()
26
27```c
28osMessageQueueId_t osMessageQueueNew (uint32_t msg_count,uint32_t msg_size,const osMessageQueueAttr_t *attr)
29```
30**描述:**
31
32创建消息队列
33> **注意** :不能在中断服务调用该函数
34
35
36**参数:**
37
38|名字|描述|
39|:--|:------|
40| msg_count |队列中的最大消息数|
41| msg_size |最大消息大小(以字节为单位)|
42| attr |消息队列属性;空:默认值|
43返回 消息队列ID
44
45## osMessageQueuePut()
46
47```c
48osStatus_t osMessageQueuePut (osMessageQueueId_t mq_id,const void *msg_ptr,uint8_t msg_prio,uint32_t timeout)
49```
50**描述:**
51
52发送消息
53> **注意** :如果参数timeout设置为0,可以从中断服务例程调用
54
55**参数:**
56
57|名字|描述|
58|:--|:------|
59| mq_id |由osMessageQueueNew获得的消息队列ID|
60| msg_ptr |要发送的消息|
61| msg_prio |指优先级|
62| timeout |超时值|
63返回	0 - 成功,非0 - 失败
64
65
66## osMessageQueueGet()
67
68```c
69osStatus_t osMessageQueueGet (osMessageQueueId_t mq_id,void *msg_ptr,uint8_t *msg_prio,uint32_t timeout)
70```
71**描述:**
72
73获取消息
74> **注意** :如果参数timeout设置为0,可以从中断服务例程调用
75
76**参数:**
77
78|名字|描述|
79|:--|:------|
80| mq_id |由osMessageQueueNew获得的消息队列ID|
81| msg_ptr |指针指向队列中获取消息的缓冲区指针|
82| msg_prio |指优先级|
83| timeout |超时值|
84返回	0 - 成功,非0 - 失败
85
86
87## 软件设计
88
89**主要代码分析**
90
91在Msg_example函数中,通过osThreadNew()函数创建了Thread_MsgQ1、Thread_MsgQ2两个线程,Thread_MsgQ1、Thread_MsgQ2两个线程启动后会输出打印日志。
92
93```c
94typedef struct
95{
96    char *buffer;
97} MSG_BUF;
98MSG_BUF msg_buf;
99void Thread_MsgQueue1(void *arg)
100{
101	msg_buf.buffer = "hello niobe";
102	while (1)
103	{
104		osMessageQueuePut(MsgQueue, &msg_buf.buffer, 0U, 0U);
105		//suspend thread
106		osThreadYield();
107		osDelay(100);
108	}
109}
110
111void Thread_MsgQueue2(void *arg)
112{
113	osStatus_t status;
114
115	while (1)
116	{
117		//wait for message
118		status = osMessageQueueGet(MsgQueue, &msg_buf.buffer, NULL, 0U);
119		if (status == osOK)
120		{
121            printf("Thread_MsgQueue2 Get msg: %s\n", msg_buf.buffer);
122        }
123        else
124        {
125            osDelay(100);
126		}
127	}
128}
129
130static void Msg_example(void)
131{
132
133	MsgQueue = osMessageQueueNew(10, 50, NULL);
134	if (MsgQueue == NULL)
135	{
136		printf("create Message Queue failed!\n");
137	}
138
139	osThreadAttr_t attr;
140
141	attr.attr_bits = 0U;
142	attr.cb_mem = NULL;
143	attr.cb_size = 0U;
144	attr.stack_mem = NULL;
145	attr.stack_size = 1024 * 10;
146	attr.priority = 10;
147
148	attr.name = "Thread_MsgQueue1";
149	if (osThreadNew(Thread_MsgQueue1, NULL, &attr) == NULL)
150	{
151		printf("create Thread_MsgQueue1 failed!\n");
152	}
153
154	attr.name = "Thread_MsgQueue2";
155	if (osThreadNew(Thread_MsgQueue2, NULL, &attr) == NULL)
156	{
157		printf("create Thread_MsgQueue2 failed!\n");
158	}
159}
160
161APP_FEATURE_INIT(Msg_example);
162
163```
164
165## 编译调试
166- 进入//kernel/liteos_m目录, 在menuconfig配置中进入如下选项:
167
168     `(Top) → Platform → Board Selection → select board niobe407 → use talkweb niobe407 application → niobe407 application choose`
169
170- 选择 `007_system_message`
171
172- 回到sdk根目录,执行`hb build -f`脚本进行编译。
173
174### 运行结果
175
176示例代码编译烧录代码后,按下开发板的RESET按键,通过串口助手查看日志
177```
178ThreadMsgQueue2 Get msg: hello niobe407
179ThreadMsgQueue2 Get msg: hello niobe407
180ThreadMsgQueue2 Get msg: hello niobe407
181ThreadMsgQueue2 Get msg: hello niobe407
182ThreadMsgQueue2 Get msg: hello niobe407
183ThreadMsgQueue2 Get msg: hello niobe407
184ThreadMsgQueue2 Get msg: hello niobe407
185```
186