介绍
在开源鸿蒙(OpenHarmony)Hi3861开发板上添加新功能(如驱动、应用程序、自定义模块等),需要遵循其源码目录结构和构建规则。以下是具体的添加位置、步骤和示例,帮助你快速上手:
功能类型与添加位置
Hi3861属于OpenHarmony轻量系统(LiteOS-M内核),源码目录结构清晰,不同类型的功能需放在对应目录下:
| 功能类型 | 建议添加目录 | 说明 |
|---|---|---|
| 应用程序 | applications/sample/wifi-iot/app |
如LED控制、传感器采集、UART通信等上层应用(基于系统API开发)。 |
| 自定义驱动 | drivers/peripheral/[新驱动目录] |
如新增温湿度传感器(DHT11)、OLED屏等硬件驱动(需对接GPIO/I2C等外设)。 |
| 系统组件/库 | utils/native/lite/[自定义库目录] |
如通用算法库、日志工具等可复用的组件(供多个应用/驱动调用)。 |
| 内核定制 | kernel/liteos_m/ |
如修改任务调度、添加系统调用(需熟悉LiteOS-M内核,谨慎修改)。 |
添加应用程序
以LED控制为例
1. 目录位置:applications/sample/wifi-iot/app
该目录用于存放Hi3861的上层应用程序,每个子目录对应一个独立功能模块。例如:
- 已有
led_example(LED示例)、button_example(按键示例)等,可参考其结构添加新功能。
2. 添加步骤:
(1)创建功能目录
在applications/sample/wifi-iot/app下新建目录(如my_led_app),用于存放代码和构建配置:
mkdir -p applications/sample/wifi-iot/app/my_led_app
(2)编写功能代码
在my_led_app目录下创建源码文件(如my_led.c),实现LED闪烁功能:
#include <stdio.h>
#include "ohos_init.h"
#include "wifiiot_gpio.h"
#include "wifiiot_gpio_ex.h"
#include "wifiiot_pwm.h"
#include "wifiiot_timer.h"
// LED初始化(Hi3861的LED接在GPIO9)
static void LedInit(void) {
GpioInit();
IoSetFunc(WIFI_IOT_GPIO_9, WIFI_IOT_GPIO_FUNC_GPIO_9_GPIO); // 配置GPIO9为GPIO功能
GpioSetDir(WIFI_IOT_GPIO_9, WIFI_IOT_GPIO_DIR_OUT); // 设置为输出
}
// LED闪烁任务
static void LedTask(void) {
LedInit();
while (1) {
GpioSetOutputVal(WIFI_IOT_GPIO_9, 1); // 点亮LED
usleep(500000); // 延时500ms
GpioSetOutputVal(WIFI_IOT_GPIO_9, 0); // 熄灭LED
usleep(500000);
}
}
// 注册任务到系统初始化流程
APP_FEATURE_INIT(LedTask);
(3)编写BUILD.gn配置文件
在my_led_app目录下创建BUILD.gn,定义构建规则(告诉系统如何编译该模块):
# 引入OpenHarmony轻量系统的组件模板
import("//build/lite/config/component/lite_component.gni")
# 定义可执行程序目标(目标名为my_led_app)
executable("my_led_app") {
# 源码文件(当前目录下的my_led.c)
sources = [ "my_led.c" ]
# 依赖的系统模块(GPIO驱动、初始化框架等)
deps = [
"//base/iot_hardware/peripheral:peripheral_api", # 外设API(含GPIO)
"//utils/native/lite:utils", # 基础工具库
]
# 编译选项(可选,如开启调试)
cflags = [ "-Wall", "-O0" ] # -O0关闭优化,便于调试
}
# 将目标添加到系统组件,使其被打包进固件
lite_component("my_led_component") {
features = [ ":my_led_app" ] # 关联上面定义的可执行程序
}
(4)修改上层组件配置,引入新功能
为了让新功能被系统识别并编译,需要在上级目录的BUILD.gn 中添加组件依赖:
打开applications/sample/wifi-iot/app/BUILD.gn,在features中添加新组件:
import("//build/lite/config/component/lite_component.gni")
lite_component("app") {
features = [
"led_example:led_example", # 已有示例(保留)
"my_led_app:my_led_component" # 添加新组件
]
}