From f8ebe289de881a5d30e602c058c7574a6752e76f Mon Sep 17 00:00:00 2001 From: lianzhian Date: Mon, 16 May 2022 15:24:31 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E6=96=B0=E5=A2=9E3861=E5=A5=97=E4=BB=B6?= =?UTF-8?q?=E6=A0=B7=E4=BE=8B=E4=BE=9B=E5=BC=80=E5=8F=91=E8=80=85=E5=8F=82?= =?UTF-8?q?=E8=80=8300=5Fthread?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lianzhian --- hispark_pegasus/demo/00_thread/BUILD.gn | 37 +++++ hispark_pegasus/demo/00_thread/README.md | 187 +++++++++++++++++++++++ hispark_pegasus/demo/00_thread/thread.c | 85 +++++++++++ 3 files changed, 309 insertions(+) create mode 100644 hispark_pegasus/demo/00_thread/BUILD.gn create mode 100644 hispark_pegasus/demo/00_thread/README.md create mode 100644 hispark_pegasus/demo/00_thread/thread.c diff --git a/hispark_pegasus/demo/00_thread/BUILD.gn b/hispark_pegasus/demo/00_thread/BUILD.gn new file mode 100644 index 00000000..426e9de0 --- /dev/null +++ b/hispark_pegasus/demo/00_thread/BUILD.gn @@ -0,0 +1,37 @@ +# Copyright (c) 2020, HiHope Community. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +static_library("thread_demo") { + sources = [ + "thread.c" + ] + + include_dirs = [ + "//utils/native/lite/include", + "//kernel/liteos_m/components/cmsis/2.0", + ] +} diff --git a/hispark_pegasus/demo/00_thread/README.md b/hispark_pegasus/demo/00_thread/README.md new file mode 100644 index 00000000..f4737ee0 --- /dev/null +++ b/hispark_pegasus/demo/00_thread/README.md @@ -0,0 +1,187 @@ +# HiSpark WiFi-IoT 鸿蒙开发套件样例开发--线程(Thread) + +![hihope_illustration](https://gitee.com/hihopeorg/hispark-hm-pegasus/raw/master/docs/figures/hihope_illustration.png) + +[HiSpark WiFi-IoT鸿蒙开发套件](https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w5003-23341819265.1.bf644a82Da9PZK&id=622343426064&scene=taobao_shop) 首发于HDC 2020,是首批支持HarmonyOS 2.0的开发套件,亦是鸿蒙官方推荐套件,由润和软件HiHope量身打造,已在鸿蒙社区和广大鸿蒙开发者中得到广泛应用。 + +![wifi_iot](https://gitee.com/hihopeorg/hispark-hm-pegasus/raw/master/docs/figures/wifi_iot.png) + +## 一、Thread API + +| API名称 | 说明 | +| --------------------- | ------------------------------------------------------ | +| osThreadNew | 创建一个线程并将其加入活跃线程组中 | +| osThreadGetName | 返回指定线程的名字 | +| osThreadGetId | 返回当前运行线程的线程ID | +| osThreadGetState | 返回当前线程的状态 | +| osThreadSetPriority | 设置指定线程的优先级 | +| osThreadGetPriority | 获取当前线程的优先级 | +| osThreadYield | 将运行控制转交给下一个处于READY状态的线程 | +| osThreadSuspend | 挂起指定线程的运行 | +| osThreadResume | 恢复指定线程的运行 | +| osThreadDetach | 分离指定的线程(当线程终止运行时,线程存储可以被回收) | +| osThreadJoin | 等待指定线程终止运行 | +| osThreadExit | 终止当前线程的运行 | +| osThreadTerminate | 终止指定线程的运行 | +| osThreadGetStackSize | 获取指定线程的栈空间大小 | +| osThreadGetStackSpace | 获取指定线程的未使用的栈空间大小 | +| osThreadGetCount | 获取活跃线程数 | +| osThreadEnumerate | 获取线程组中的活跃线程数 | + +### osThreadNew() + +```c +osThreadId_t osThreadNew(osThreadFunc_t func, void *argument,const osThreadAttr_t *attr ) +``` + +> **注意** :不能在中断服务调用该函数 + +**参数:** + +| 名字 | 描述 | +| :------- | :------------------------------- | +| func | 线程函数. | +| argument | 作为启动参数传递给线程函数的指针 | +| attr | 线程属性 | + +### osThreadTerminate() + +```c +osStatus_t osThreadTerminate (osThreadId_t thread_id) +``` + +| 名字 | 描述 | +| --------- | ---------------------------------------------------- | +| thread_id | 指定线程id,该id是由osThreadNew或者osThreadGetId获得 | + +## 二、代码分析 + +创建线程,创建成功则打印线程名字和线程ID + +``` +osThreadId_t newThread(char *name, osThreadFunc_t func, void *arg) { + osThreadAttr_t attr = { + name, 0, NULL, 0, NULL, 1024*2, osPriorityNormal, 0, 0 + }; + osThreadId_t tid = osThreadNew(func, arg, &attr); + if (tid == NULL) { + printf("osThreadNew(%s) failed.\r\n", name); + } else { + printf("osThreadNew(%s) success, thread id: %d.\r\n", name, tid); + } + return tid; +} +``` + +该函数首先会打印自己的参数,然后对全局变量count进行循环+1操作,之后会打印count的值 + +``` +void threadTest(void *arg) { + static int count = 0; + printf("%s\r\n",(char *)arg); + osThreadId_t tid = osThreadGetId(); + printf("threadTest osThreadGetId, thread id:%p\r\n", tid); + while (1) { + count++; + printf("threadTest, count: %d.\r\n", count); + osDelay(20); + } +} +``` + +主程序rtosv2_thread_main创建线程并运行,并使用上述API进行相关操作,最后终止所创建的线程。 + +``` +void rtosv2_thread_main(void *arg) { + (void)arg; + osThreadId_t tid=newThread("test_thread", threadTest, "This is a test thread."); + + const char *t_name = osThreadGetName(tid); + printf("[Thread Test]osThreadGetName, thread name: %s.\r\n", t_name); + + osThreadState_t state = osThreadGetState(tid); + printf("[Thread Test]osThreadGetState, state :%d.\r\n", state); + + osStatus_t status = osThreadSetPriority(tid, osPriorityNormal4); + printf("[Thread Test]osThreadSetPriority, status: %d.\r\n", status); + + osPriority_t pri = osThreadGetPriority (tid); + printf("[Thread Test]osThreadGetPriority, priority: %d.\r\n", pri); + + status = osThreadSuspend(tid); + printf("[Thread Test]osThreadSuspend, status: %d.\r\n", status); + + status = osThreadResume(tid); + printf("[Thread Test]osThreadResume, status: %d.\r\n", status); + + uint32_t stacksize = osThreadGetStackSize(tid); + printf("[Thread Test]osThreadGetStackSize, stacksize: %d.\r\n", stacksize); + + uint32_t stackspace = osThreadGetStackSpace(tid); + printf("[Thread Test]osThreadGetStackSpace, stackspace: %d.\r\n", stackspace); + + uint32_t t_count = osThreadGetCount(); + printf("[Thread Test]osThreadGetCount, count: %d.\r\n", t_count); + + osDelay(100); + status = osThreadTerminate(tid); + printf("[Thread Test]osThreadTerminate, status: %d.\r\n", status); +} +``` + +## 三、如何编译 + +1. 将此目录下的 `thread.c` 和 `BUILD.gn` 复制到openharmony源码的`applications\sample\wifi-iot\app\iothardware`目录下, +2. 修改openharmony源码的`applications\sample\wifi-iot\app\BUILD.gn`文件,将其中的 `features` 改为: + +``` + features = [ + "iothardware:thread_demo", + ] +``` + + 3.在openharmony源码顶层目录执行:`python build.py wifiiot` + +## 四、运行结果 + +``` +[Thread Test] osThreadNew(test_thread) success. +[Thread Test] osThreadGetName, thread name: test_thread. +[Thread Test] osThreadGetState, state :1. +[Thread Test] This is a test thread. <-testThread log +[Thread Test] threadTest osThreadGetId, thread id:0xe8544 +[Thread Test] threadTest, count: 1. <-testThread log +[Thread Test] osThreadSetPriority, status: 0. +[Thread Test] osThreadGetPriority, priority: 28. +[Thread Test] osThreadSuspend, status: 0. +[Thread Test] osThreadResume, status: 0. +[Thread Test] osThreadGetStackSize, stacksize: 2048. +[Thread Test] osThreadGetStackSpace, stackspace: 1144. +[Thread Test] osThreadGetCount, count: 12. +[Thread Test] threadTest, count: 2. <-testThread log +[Thread Test] threadTest, count: 3. <-testThread log +[Thread Test] threadTest, count: 4. <-testThread log +[Thread Test] threadTest, count: 5. <-testThread log +[Thread Test] threadTest, count: 6. <-testThread log +[Thread Test] osThreadTerminate, status: 0. +``` + +### 【套件支持】 + +##### 1. 套件介绍 http://www.hihope.org/pro/pro1.aspx?mtt=8 + +##### 2. 套件购买 https://item.taobao.com/item.htm?id=622343426064&scene=taobao_shop + +##### 3. 技术资料 + +- Gitee码云网站(OpenHarmony Sample Code等) **https://gitee.com/hihopeorg** + +- HiHope官网-资源中心(SDK包、技术文档下载)[**www.hihope.org**](http://www.hihope.org/) + +##### 4. 互动交流 + +- 润和HiHope鸿蒙技术交流-微信群(加群管理员微信13605188699,发送文字#申请加入润和官方鸿蒙群#,予以邀请入群) +- HiHope开发者社区-论坛 **https://bbs.elecfans.com/group_1429** +- 润和HiHope鸿蒙售后服务群(QQ:980599547) +- 售后服务电话(025-52668590) + diff --git a/hispark_pegasus/demo/00_thread/thread.c b/hispark_pegasus/demo/00_thread/thread.c new file mode 100644 index 00000000..2d19a0cf --- /dev/null +++ b/hispark_pegasus/demo/00_thread/thread.c @@ -0,0 +1,85 @@ +#include +#include + +#include "ohos_init.h" +#include "cmsis_os2.h" + +osThreadId_t newThread(char *name, osThreadFunc_t func, void *arg) { + osThreadAttr_t attr = { + name, 0, NULL, 0, NULL, 1024*2, osPriorityNormal, 0, 0 + }; + osThreadId_t tid = osThreadNew(func, arg, &attr); + if (tid == NULL) { + printf("[Thread Test] osThreadNew(%s) failed.\r\n", name); + } else { + printf("[Thread Test] osThreadNew(%s) success, thread id: %d.\r\n", name, tid); + } + return tid; +} + +void threadTest(void *arg) { + static int count = 0; + printf("%s\r\n",(char *)arg); + osThreadId_t tid = osThreadGetId(); + printf("[Thread Test] threadTest osThreadGetId, thread id:%p\r\n", tid); + while (1) { + count++; + printf("[Thread Test] threadTest, count: %d.\r\n", count); + osDelay(20); + } +} + +void rtosv2_thread_main(void *arg) { + (void)arg; + osThreadId_t tid=newThread("test_thread", threadTest, "This is a test thread."); + + const char *t_name = osThreadGetName(tid); + printf("[Thread Test] osThreadGetName, thread name: %s.\r\n", t_name); + + osThreadState_t state = osThreadGetState(tid); + printf("[Thread Test] osThreadGetState, state :%d.\r\n", state); + + osStatus_t status = osThreadSetPriority(tid, osPriorityNormal4); + printf("[Thread Test] osThreadSetPriority, status: %d.\r\n", status); + + osPriority_t pri = osThreadGetPriority (tid); + printf("[Thread Test] osThreadGetPriority, priority: %d.\r\n", pri); + + status = osThreadSuspend(tid); + printf("[Thread Test] osThreadSuspend, status: %d.\r\n", status); + + status = osThreadResume(tid); + printf("[Thread Test] osThreadResume, status: %d.\r\n", status); + + uint32_t stacksize = osThreadGetStackSize(tid); + printf("[Thread Test] osThreadGetStackSize, stacksize: %d.\r\n", stacksize); + + uint32_t stackspace = osThreadGetStackSpace(tid); + printf("[Thread Test] osThreadGetStackSpace, stackspace: %d.\r\n", stackspace); + + uint32_t t_count = osThreadGetCount(); + printf("[Thread Test] osThreadGetCount, count: %d.\r\n", t_count); + + osDelay(100); + status = osThreadTerminate(tid); + printf("[Thread Test] osThreadTerminate, status: %d.\r\n", status); +} + +static void ThreadTestTask(void) +{ + osThreadAttr_t attr; + + attr.name = "rtosv2_thread_main"; + attr.attr_bits = 0U; + attr.cb_mem = NULL; + attr.cb_size = 0U; + attr.stack_mem = NULL; + attr.stack_size = 1024; + attr.priority = osPriorityNormal; + + if (osThreadNew((osThreadFunc_t)rtosv2_thread_main, NULL, &attr) == NULL) { + printf("[ThreadTestTask] Falied to create rtosv2_thread_main!\n"); + } +} + +APP_FEATURE_INIT(ThreadTestTask); \ No newline at end of file -- Gitee From 92a75d44dc9a809f6294f57c081e7b5c98664cc7 Mon Sep 17 00:00:00 2001 From: lianzhian Date: Mon, 16 May 2022 16:02:22 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E4=BF=AE=E6=94=B9pr=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lianzhian --- hispark_pegasus/.DS_Store | Bin 0 -> 6148 bytes hispark_pegasus/demo/00_thread/thread.c | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 hispark_pegasus/.DS_Store diff --git a/hispark_pegasus/.DS_Store b/hispark_pegasus/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..31a8d33e177c7b417867365f77361d74539a1b2f GIT binary patch literal 6148 zcmeHKyH3O~5S)b+k!Y@@^e^xS(dqaCJ^%!vK*}k_L7$56;?tOYAaTkeT|)!2(t7OO z9b29v8w0TI+js+P0Q7W6y!)^=&%3Yeq9TswdyI#t>2aPXF3vUQb{O%DJ?8KH9ur>h z%EXKV?y>($p1ZT^q<|EV0#ZNh($ literal 0 HcmV?d00001 diff --git a/hispark_pegasus/demo/00_thread/thread.c b/hispark_pegasus/demo/00_thread/thread.c index 2d19a0cf..9d7950ed 100644 --- a/hispark_pegasus/demo/00_thread/thread.c +++ b/hispark_pegasus/demo/00_thread/thread.c @@ -52,13 +52,13 @@ void rtosv2_thread_main(void *arg) { printf("[Thread Test] osThreadResume, status: %d.\r\n", status); uint32_t stacksize = osThreadGetStackSize(tid); - printf("[Thread Test] osThreadGetStackSize, stacksize: %d.\r\n", stacksize); + printf("[Thread Test] osThreadGetStackSize, stacksize: %u.\r\n", stacksize); uint32_t stackspace = osThreadGetStackSpace(tid); - printf("[Thread Test] osThreadGetStackSpace, stackspace: %d.\r\n", stackspace); + printf("[Thread Test] osThreadGetStackSpace, stackspace: %u.\r\n", stackspace); uint32_t t_count = osThreadGetCount(); - printf("[Thread Test] osThreadGetCount, count: %d.\r\n", t_count); + printf("[Thread Test] osThreadGetCount, count: %u.\r\n", t_count); osDelay(100); status = osThreadTerminate(tid); -- Gitee From 87898cd885f3583fc088a3e032da6146c0457143 Mon Sep 17 00:00:00 2001 From: lianzhian Date: Mon, 16 May 2022 16:49:51 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=9D=99=E6=80=81?= =?UTF-8?q?=E6=A3=80=E6=9F=A5=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lianzhian --- hispark_pegasus/demo/.DS_Store | Bin 0 -> 6148 bytes hispark_pegasus/demo/00_thread/BUILD.gn | 34 +++++++----------------- 2 files changed, 10 insertions(+), 24 deletions(-) create mode 100644 hispark_pegasus/demo/.DS_Store diff --git a/hispark_pegasus/demo/.DS_Store b/hispark_pegasus/demo/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..11e5f02e1ebaeb70ae749c686dd9b5653235346f GIT binary patch literal 6148 zcmeHKIZgvX5Ud6VMkEdi=LztGk!4=M130`$1ePoT&NuSA{4}bM0Bdn(603UEQ!_nX zv)T%#w*lC4H#`6f0CTz{_C8F__uVIURS_f7dBz7m@s3vv!`CGH?|^e}aL?x%-@p0m z&D(an@okwDkOERb3P=Gda7G2HxXy3Sc&3h$0#e{I6!80@(H(o?m>5?FhiCzaGls)B zk6wbLuSI;@%xt2bM9C>C$$`7P36JyD|+kOIdF zT<3D(_5YE6qW?c8X(a`uz(pxwv(?jT$xo` Date: Mon, 16 May 2022 08:55:15 +0000 Subject: [PATCH 4/5] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20hisp?= =?UTF-8?q?ark=5Fpegasus/demo/.DS=5FStore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hispark_pegasus/demo/.DS_Store | Bin 6148 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 hispark_pegasus/demo/.DS_Store diff --git a/hispark_pegasus/demo/.DS_Store b/hispark_pegasus/demo/.DS_Store deleted file mode 100644 index 11e5f02e1ebaeb70ae749c686dd9b5653235346f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKIZgvX5Ud6VMkEdi=LztGk!4=M130`$1ePoT&NuSA{4}bM0Bdn(603UEQ!_nX zv)T%#w*lC4H#`6f0CTz{_C8F__uVIURS_f7dBz7m@s3vv!`CGH?|^e}aL?x%-@p0m z&D(an@okwDkOERb3P=Gda7G2HxXy3Sc&3h$0#e{I6!80@(H(o?m>5?FhiCzaGls)B zk6wbLuSI;@%xt2bM9C>C$$`7P36JyD|+kOIdF zT<3D(_5YE6qW?c8X(a`uz(pxwv(?jT$xo` Date: Mon, 16 May 2022 08:55:24 +0000 Subject: [PATCH 5/5] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20hisp?= =?UTF-8?q?ark=5Fpegasus/.DS=5FStore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hispark_pegasus/.DS_Store | Bin 6148 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 hispark_pegasus/.DS_Store diff --git a/hispark_pegasus/.DS_Store b/hispark_pegasus/.DS_Store deleted file mode 100644 index 31a8d33e177c7b417867365f77361d74539a1b2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKyH3O~5S)b+k!Y@@^e^xS(dqaCJ^%!vK*}k_L7$56;?tOYAaTkeT|)!2(t7OO z9b29v8w0TI+js+P0Q7W6y!)^=&%3Yeq9TswdyI#t>2aPXF3vUQb{O%DJ?8KH9ur>h z%EXKV?y>($p1ZT^q<|EV0#ZNh($ -- Gitee