鸿蒙南向开发教程 Day 3:OpenHarmony 线程管理

发布时间:2026/6/3 14:18:25

鸿蒙南向开发教程 Day 3:OpenHarmony 线程管理 目标掌握 OpenHarmony 轻量系统的线程创建与管理理解 CMSIS-RTOS2 接口设计前置条件已完成 Day 2 的 Hello World 工程一、工程结构app/ ├── BUILD.gn └── 01_thread/ # 模块目录 ├── BUILD.gn └── demo.c # 线程测试代码1.1app/BUILD.gnimport(//build/lite/config/component/lite_component.gni) lite_component(app) { features [ 01_thread:thread_demo, # 引用 01_thread 模块 ] }1.201_thread/BUILD.gnstatic_library(thread_demo) { sources [ demo.c ] include_dirs [ //utils/native/lite/include, //kernel/liteos_m/components/cmsis/2.0, # CMSIS-RTOS2 头文件路径 ] }//kernel/liteos_m/components/cmsis/2.0是 CMSIS-RTOS2 接口的头文件目录这是 OpenHarmony 轻量系统的关键设计。二、完整代码详解2.1 头文件#includestdio.h// 标准输入输出#includeunistd.h// UNIX 标准函数如 sleep#includeohos_init.h// OpenHarmony 系统初始化#includecmsis_os2.h// CMSIS-RTOS2 接口头文件关键cmsis_os2.h是 ARM 定义的CMSIS-RTOS2 标准接口不是 LiteOS 原生头文件。2.2 宏定义#defineTHREAD_NUM(1000)// 线程循环计数上限#defineSTACK_SIZE(1024)// 线程栈大小字节#defineDELAY_TICKS_20(20)// 20 个 tick 延时#defineDELAY_TICKS_100(100)// 100 个 tick 延时2.3 线程创建辅助函数osThreadId_tnewThread(char*name,osThreadFunc_tfunc,char*arg){osThreadAttr_tattr{name,// 线程名称0,// 属性位保留NULL,// 控制块内存NULL 表示自动分配0,// 控制块大小NULL,// 栈内存NULL 表示自动分配STACK_SIZE*2,// 栈大小2048 字节osPriorityNormal,// 优先级普通0,// 保留0// 保留};osThreadId_ttidosThreadNew(func,(void*)arg,attr);if(tidNULL){printf([Thread Test] osThreadNew(%s) failed.\r\n,name);}else{printf([Thread Test] osThreadNew(%s) success, thread id: %d.\r\n,name,tid);}returntid;}osThreadAttr_t结构体字段字段说明name线程名称用于调试attr_bits属性位保留cb_mem控制块内存NULL 自动分配cb_size控制块大小stack_mem栈内存NULL 自动分配stack_size栈大小priority线程优先级tz_moduleTrustZone 模块 IDreserved保留2.4 工作线程voidthreadTest(char*arg){staticintcount0;printf(%s\r\n,arg);// 打印传入的参数osThreadId_ttidosThreadGetId();// 获取当前线程 IDprintf([Thread Test] threadTest osThreadGetId, thread id:%p\r\n,tid);while(countTHREAD_NUM){count;printf([Thread Test] threadTest, count: %d.\r\n,count);osDelay(DELAY_TICKS_20);// 延时 20 个 tick主动让出 CPU}}2.5 主控制线程voidrtosv2_thread_main(void){// 1. 创建新线程osThreadId_ttidnewThread(test_thread,threadTest,This is a test thread.);// 2. 获取线程名称constchar*t_nameosThreadGetName(tid);printf([Thread Test] osThreadGetName, thread name: %s.\r\n,t_name);// 3. 获取线程状态osThreadState_tstateosThreadGetState(tid);printf([Thread Test] osThreadGetState, state :%d.\r\n,state);// 状态值1Running, 2Ready, 3Blocked, 4Terminated, 0Inactive// 4. 设置线程优先级osStatus_tstatusosThreadSetPriority(tid,osPriorityNormal4);printf([Thread Test] osThreadSetPriority, status: %d.\r\n,status);// 5. 获取线程优先级osPriority_tpriosThreadGetPriority(tid);printf([Thread Test] osThreadGetPriority, priority: %d.\r\n,pri);// 6. 挂起线程暂停执行statusosThreadSuspend(tid);printf([Thread Test] osThreadSuspend, status: %d.\r\n,status);// 7. 恢复线程继续执行statusosThreadResume(tid);printf([Thread Test] osThreadResume, status: %d.\r\n,status);// 8. 获取栈大小uint32_tstack_sizeosThreadGetStackSize(tid);printf([Thread Test] osThreadGetStackSize, stack size: %d.\r\n,stack_size);// 9. 获取栈剩余空间uint32_tstack_spaceosThreadGetStackSpace(tid);printf([Thread Test] osThreadGetStackSpace, stack space: %d.\r\n,stack_space);// 10. 获取系统中线程总数uint32_tcountosThreadGetCount();printf([Thread Test] osThreadGetCount, thread count: %d.\r\n,count);// 延时 100 tickosDelay(DELAY_TICKS_100);// 再次挂起线程statusosThreadSuspend(tid);printf([Thread Test] osThreadSuspend, status: %d.\r\n,status);}2.6 系统入口staticvoidThreadTestTask(void){osThreadAttr_tattr;attr.namertosv2_thread_main;attr.attr_bits0;attr.cb_memNULL;attr.cb_size0;attr.stack_memNULL;attr.stack_sizeSTACK_SIZE;attr.priorityosPriorityNormal;if(osThreadNew((osThreadFunc_t)rtosv2_thread_main,NULL,attr)NULL){printf([Thread Test] Failed to create thread: rtosv2_thread_main.\r\n);}}APP_FEATURE_INIT(ThreadTestTask);// 注册为应用初始化入口APP_FEATURE_INIT与SYS_RUN的区别SYS_RUN系统启动时执行优先级较高APP_FEATURE_INIT应用初始化阶段执行适合创建应用线程三、CMSIS-RTOS2 API 速查表函数功能对应 LiteOS 原生osThreadNew创建线程LOS_TaskCreateosThreadGetId获取当前线程 IDLOS_CurTaskIDGetosThreadGetName获取线程名称LOS_TaskNameGetosThreadGetState获取线程状态LOS_TaskStatusGetosThreadSetPriority设置优先级LOS_TaskPriSetosThreadGetPriority获取优先级LOS_TaskPriGetosThreadSuspend挂起线程LOS_TaskSuspendosThreadResume恢复线程LOS_TaskResumeosThreadGetStackSize获取栈大小-osThreadGetStackSpace获取栈剩余空间LOS_TaskStackWaterLineGetosThreadGetCount获取线程总数LOS_TaskTotalNumGetosDelay延时tickLOS_TaskDelay四、核心问题为什么 OpenHarmony 使用 CMSIS-RTOS2 而不是 LiteOS 原生 Task4.1 什么是 CMSIS-RTOS2CMSISCortex Microcontroller Software Interface Standard是 ARM 推出的Cortex-M 微控制器软件接口标准。CMSIS-RTOS2是其中的RTOS 接口层规范定义了一套统一的 API让上层应用代码可以不依赖具体的 RTOS 内核。4.2 设计架构┌─────────────────────────────────────────┐ │ 应用层你的代码 │ │ printf, GPIO, 传感器驱动, 网络协议... │ ├─────────────────────────────────────────┤ │ CMSIS-RTOS2 接口层 │ ← 你调用的 osThreadNew, osDelay... │ #include cmsis_os2.h │ ├─────────────────────────────────────────┤ │ OpenHarmony 适配层 │ ← 将 CMSIS API 映射到具体内核 │ //kernel/liteos_m/components/cmsis/2.0 │ ├─────────────────────────────────────────┤ │ 内核层LiteOS-M │ ← LOS_TaskCreate, LOS_TaskDelay... │ //kernel/liteos_m/kernel/... │ └─────────────────────────────────────────┘4.3 为什么不用 LiteOS 原生 API原因说明可移植性CMSIS-RTOS2 是 ARM 标准代码可在任何支持 CMSIS 的 RTOS 上运行FreeRTOS、RT-Thread、LiteOS 等生态兼容大量第三方库和中间件基于 CMSIS-RTOS2 编写直接兼容降低学习成本开发者只需学一套 API不用关心底层是哪个 RTOS内核可替换OpenHarmony 未来可以切换内核如从 LiteOS 换到 FreeRTOS上层代码无需修改标准化ARM 统一维护文档完善社区支持广泛4.4 与 FreeRTOS 的关系注意CMSIS-RTOS2 不是 FreeRTOS它是一个接口标准。FreeRTOS是一个具体的 RTOS 内核和 LiteOS 同级CMSIS-RTOS2是一套 API 规范OpenHarmony 的 LiteOS-M实现了CMSIS-RTOS2 接口也就是说你调用osThreadNew()→ OpenHarmony 的 CMSIS 适配层 → 内部调用LOS_TaskCreate()如果你在 FreeRTOS 上调用osThreadNew()→ FreeRTOS 的 CMSIS 适配层 → 内部调用xTaskCreate()同样的代码不同的内核行为一致。4.5 为什么不叫 “FreeRTOS(cmsis)”这是一个常见的误解。准确的说法是OpenHarmony 轻量系统使用LiteOS-M内核通过CMSIS-RTOS2 接口暴露给上层。之所以有人误以为是 FreeRTOS是因为CMSIS-RTOS2 的 API 命名风格osThreadXxx,osDelay和 FreeRTOS 类似两者都源自 ARM 生态部分文档翻译不够精确实际上OpenHarmony 轻量系统的内核是LiteOS-M华为自研标准系统的内核是Linux。五、编译与验证5.1 编译VSCode 点击Build编译成功后烧录。5.2 串口输出波特率115200重启开发板[Thread Test] osThreadNew(test_thread) success, thread id: 3. This is a test thread. [Thread Test] threadTest osThreadGetId, thread id:0x3 [Thread Test] osThreadGetName, thread name: test_thread. [Thread Test] osThreadGetState, state :1. // 1 Running [Thread Test] osThreadSetPriority, status: 0. // 0 osOK [Thread Test] osThreadGetPriority, priority: 24. // osPriorityNormal4 [Thread Test] osThreadSuspend, status: 0. [Thread Test] osThreadResume, status: 0. [Thread Test] osThreadGetStackSize, stack size: 2048. [Thread Test] osThreadGetStackSpace, stack space: 1024. [Thread Test] osThreadGetCount, thread count: 4. [Thread Test] threadTest, count: 1. [Thread Test] threadTest, count: 2. ...六、总结要点内容接口层cmsis_os2.h是标准接口不是具体 RTOS内核OpenHarmony 轻量系统底层是LiteOS-M设计目的解耦应用与内核提高可移植性常用 APIosThreadNew,osDelay,osThreadSuspend,osThreadResume入口宏APP_FEATURE_INIT用于应用初始化七、下一步Day 4 预告互斥锁与信号量—— 多线程同步与资源保护。需要继续 Day 4 的内容吗

相关新闻