介绍
调用启动功能模块宏 SYS_RUN 执行指定函数
定义
#define SYS_RUN(func) LAYER_INITCALL_DEF(func, run, "run")
头文件
\\utils\native\lite\include\ohos_init.h
说明
在 OpenHarmony 设备开发中,SYS_RUN() 是一个系统启动入口宏,主要用于指定程序的入口函数,确保该函数在系统初始化完成后自动执行。它是 OpenHarmony 轻量级/小型系统(如针对 Hi3861、Hi3516 等芯片的开发)中最常用的程序启动方式。
宏的作用与原理
OpenHarmony 系统启动时,会经历内核初始化、驱动加载等一系列流程。SYS_RUN() 的作用是:
将指定的函数注册到系统启动队列中,当系统完成所有初始化工作后,自动调用该函数,作为应用程序的入口点。
简单说,它相当于传统 C 语言中的 main() 函数,但适配了 OpenHarmony 的启动机制。
用法格式
#include "ohos_init.h" // 必须包含的头文件
// 定义入口函数(无参数,无返回值)
void MyEntryFunc(void) {
// 程序逻辑(如GPIO初始化、传感器控制等)
}
// 注册入口函数,系统启动后自动执行
SYS_RUN(MyEntryFunc);
典型应用场景
在 GPIO 控制、传感器交互等场景中,SYS_RUN() 用于启动整个应用程序,例如控制 LED 闪烁:
#include "ohos_init.h"
#include "gpio_if.h"
#include "wifiiot_gpio.h"
#include "unistd.h"
// LED闪烁逻辑
void BlinkLed(void) {
// 1. 配置GPIO9为通用GPIO功能
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_IO_FUNC_GPIO_9_GPIO);
// 2. 设置为输出模式
GpioSetDir(WIFI_IOT_GPIO_IDX_9, WIFI_IOT_GPIO_DIR_OUT);
// 3. 循环控制LED闪烁
while (1) {
GpioSetOutputVal(WIFI_IOT_GPIO_IDX_9, 1); // 亮
usleep(500000); // 延时0.5秒
GpioSetOutputVal(WIFI_IOT_GPIO_IDX_9, 0); // 灭
usleep(500000);
}
}
// 注册入口函数,系统启动后自动运行BlinkLed
SYS_RUN(BlinkLed);
注意事项
- 头文件依赖:必须包含
<ohos_init.h>,否则宏定义无法识别。 - 函数要求:被
SYS_RUN()注册的函数必须是无参数、无返回值的void (*)(void)类型函数。 - 执行时机:函数会在系统所有初始化(如驱动、任务调度)完成后执行,确保硬件资源已就绪。
- 多个入口函数:若注册多个函数(如
SYS_RUN(Func1); SYS_RUN(Func2);),系统会按注册顺序依次执行。 - 与其他启动宏的区别:
OpenHarmony 还提供APP_FEATURE_INIT()等启动宏,功能类似,但SYS_RUN()是最通用的入口方式,适用于大部分应用场景。
SYS_RUN() 简化了 OpenHarmony 设备开发的启动流程,开发者无需关心系统底层初始化细节,只需通过它注册入口函数,即可实现程序的自动运行,是连接应用逻辑与系统启动的核心纽带。