Hi3861 OpenHarmony 芯片概述、代码实现和烧录过程
本文介绍了基于OpenHarmony 3.0操作系统在Hi3861芯片上的开发流程。OpenHarmony是一款面向全场景的开源分布式操作系统,适用于智能家居、工业物联网等场景。开发环境基于Ubuntu 22.04,使用交叉编译工具生成可执行文件。文章重点讲解了OpenHarmony的多线程编程模式,详细说明了线程创建、属性设置和任务函数实现方法,并提供了示例代码。同时介绍了BUILD.gn文件的
1. 学习要求
硬件学前班
- GPIO 输入输出,高低电平
- 系统编程多线程控制,锁机制
- 单总线数据传感器,设备控制。
- 联网操作 + MQTT + 云平台初步使用
代码量特别大!!!操作规范比较多,相较于之前的 C 语言开发操作难度较高。
2. Hi3861 芯片概述
官方海思提供的手册内容

3. OpenHarmony 概述
OpenHarmony 是由开放原子开源基金会(OpenAtom Foundation)孵化及运营的一款面向全场 景的开源分布式操作系统。以下为你从其诞生背景、特点、应用场景、技术架构 主要用于智能家居,工业物联网,穿戴系统使用,是一个【完整的实时操作系统】。可以提供系统 支持,并且兼容多平台硬件。
4. 开发环境概述
基于 Ubuntu 22.04 搭建的 OpenHarmony 3.0 开发环境,利用 Ubuntu 环境进行程序编程,通 过【交叉编译工具】将程序编译为 hi3861 支持的可执行系统文件,烧录到开发版中,进行后续的 程序开发。

代码根据开发要求,对应的路径为
~/Desktop/OpenHarmony/code-v3.0-LTS/OpenHarmony/applications/sample/wifi
iot/app
![]()
5. OpenHarmony 第一行代码
5.1 代码实现
OpenHarmony 代码都是给予【多线程模式实现】,完成的每一个模块都是一个【线程模块】

【程序模块】
/*
C 语言标准库三剑客
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
以下是需要导入的 OpenHarmony 相关头文件
ohos_init.h OpenHarmony OS 系统初始化相关头文件
cmsis_os2.h 实时操作系统头文件
hi_timer.h 海思提供的 timer 定时器头文件
*/
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "hi_timer.h"
/*
【第三步】
在 OHOS 每一个组件都是一个线程模块,需要提供对应的线程任务代码
线程任务代码要求
1. 返回值为 void
2. 参数为 void *
*/
/**
* @brief 测试使用 Hello 线程任务函数
*
* @param arg 用户提供的 void * 参数。
*/
void hello_thread(void * arg);
/*
【第一步】
注册组件函数,
函数要求 static 修饰,同时返回值和参数都是 void
函数名称根据当前模块名称决定。
*/
static void helloTask(void)
{
/*
osThreadId_t osThreadNew (osThreadFunc_t func,
void *argument,
const osThreadAttr_t *attr);
osThreadId_t OHOS 中对应线程号类型。 真实类型是 void *。
details Thread ID identifies the thread.
typedef void *osThreadId_t;
osThreadFunc_t 函数指针变量名,要求提供的函数必须是返回值 为 void
参数为 void * 类型。
typedef void (*osThreadFunc_t) (void *argument);
void *argument 当前线程任务函数所需参数
const osThreadAttr_t *attr OHOS 提供的线程属性结构体类型。
其中【重点】内容
1. 线程名称
2. 线程占用的【stack】 栈区内存大小
3. 线程优先级
当前程序创建线程任务,需要提供
1. 线程目标任务函数
2. 线程任务函数所需参数
3. 线程任务相关属性结构体
返回结果是当前 osThreadId_t,对应线程【地址】
*/
/*
【第五步】
创建线程
*/
// 5.1 创建 osThreadAttr_t 线程属性结构体变量
BUILD.gn 文件内容
【注意】BUILD.gn 文件名称必须按照规范,不得拼写错误,不得小写
当前组件 demo01_hello 中的 BUILD.gn 文件内容
osThreadAttr_t thread_attr;
memset(&thread_attr, 0, sizeof(osThreadAttr_t));
thread_attr.name = "hello_DD"; // 线程名称
thread_attr.attr_bits = 1024; // 当前线程占用的栈区大小,1024 ==> 1KB
thread_attr.priority = osPriorityNormal; // 默认优先级
// 5.2 利用 osThreadNew 创建线程,线程完毕,立即执行。
osThreadId_t thread_id = osThreadNew(hello_thread,
HI_NULL, // HI_NULL <==> NULL 海思公司自行定义的
NULL 类型。
&thread_attr);
if (HI_NULL == thread_id)
{
perror("[osThreadNew] create thread [hello_thread] failed!");
exit(EXIT_FAILURE);
}
}
/*
【第二步】
对当前组件进行注册,利用 OHOS 提供的有参数宏进行注册操作
APP_FEATURE_INIT 是 OHOS 提供的用于注册组件的有参数宏,要求提供的
函数返回值必须是 void 类型,参数也是 void 类型。利用函数指针
对当前组件功能进行注册操作。
*/
APP_FEATURE_INIT(helloTask);
/*
【第四步】
线程任务函数实现
*/
void hello_thread(void * arg)
{
while (1)
{
printf("Hello OHOS Thread\n");
/*
osStatus_t osDelay (uint32_t ticks);
ticks 嘀嗒,当前系统执行一次任务的时间。
Hi3861 基于 OHOS tick 时间为 【10 ms】,可以认为当前开发板一秒钟执行 100 次任
务。
100 ticks == 100 * 10ms == 1 s
*/
osDelay(100);
}
}
BUILD.gn 文件内容
- 【注意】BUILD.gn 文件名称必须按照规范,不得拼写错误,不得小写
当前组件 demo01_hello 中的 BUILD.gn 文件内容
static_library("demo01_hello") {
sources = [
"demo_hello.c"
]
include_dirs = [
"//utils/native/lite/include",
"//kernel/liteos_m/kal/cmsis"
]
}

APP 目录下的 BUILD.gn 文件内容
import("//build/lite/config/component/lite_component.gni")
lite_component("app") {
features = [
"demo01_hello",
]
}

5.2 编译烧录过程
安装 CH340 驱动。

编译程序
- 切换路径到 OpenHarmony 原码根目录下
qf@qf:~/Desktop/OpenHarmony/code-v3.0-LTS/OpenHarmony
- 使用编译命令 hb build 对项目进行编译操作

使用 HiBurn 烧录程序
端口确定

需要烧录到开发版中的程序在 Linux 虚拟机中,利用共享文件夹通过 IP 地址找到对应文件,文件 路径如下, 需要根据自行的 IP 地址进行修改,目标文件为
Hi3861_wifiiot_app_allinone.bin
\\192.168.25.129\qf\Desktop\OpenHarmony\code-v3.0
LTS\OpenHarmony\out\hispark_pegasus\wifiiot_hispark_pegasus

进行烧录操作

Connect 之后,开发板按下 RESET 键,进入烧录过程

烧录完成

HiBurn 断开连接,XCOM 连接当前开发板,打开串口,开发板按键 RESET ,启动程序运行

更多推荐


所有评论(0)