OpenHarmony概述与使用

1. OpenHarmony Hi3861

学习目标与任务

  • 硬件基础知识:涵盖嵌入式硬件体系架构(如 MCU 基础、硬件接口原理 )、硬件设计流程(原理图绘制、PCB Layout 规范 ),了解常见硬件外设(传感器、通信模块等)的工作逻辑与硬件适配要点。
  • 软件 + 硬件开发模式:学习嵌入式软件开发与硬件协同流程,包括硬件驱动开发(基于 Hi3861 芯片手册编写驱动代码 )、通过 SDK 实现软件对硬件资源(GPIO、定时器等)的调用,理解软硬件交互的信号流程与时序控制。
  • 软件到硬件开发逻辑:掌握从需求分析(功能定义)→ 软件架构设计(模块划分、任务调度 )→ 硬件驱动适配(寄存器操作、协议实现 )→ 联调测试(软硬件协同排障 )的完整链路,理解 "软件逻辑依赖硬件能力,硬件能力通过软件调用释放" 的核心逻辑。
  • 物联网 IOT 开发流程:基于 Hi3861 实践 "需求调研(场景定义 )→ 方案设计(硬件选型、通信协议确定 )→ 开发实现(硬件电路、软件程序 )→ 联调测试(功能、兼容性 )→ 部署上线(OTA 升级、远程管理 )" 全流程,重点学习物联网设备的组网(如 Wi-Fi 配网 )、数据上云(MQTT/CoAP 协议应用 )、边缘计算(轻量级数据处理 )等关键环节。

2. OpenHarmony 概述

基本定义与定位
  • HarmonyOS(鸿蒙系统 ) :华为自主研发的商业闭源分布式操作系统,聚焦全场景智慧体验,通过 "硬件互助、资源共享",实现手机、平板、智能穿戴、智慧屏等华为终端的无缝协同,为消费者与商业场景提供深度整合的操作系统能力。
  • OpenHarmony(开源鸿蒙 ) :由开放原子开源基金会(OpenAtom Foundation )孵化、运营的开源分布式操作系统,面向全行业开放生态。以 "开源协同" 为核心,联合硬件厂商、开发者、行业伙伴,构建跨设备(IoT 终端、行业终端等 )的无缝协同体系,推动物联网时代的操作系统技术普惠与创新。
版本演进与关键特性
时间 版本 核心特性与支持设备
2020 年 9 月 OpenHarmony 1.0 聚焦 IoT 基础设备,支持 128KB - 128MB 内存 场景(如低功耗传感器、简易智能终端 ),奠定开源分布式框架雏形。
2021 年 6 月 OpenHarmony 2.0 全量开源 升级,扩展设备支持范围(覆盖更多行业终端、轻量级智能设备 ),强化分布式软总线能力,推动跨设备通信与协同开发生态初步构建。
2021 年 9 月 OpenHarmony 3.0 LTS 主打 "强分布式" ,支持 标准系统设备(如智能座舱、工业平板 ),完善系统安全性(设备身份认证、数据加密 )与开发工具链,为行业应用开发提供更成熟的框架(ArkUI 界面开发、原子化服务基础能力 )。
2023 年 OpenHarmony 4.0 深化 AI 与分布式技术融合,强化端侧智能(设备本地 AI 推理、低功耗算力调度 ),优化分布式软总线的跨平台兼容性,推动 "设备协同智能化"(如多终端 AI 任务分工、协同推理 )。
2024 年 OpenHarmony 5.1 聚焦 AI 与机器人技术优化,加强对机器人操作系统(ROS )的适配,完善运动控制、环境感知等机器人专属能力,同时拓展 AI 在 IoT 场景的落地(如智能识别、自主决策 ),深化行业场景渗透。
OpenHarmony 与 HarmonyOS 体系对比
对比项 OpenHarmony(开源鸿蒙) HarmonyOS(鸿蒙商业版) HarmonyOS NEXT(纯血鸿蒙)
性质 开源项目,由开放原子基金会主导生态共建 华为闭源商业系统,面向消费与商业市场 华为闭源商业系统,聚焦 "纯血鸿蒙" 架构
技术底座 微内核架构 + LiteOS/Linux 兼容(适配不同设备资源 ) 基于 OpenHarmony 开源基线 + AOSP(安卓兼容层 ) 基于 OpenHarmony 开源基线,剔除 AOSP,构建纯血微内核架构
应用生态 生态分散,依赖厂商 / 开发者定制: - 设备厂商需适配硬件、构建分发渠道; - 应用需基于 OpenHarmony 开源 API 开发,适配多终端场景。 兼容安卓应用(通过 AOSP 层 )+ 鸿蒙原生应用,依托华为终端生态(手机、平板等 ),实现 "一次开发、多端部署"。 仅支持 鸿蒙原生应用,强化系统纯净度与性能,聚焦高端旗舰设备的极致体验,推动生态向 "纯鸿蒙架构" 迁移。
典型设备 IoT 终端(智能传感器、低功耗设备 )、行业终端(工业平板、智能座舱 )、边缘设备(轻量级网关 )等。 华为手机、平板、智慧屏、智能穿戴等消费级终端,覆盖个人与家庭全场景。 未来华为旗舰手机、高端平板等核心终端,聚焦极致性能、纯血架构体验,引领操作系统技术标杆。
补充说明
  • OpenHarmony 作为开源项目,是鸿蒙生态 "技术普惠" 的基础:通过开放代码、工具链,降低行业准入门槛,推动 IoT 设备、行业终端的智能化升级;
  • HarmonyOS 商业版则聚焦 "用户体验与商业价值",依托华为终端生态,为消费者与企业客户提供深度整合的全场景服务;
  • HarmonyOS NEXT(纯血鸿蒙 )代表生态演进方向:剔除安卓代码依赖后,系统性能、安全性、协同效率将进一步突破,为高端设备与未来场景(如 AI 原生应用、元宇宙协同 )奠定技术底座。

