• Home
Name Date Size #Lines LOC

..--

BUILD.gnD12-May-2024773 2219

README.mdD12-May-20247.5 KiB188142

thread.cD12-May-20243.3 KiB10673

README.md

1# HiSpark WiFi-IoT 开发套件样例开发--线程(Thread)
2
3![hihope_illustration](https://gitee.com/hihopeorg/hispark-hm-pegasus/raw/master/docs/figures/hihope_illustration.png)
4
5[HiSpark WiFi-IoT开发套件]首发于HDC 2020,是首批支持OpenHarmony 2.0的开发套件,亦是官方推荐套件,由润和软件HiHope量身打造,已在OpenHarmony社区和广大OpenHarmony开发者中得到广泛应用。
6
7![wifi_iot](https://gitee.com/hihopeorg/hispark-hm-pegasus/raw/master/docs/figures/2.png)
8
9## 一、Thread API
10
11| API名称               | 说明                                                   |
12| --------------------- | ------------------------------------------------------ |
13| osThreadNew           | 创建一个线程并将其加入活跃线程组中                     |
14| osThreadGetName       | 返回指定线程的名字                                     |
15| osThreadGetId         | 返回当前运行线程的线程ID                               |
16| osThreadGetState      | 返回当前线程的状态                                     |
17| osThreadSetPriority   | 设置指定线程的优先级                                   |
18| osThreadGetPriority   | 获取当前线程的优先级                                   |
19| osThreadYield         | 将运行控制转交给下一个处于READY状态的线程              |
20| osThreadSuspend       | 挂起指定线程的运行                                     |
21| osThreadResume        | 恢复指定线程的运行                                     |
22| osThreadDetach        | 分离指定的线程(当线程终止运行时,线程存储可以被回收) |
23| osThreadJoin          | 等待指定线程终止运行                                   |
24| osThreadExit          | 终止当前线程的运行                                     |
25| osThreadTerminate     | 终止指定线程的运行                                     |
26| osThreadGetStackSize  | 获取指定线程的栈空间大小                               |
27| osThreadGetStackSpace | 获取指定线程的未使用的栈空间大小                       |
28| osThreadGetCount      | 获取活跃线程数                                         |
29| osThreadEnumerate     | 获取线程组中的活跃线程数                               |
30
31### osThreadNew()
32
33```c
34osThreadId_t osThreadNew(osThreadFunc_t	func, void *argument,const osThreadAttr_t *attr )
35```
36
37> **注意** :不能在中断服务调用该函数
38
39**参数:**
40
41| 名字     | 描述                             |
42| :------- | :------------------------------- |
43| func     | 线程函数.                        |
44| argument | 作为启动参数传递给线程函数的指针 |
45| attr     | 线程属性                         |
46
47### osThreadTerminate()
48
49```c
50osStatus_t osThreadTerminate (osThreadId_t thread_id)
51```
52
53| 名字      | 描述                                                 |
54| --------- | ---------------------------------------------------- |
55| thread_id | 指定线程id,该id是由osThreadNew或者osThreadGetId获得 |
56
57## 二、代码分析
58
59创建线程,创建成功则打印线程名字和线程ID
60
61```
62osThreadId_t newThread(char *name, osThreadFunc_t func, void *arg) {
63    osThreadAttr_t attr = {
64        name, 0, NULL, 0, NULL, 1024*2, osPriorityNormal, 0, 0
65    };
66    osThreadId_t tid = osThreadNew(func, arg, &attr);
67    if (tid == NULL) {
68        printf("osThreadNew(%s) failed.\r\n", name);
69    } else {
70        printf("osThreadNew(%s) success, thread id: %d.\r\n", name, tid);
71    }
72    return tid;
73}
74```
75
76该函数首先会打印自己的参数,然后对全局变量count进行循环+1操作,之后会打印count的值
77
78```
79void threadTest(void *arg) {
80    static int count = 0;
81    printf("%s\r\n",(char *)arg);
82    osThreadId_t tid = osThreadGetId();
83    printf("threadTest osThreadGetId, thread id:%p\r\n", tid);
84    while (1) {
85        count++;
86        printf("threadTest, count: %d.\r\n", count);
87        osDelay(20);
88    }
89}
90```
91
92主程序rtosv2_thread_main创建线程并运行,并使用上述API进行相关操作,最后终止所创建的线程。
93
94```
95void rtosv2_thread_main(void *arg) {
96    (void)arg;
97    osThreadId_t tid=newThread("test_thread", threadTest, "This is a test thread.");
98
99    const char *t_name = osThreadGetName(tid);
100    printf("[Thread Test]osThreadGetName, thread name: %s.\r\n", t_name);
101
102    osThreadState_t state = osThreadGetState(tid);
103    printf("[Thread Test]osThreadGetState, state :%d.\r\n", state);
104
105    osStatus_t status = osThreadSetPriority(tid, osPriorityNormal4);
106    printf("[Thread Test]osThreadSetPriority, status: %d.\r\n", status);
107
108    osPriority_t pri = osThreadGetPriority (tid);
109    printf("[Thread Test]osThreadGetPriority, priority: %d.\r\n", pri);
110
111    status = osThreadSuspend(tid);
112    printf("[Thread Test]osThreadSuspend, status: %d.\r\n", status);
113
114    status = osThreadResume(tid);
115    printf("[Thread Test]osThreadResume, status: %d.\r\n", status);
116
117    uint32_t stacksize = osThreadGetStackSize(tid);
118    printf("[Thread Test]osThreadGetStackSize, stacksize: %d.\r\n", stacksize);
119
120    uint32_t stackspace = osThreadGetStackSpace(tid);
121    printf("[Thread Test]osThreadGetStackSpace, stackspace: %d.\r\n", stackspace);
122
123    uint32_t t_count = osThreadGetCount();
124    printf("[Thread Test]osThreadGetCount, count: %d.\r\n", t_count);
125
126    osDelay(100);
127    status = osThreadTerminate(tid);
128    printf("[Thread Test]osThreadTerminate, status: %d.\r\n", status);
129}
130```
131
132## 三、如何编译
133
1341. 将此目录下的 `thread.c` 和 `BUILD.gn` 复制到openharmony源码的`applications\sample\wifi-iot\app\iothardware`目录下,
1352. 修改openharmony源码的`applications\sample\wifi-iot\app\BUILD.gn`文件,将其中的 `features` 改为:
136
137```
138    features = [
139        "iothardware:thread_demo",
140    ]
141```
142
1433. 在openharmony源码顶层目录执行:`python build.py wifiiot`
144
145## 四、运行结果
146
147```
148[Thread Test] osThreadNew(test_thread) success.
149[Thread Test] osThreadGetName, thread name: test_thread.
150[Thread Test] osThreadGetState, state :1.
151[Thread Test] This is a test thread.  <-testThread log
152[Thread Test] threadTest osThreadGetId, thread id:0xe8544
153[Thread Test] threadTest, count: 1.   <-testThread log
154[Thread Test] osThreadSetPriority, status: 0.
155[Thread Test] osThreadGetPriority, priority: 28.
156[Thread Test] osThreadSuspend, status: 0.
157[Thread Test] osThreadResume, status: 0.
158[Thread Test] osThreadGetStackSize, stacksize: 2048.
159[Thread Test] osThreadGetStackSpace, stackspace: 1144.
160[Thread Test] osThreadGetCount, count: 12.
161[Thread Test] threadTest, count: 2.   <-testThread log
162[Thread Test] threadTest, count: 3.   <-testThread log
163[Thread Test] threadTest, count: 4.   <-testThread log
164[Thread Test] threadTest, count: 5.   <-testThread log
165[Thread Test] threadTest, count: 6.   <-testThread log
166[Thread Test] osThreadTerminate, status: 0.
167```
168
169### 【套件支持】
170
171##### 1. 套件介绍  http://www.hihope.org/pro/pro1.aspx?mtt=8
172
173##### 2. 套件购买  https://item.taobao.com/item.htm?id=622343426064&scene=taobao_shop
174
175##### 3. 技术资料
176
177- Gitee码云网站(OpenHarmony Sample Code等) **https://gitee.com/hihopeorg**
178
179- HiHope官网-资源中心(SDK包、技术文档下载)[**www.hihope.org**](http://www.hihope.org/)
180
181##### 4. 互动交流
182
183- 润和HiHope技术交流-微信群(加群管理员微信13605188699,发送文字#申请加入润和官方OpenHarmony群#,予以邀请入群)
184- HiHope开发者社区-论坛 **https://bbs.elecfans.com/group_1429**
185- 润和HiHope售后服务群(QQ:980599547)
186- 售后服务电话(025-52668590)
187
188