1. 课程导学与环境搭建:鸿蒙南向开发全景

大家好,我是你们这门课的老朋友。做嵌入式这行快十五年了,从早期的单片机裸机开发,到后来跑 RTOS,再到这几年深度参与鸿蒙南向适配,踩过的坑确实不少。今天咱们开篇第一讲,先把整个鸿蒙南向开发的版图理清楚,再把吃饭的家伙——开发环境搭好。

说白了,鸿蒙南向开发就是让芯片和板子“开口说话”。你写的驱动代码,要能控制 GPIO 口高低电平,要能让 I2C 总线上的传感器把数据吐出来,还要保证整个系统在资源受限的 MCU 上跑得稳。这活儿看着琐碎,但它是整个物联网设备的根基。

核心认知: 鸿蒙南向 ≠ 单纯写驱动。它是从芯片寄存器配置 → LiteOS-M 内核调度 → 硬件抽象层(HAL)封装 → 系统服务注册的完整链路。你写的每一行代码,最终都要经过这四层才能让应用层调起来。

1.1 鸿蒙南向开发全景图

先看一张整体架构图,我习惯把鸿蒙南向系统分成四层。你想想看,一个智能灯控设备从你按下手机 App 到 LED 灯亮起,数据是怎么流的?

鸿蒙南向系统四层架构(数据流视角) 应用层(App / 小程序 / JS API) 系统服务层(HDF / 驱动框架 / 权限管理) 内核层(LiteOS-M / 任务调度 / 内存管理 / 中断) 硬件层(SoC / 外设寄存器 / 总线协议) 💡 你的驱动代码主要工作在第2层和第3层:向上对接HDF框架,向下操作硬件寄存器。

这张图我建议你存下来。每次写驱动遇到问题时,就想想数据现在卡在哪一层。我在项目里见过太多人,应用层调接口没反应,就一头扎进寄存器里翻,结果发现是 HDF 服务没注册——这就是对层次不熟。

1.2 LiteOS-M 内核特性速览

LiteOS-M 是鸿蒙针对 MCU 类设备(内存通常 256KB 以下)设计的轻量内核。它跟 Linux 那种“大而全”的思路完全不同。我刚开始接触时也觉得别扭,但用顺手了会发现——它真的很适合物联网场景。

特性 LiteOS-M FreeRTOS RT-Thread Nano
最小 RAM 需求 ~4KB ~6KB ~3KB
任务调度 抢占式 + 时间片轮转 抢占式 抢占式 + 时间片
IPC 机制 队列、信号量、互斥锁、事件 队列、信号量、互斥锁 邮箱、信号量、互斥锁
动态内存管理 最佳适配 + 伙伴算法 简单堆分配 固定大小内存池
中断延迟 < 1μs (典型值) < 2μs < 1.5μs
我的经验: LiteOS-M 的事件机制(Event)在驱动开发中特别好用。比如你要等 GPIO 中断 + 定时器超时两个条件,用事件可以一次等两个标志位,比信号量灵活得多。我在做智能门锁项目时,就用事件机制把按键消抖和超时重试的逻辑写得很干净。

1.3 开发板选型:Hi3861 vs Hi3516

很多初学者会纠结选哪块板子。我的建议很直接:

  • Hi3861 —— 如果你主要做 传感器采集、智能家居终端、低功耗设备。它基于 RISC-V 架构,主频 160MHz,自带 WiFi,适合做物联网节点。
  • Hi3516 —— 如果你要做 摄像头、音视频处理、带屏幕的交互设备。它是 ARM Cortex-A7,主频 900MHz,带 ISP 和硬件编解码,适合做边缘计算网关。

我个人习惯是:课程前期用 Hi3861 打基础,因为它的外设(GPIO、I2C、SPI、UART)更典型,寄存器操作也更直观。等大家把驱动框架跑熟了,再切到 Hi3516 上做复杂场景。

注意: Hi3861 的 Flash 只有 2MB,RAM 352KB。编译时别开太多调试选项,否则链接会报“空间不足”。我曾经有一次开了全量日志,编译出来固件 1.8MB,差点塞不下。

1.4 OpenHarmony 源码获取

源码获取现在比以前方便多了。我最早做适配时还得从 gitee 上一个个 repo 去拉,现在官方提供了 repo 工具一键同步。

# 1. 安装 repo 工具(Ubuntu 环境)
curl -s https://gitee.com/oschina/repo/raw/fork_flow/repo-py3/repo \
  > /usr/local/bin/repo
chmod a+x /usr/local/bin/repo

# 2. 创建工作目录
mkdir -p ~/openharmony && cd ~/openharmony

# 3. 初始化仓库(以 3.2 Release 为例)
repo init -u https://gitee.com/openharmony/manifest.git \
  -b OpenHarmony-3.2-Release --no-repo-verify

# 4. 同步源码(这一步比较久,建议挂代理或夜间跑)
repo sync -c -j4
避坑指南: 我曾经在 Windows 上用 WSL 拉源码,结果因为文件路径大小写问题,编译时一堆头文件找不到。后来我老老实实装了双系统——Ubuntu 22.04 做编译,Windows 做文档和串口调试。这个组合目前最稳。

1.5 编译环境搭建(Ubuntu + Windows 双系统)

环境搭建我分成三步走,每一步都有坑,我帮你提前踩平。

Step 1:Ubuntu 基础环境

# 安装必要工具链
sudo apt update
sudo apt install -y python3 python3-pip python3-setuptools \
  gcc-arm-none-eabi binutils-arm-none-eabi \
  git curl wget vim make cmake ninja-build

# 安装 hb 编译工具(鸿蒙专属)
pip3 install --user ohos-build

# 验证安装
hb --version   # 正常应显示 0.4.6 或更高

Step 2:Windows 端工具

  • 串口工具: MobaXterm(推荐)或 Putty。波特率通常 115200,数据位 8,停止位 1,无校验。
  • 烧录工具: HiBurn(海思官方)或 DevEco Device Tool(华为官方 IDE 插件)。
  • 代码阅读: VS Code + Remote-SSH 插件,直接连到 Ubuntu 虚拟机看代码。

Step 3:首次编译验证

# 进入源码根目录
cd ~/openharmony

# 设置编译目标(以 Hi3861 为例)
hb set -p hi3861v100_liteos_m

# 开始编译
hb build -f

# 编译成功后,固件在:
# out/hi3861v100_liteos_m/wifiiot_hispark_pegasus/
# 你会看到 Hi3861_wifiiot_app_allinone.bin
第一次编译大概需要 15-30 分钟。 如果报错,90% 是 Python 包版本冲突。我建议用 Python 3.9 或 3.10,别用 3.11+,有些依赖还没适配。

1.6 本章小结:你该带走什么?

这一章内容不少,但核心就三件事:

  1. 理解四层架构——以后写驱动时,时刻问自己“我现在在操作哪一层?”
  2. 选对板子——Hi3861 练手,Hi3516 进阶,别一上来就啃硬骨头。
  3. 搭好环境——Ubuntu 编译 + Windows 调试,这是目前最舒服的组合。