3. OpenHarmony****开发环境

4. OpenHarmony****第一行代码

4.1 安装必要的开发软件

为开展 OpenHarmony(基于 Hi3861 等设备 )开发,需提前准备工具链,保障开发、调试、烧录全流程:

工具名称 作用
CH340 USB 驱动 实现 Windows 与 Hi3861 开发板的硬件连接,为串口通信、程序烧录提供基础
HiBurn.exe 海思芯片专用烧录软件,将编译后的程序(如 .bin 文件 )烧录到开发板
UartAssist.exe 串口调试工具,查看开发板运行日志、打印信息,辅助调试代码
VSCode SSH 远程链接 通过 SSH 远程连接开发环境(如 Linux 服务器 ),在 VSCode 中编写、编译代码

4.2 项目结构规范

基础路径与目标

项目需在 OpenHarmony 代码仓库的指定路径创建:

复制代码
/home/qf/Desktop/OpenHarmony/code-v3.0-LTS/OpenHarmony/applications/sample/wi-fi-iot/app  

在此路径下,按规则创建项目目录 (如 demo01_thread ),并遵循目录命名要求

目录命名规则
  • 禁止:数字开头、中文 / 特殊符号(如 123_demo测试_dir 不合法 )
  • 要求:英文小写字母开头 ,可包含字母、数字、下划线(如 demo01_thread 合规 )
  • 唯一性:app 文件夹内项目名称必须唯一,避免编译冲突
项目结构示例(以 demo01_thread 为例 )

app 目录下创建 demo01_thread 后,完整结构(核心文件说明 ):

cpp 复制代码
# 项目路径  
/home/qf/Desktop/OpenHarmony/code-v3.0-LTS/OpenHarmony/applications/sample/wi-fi-iot/app/  
└── BUILD.gn             # 在app目录下的,明确启动有哪些组件
|------demo01_thread/        # 项目目录(需符合命名规范)  
    ├── BUILD.gn         # 编译脚本:定义编译规则、依赖、输出产物  
    └── demo1.c          # 业务代码:编写功能逻辑(如线程创建、硬件控制 )  
