一、openvela 开发框架初探

1.1 openvela 的底层基础与架构

openvela 基于开源操作系统 NuttX 构建,为开发者提供了丰富的系统级服务。其整体开发框架主要由两部分构成:

  • 系统应用:内部开发的应用程序,通常存放在apps/等文件夹中
  • 第三方系统库:经适配的外部库,存放于external/等文件夹中

1.2 典型目录结构解析

openvela 的功能模块目录结构遵循清晰的层级设计:

└── vela 
├── apps 
│ └── examples 
│ ├── hello_main_1 
│ └── hello_main_2 
└── external 
├── libs_1 
└── libs_2 

二、手把手教你添加 Hello World 示例

2.1 搭建基础目录框架

Hello World 示例需创建的核心文件包括:

  • hello_main.c:应用程序主逻辑文件
  • Kconfig:条件编译配置文件
  • CMakeLists.txt:CMake 构建配置
  • Make.defs:编译目录指示文件
  • Makefile:编译规则与标志定义
apps 
└── examples 
└── hello_main 
├── hello_main.c 
├── CMakeLists.txt 
├── Kconfig 
├── Make.defs 
└── Makefile 

最后完整的项目目录应如图所示:

在这里插入图片描述

2.2 核心文件编写指南

2.2.1 主程序文件(hello_main.c

#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("Hello, World!!\n");
    return 0;
}

2.2.2 配置文件详解

  • Kconfig:定义编译选项
config EXAMPLES_HELLO
        tristate "\"Hello, World!\" example"
        default n
        ---help---
                Enable the \"Hello, World!\" example

if EXAMPLES_HELLO
// 下面 <default "hello"> 中的 hello 需要运行的指令
config EXAMPLES_HELLO_PROGNAME
        string "Program name"
        default "hello"
        ---help---
                This is the name of the program that will be used when the NSH ELF
                program is installed.

config EXAMPLES_HELLO_PRIORITY
        int "Hello task priority"
        default 100

config EXAMPLES_HELLO_STACKSIZE
        int "Hello stack size"
        default DEFAULT_TASK_STACKSIZE
        
endif
  • CMakeLists.txt:构建配置
# .config 中的所有配置已加载到 CMake 环境,因此可以直接使用变量  

# Enable Config, 代替原Make.defs configured_apps的配置
if(CONFIG_EXAMPLES_HELLO) # 如果defconfig使能了该feature则加入编译
  # call 添加应用module `nuttx_add_application` 将hello添加为一个builtin app.
  nuttx_add_application(
    NAME                                #参数标志:application唯一名称
    ${CONFIG_EXAMPLES_HELLO_PROGNAME}   #参数值:  取hello Kconfig中的设置值为hello应用名称
    SRCS                                #参数标志:源文件
    hello_main.c                        #参数值:  传入应用的源文件,可以多个,main必须为第一个 
    STACKSIZE                           #参数标志:栈大小
    ${CONFIG_EXAMPLES_HELLO_STACKSIZE}  #参数值:  取Kconfig中的设置值,不传则为CONFIG_DEFAULT_TASK_STACKSIZE
    PRIORITY                            #参数标志:任务优先级
    ${CONFIG_EXAMPLES_HELLO_PRIORITY})  #参数值:  取Kconfig中的设置值,不传则为SCHED_PRIORITY_DEFAULT
endif()
  • Makefile:编译规则
include $(APPDIR)/Make.defs

# 定义程序名称,可以从 Kconfig 值中获取,也可以直接定义  
PROGNAME = $(CONFIG_EXAMPLES_HELLO_PROGNAME)
# 或者 PROGNAME = hello

# 定义应用程序的优先级  
PRIORITY = $(CONFIG_EXAMPLES_HELLO_PRIORITY)
# 或者 PRIORITY = 100   (大小根据需要指定)

# 定义应用程序的栈大小  
STACKSIZE = $(CONFIG_EXAMPLES_HELLO_STACKSIZE)
# 或者 STACKSIZE = 4096 (大小根据需要指定) 

# 模块设置  
MODULE = $(CONFIG_EXAMPLES_HELLO)

# 定义 main 函数所在的源文件 
MAINSRC = hello_main.c

# 如果引用了需要的头文件,可在此添加头文件路径,例如:  
CFLAGS += ${INCDIR_PREFIX}$(APPDIR)/external/libs/include
# 等价于 CFLAGS += -I$(APPDIR)/external/libs/include

# 如果是 C++ 项目,对应头文件的配置可添加到 CXXFLAGS 中 
# CXXFLAGS // c++ 相应的头文件
        
# 如果添加内部开发的相应的源文件,需在这里添加相应的文件,如:
# 其中路径的开始为当前路径,即当前 Makefile 所在的路径。
# CSRCS += device_example.c

# 如果有 C++ 源文件,按需添加:  
# CXXSRCS += hello_main.cxx   // c++ 相应的源文件

# 包含 openvela 的应用配置  
include $(APPDIR)/Application.mk
  • Make.defs:路径配置
ifneq ($(CONFIG_EXAMPLES_HELLO),)
CONFIGURED_APPS += $(APPDIR)/examples/hello_main
endif

三、验证测试流程

新添加的应用需要通过清理并重新编译后才能生效。验证测试的步骤如下:

3.1 清理与编译

# 清理工程
./build.sh vendor/openvela/boards/vela/configs/goldfish-armeabi-v7a-ap distclean -j8
# 配置Menuconfig并启用hello应用
./build.sh vendor/openvela/boards/vela/configs/goldfish-armeabi-v7a-ap menuconfig -j8

在这里插入图片描述

# 编译
./build.sh vendor/openvela/boards/vela/configs/goldfish-armeabi-v7a-ap -j8

在这里插入图片描述

3.2 运行与测试

# 启动模拟器
./emulator.sh vela

运行后,在串口中输入程序名称(Program name),程序名称已在文件 Kconfig 中定义。
即在串口中输入程序名称(默认 “hello”)即可运行,将输出 “Hello, World!!”

在这里插入图片描述

四、实现应用自启动

4.1 必要配置项

返回根目录,对 Makefile 文件添加以下配置:
在这里插入图片描述

CONFIG_FS_ROMFS=y
CONFIG_NSH_ROMFSETC=y
CONFIG_NSH_ROMFSMOUNTPT="/etc"
CONFIG_NSH_SYSINITSCRIPT="init.d/rc.sysinit"
CONFIG_NSH_INITSCRIPT="init.d/rcS"

4.2.1 脚本存放位置

  • 系统初始化脚本:vendor/openvela/boards/vela/src/etc/init.d/rc.sysinit
  • 用户脚本:vendor/openvela/boards/vela/src/etc/init.d/rc

4.2.2 自启动配置示例

在这里插入图片描述

在 rcS 文件中添加:

# 前台运行hello
hello

# 或后台运行
hello &

在这里插入图片描述

五、总结与拓展

通过本文的步骤,我们成功在 openvela 中添加了一个 Hello World 应用,并学习了:

  • openvela 的目录结构与开发规范
  • 应用程序的完整配置文件编写
  • 编译、测试与自启动的实现方法

后续可以尝试添加更复杂的功能模块,或引入第三方库进行扩展开发。

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