OpenHarmony API-SYS_RUN()调用启动功能

介绍

调用启动功能模块宏 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);

注意事项

  1. 头文件依赖:必须包含 <ohos_init.h>,否则宏定义无法识别。
  2. 函数要求:被 SYS_RUN() 注册的函数必须是无参数、无返回值的 void (*)(void) 类型函数。
  3. 执行时机:函数会在系统所有初始化(如驱动、任务调度)完成后执行,确保硬件资源已就绪。
  4. 多个入口函数:若注册多个函数(如 SYS_RUN(Func1); SYS_RUN(Func2);),系统会按注册顺序依次执行。
  5. 与其他启动宏的区别:
    OpenHarmony 还提供 APP_FEATURE_INIT() 等启动宏,功能类似,但 SYS_RUN() 是最通用的入口方式,适用于大部分应用场景。

SYS_RUN() 简化了 OpenHarmony 设备开发的启动流程,开发者无需关心系统底层初始化细节,只需通过它注册入口函数,即可实现程序的自动运行,是连接应用逻辑与系统启动的核心纽带。


原文出处:/show_1GW1wJTxxksE.html