关键文件作用
  • BUILD.gn :OpenHarmony 编译系统的配置文件,需声明:

    • 编译目标类型(如 static_library 静态库 )

    • 参与编译的源文件(如 demo1.c

    • 头文件路径、依赖库等信息

    • 示例(简化版 ):

      复制代码
      static_library("demo01_thread") {  # 库名称需与目录名一致  
          sources = [ "demo1.c" ]       # 指定参与编译的代码文件  
          include_dirs = [              # 头文件搜索路径  
              "//utils/native/lite/include",  
              "//kernel/liteos_m/kal/cmsis"  
          ]  
      }  
  • demo1.c:存放具体业务代码(如线程创建、硬件初始化逻辑 ),是功能实现的核心文件

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 以下是需要导入的鸿蒙相关的头文件
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "hi_timer.h"

/*
【第二步,完成线程所需的任务函数】
当前函数满足 osThreadFunc_t 
    typedef void (*osThreadFunc_t) (void *argument); 
    返回值类型为 void 类型,同时参数类型为 void * 类型。
*/
void thread_test(void *arg){
    int n = 10;
    while(n){
        /*
        osDelay OpenHarmony 提供的系统延时函数,单位是 10ms
        100 * 10ms ==> 1s
        */
        osDelay(100);

        /*
        osThreadId_t osThreadGetId();
            返回当前真正运行的线程 ID 数据
            osThreadId_t ==> void *
        */
       printf("Thread is : %p,n = %d\n",osThreadGetId(),n);
       n -= 1;
    }
}

/*
threadTestTask thread 测试任务
    当前函数要求无返回无参数,同时建议使用 static 修饰,有且只允许在当前
    文件中有效,可以调用。

【threadTestTask】 用于注册线程任务到 OpenHarmony OS 中。
 */
static void threadTestTask(void){
    /*
    【第一步,创建线程】
    */
    /*
    osThreadAttr_t OpenHarmony 提供的数据类型用于描述当前线程的相关属性
    重要内容
        1. 线程名称
        2. 线程占用栈区字节数
        3. 【线程优先级】
    【重点要求】  osThreadAttr_t 必须进行 memset 擦除
    */
    osThreadAttr_t thread_attr;
    memset(&thread_attr,0,sizeof(osThreadAttr_t));

    thread_attr.name = "thread_test";
    thread_attr.stack_size = 1024;
    thread_attr.priority = osPriorityNormal;

    /*
    系统编程中的对应线程创建函数
        pthread_create(pthread_t &tid, attr, function, fun_arg);
    */
    
    /*
    osThreadId_t 当前 OpenHarmony 提供的数据类型,用于描述当前线程 ID
    真实类型为 void * 类型。【去指针化操作】
        typedef void *osThreadId_t;
   
    osThreadId_t osThreadNew(osThreadFunc_t func, 
                void *argument, 
                const osThreadAttr_t *attr);
        【osThreadFunc_t func】 线程任务函数 OpenHarmony 提供的数据类型
            typedef void (*osThreadFunc_t) (void *argument); 
            根据原码分析,当前任务函数要求参数为 void * 返回值为 void 
        【void *argument】 用于提供函数参数给当前线程任务函数
        【const osThreadAttr_t *attr】 用于初始化当前线程属性的结构体
    */

    osThreadId_t thread_id = osThreadNew(thread_test,NULL,&thread_attr);
    if(NULL == thread_id){
        perror("[osThreadNew] create [thread_test] thread failed!\n");
        exit(1);
    }
}

/*
【第三步,注册线程任务】
注册当前线程任务。
利用 OpenHarmony 提供的有参数宏,对当前任务线程函数 static void threadTestTask(void) 
进行系统注册,OpenHarmony APP 启动会将当前自定义组件/线程任务加入到程序中。

#define APP_FEATURE_INIT(func) LAYER_INITCALL_DEF(func, app_feature, "app.feature")
*/
APP_FEATURE_INIT(threadTestTask);

项目组件 BUILD.gn 文件内容:(在app目录下的BUILD.gn

cpp 复制代码
import("//build/lite/config/component/lite_component.gni")
    lite_component("app") {
    features = [
        "demo01_thread",
    ]
}

5. 编译操作

5.1 利用HiBurn 软件烧录程序到Hi3861中

通过 hb 编译之后,对应的编译结果路径在 ~/Desktop/OpenHarmony/code - v3.0 -
LTS/OpenHarmony/out/hispark_pegasus/wifiiot_hispark_pegasus ,在 Windows 中,需
要利用远程共享文件夹 ( 知晓当前 Linux IP) 方式,找到对应编译结果文件。

当前路径仅供参考:

cpp 复制代码
\\192.168.25.129\qf\Desktop\OpenHarmony\code-v3.0-
LTS\OpenHarmony\out\hispark_pegasus\wifiiot_hispark_pegasus

选择编译生成的可执行文件:

烧录中:

打开串口调试助手:

https://github.com/0voice

相关推荐
_多拉不懂A梦1 小时前
FFmepg源码系列-avformat_open_input()
c++·ffmpeg·音视频
码达拉2 小时前
顺序表的总结及模拟实现
数据结构·c++
艾莉丝努力练剑2 小时前
深入详解C语言的循环结构:while循环、do-while循环、for循环,结合实例,讲透C语言的循环结构
c语言·开发语言·c++·学习
晨非辰3 小时前
#C语言——学习攻略:自定义类型路线--结构体--结构体类型,结构体变量的创建和初始化,结构体内存对齐,结构体传参,结构体实现位段
c语言·开发语言·经验分享·学习·其他·学习方法·visual studio
·白小白4 小时前
【数据结构】——栈(Stack)的原理与实现
c语言·开发语言·数据结构
KFCgrandpahhh5 小时前
从0开始跟小甲鱼C语言视频使用linux一步步学习C语言(持续更新)8.13
linux·c语言·学习
郝学胜-神的一滴6 小时前
C++中的`auto`与`std::any`:功能、区别与选择建议
开发语言·c++·程序人生·算法
Rain_is_bad7 小时前
初识c语言————排序方法
c语言·开发语言·数据结构
极客BIM工作室8 小时前
老生常谈智能指针:《More Effective C++》的条款28
开发语言·c++