openvela之Hello World应用开发全指南
·
一、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 的目录结构与开发规范
- 应用程序的完整配置文件编写
- 编译、测试与自启动的实现方法
后续可以尝试添加更复杂的功能模块,或引入第三方库进行扩展开发。
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐

所有评论(0)