介绍
指定系统启动后自动执行的函数
定义
#define APP_FEATURE_INIT(func) LAYER_INITCALL_DEF(func, app_feature, "app.feature")
头文件
\\utils\native\lite\include\ohos_init.h
说明
在 OpenHarmony 设备开发中,APP_FEATURE_INIT() 是另一种应用功能初始化宏,与 SYS_RUN() 类似,用于指定系统启动后自动执行的函数,但它更侧重于功能模块的初始化,通常用于注册或启动特定的应用功能组件。
宏的作用与定位
APP_FEATURE_INIT() 的核心作用是:将指定函数注册为“应用功能初始化函数”,在系统启动流程的应用层初始化阶段自动执行。
它与 SYS_RUN() 的区别在于:
SYS_RUN()更偏向于“主程序入口”,适合作为整个应用的启动点;APP_FEATURE_INIT()更偏向于“功能模块初始化”,适合注册独立的功能组件(如传感器模块、通信模块等),多个功能模块可分别通过该宏注册,实现模块化管理。
用法格式
#include "ohos_init.h" // 必须包含的头文件
// 定义功能初始化函数(无参数,无返回值)
void SensorModuleInit(void) {
// 传感器模块初始化逻辑(如GPIO配置、设备初始化等)
}
// 注册功能初始化函数,系统启动时自动执行
APP_FEATURE_INIT(SensorModuleInit);
典型应用场景
APP_FEATURE_INIT() 常用于多模块协同的应用中,每个模块通过该宏独立初始化,例如:
1. 多模块初始化(传感器+GPIO控制)
#include "ohos_init.h"
#include "gpio_if.h"
#include "wifiiot_gpio.h"
// 模块1:LED初始化
void LedModuleInit(void) {
// 配置GPIO9为输出模式(LED控制)
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_IO_FUNC_GPIO_9_GPIO);
GpioSetDir(WIFI_IOT_GPIO_IDX_9, WIFI_IOT_GPIO_DIR_OUT);
printf("LED模块初始化完成\n");
}
// 模块2:按键检测初始化
void KeyModuleInit(void) {
// 配置GPIO5为输入模式(按键检测)
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_5, WIFI_IOT_IO_FUNC_GPIO_5_GPIO);
GpioSetDir(WIFI_IOT_GPIO_IDX_5, WIFI_IOT_GPIO_DIR_IN);
printf("按键模块初始化完成\n");
}
// 分别注册两个模块的初始化函数
APP_FEATURE_INIT(LedModuleInit); // 先执行LED模块初始化
APP_FEATURE_INIT(KeyModuleInit); // 再执行按键模块初始化
2. 与 SYS_RUN() 配合使用
在复杂应用中,通常用 APP_FEATURE_INIT() 初始化各模块,用 SYS_RUN() 启动主逻辑:
// 模块初始化(硬件准备)
APP_FEATURE_INIT(LedModuleInit);
APP_FEATURE_INIT(KeyModuleInit);
// 主程序逻辑(业务处理)
void MainLogic(void) {
printf("开始执行主逻辑...\n");
// 循环检测按键并控制LED
while (1) {
// 业务代码...
}
}
SYS_RUN(MainLogic); // 启动主逻辑
执行顺序与注意事项
- 执行时机:
APP_FEATURE_INIT()注册的函数在系统启动流程中,早于SYS_RUN()函数执行,确保功能模块先初始化,主逻辑后运行。 - 多个函数的顺序:若注册多个
APP_FEATURE_INIT()函数,系统会按代码中注册的先后顺序依次执行。 - 函数要求:与
SYS_RUN()相同,被注册的函数必须是void (*)(void)类型(无参数、无返回值)。 - 适用场景:适合模块化程度高的应用,每个功能模块通过独立的初始化函数完成准备工作,降低代码耦合度。