跳转至

最简APP示例*

提示

1. 概述*

最简 OVP App 示例,演示了 OVP 应用框架的最小实现。每收到一次麦克风数据事件,打印一条 "hello world!" 日志。

2. 功能特性*

  • 展示 OVP_APP 框架的标准回调(app_initapp_event_responseapp_task_loop
  • 响应 Audio-in 录音完成事件(EVENT_AUDIO_IN_RECORD_DONE)并输出日志
  • 作为新 App 开发的参考起点

3. 目录结构*

app/hello_world/
├── app.c               # 主程序
├── app.mk               # 编译配置
├── app.name             # Kconfig 选项
└── Kconfig              # 子配置(空)
文件 作用
app.c 定义 OVP_APP 结构体,实现标准回调,调用 OVP_REGISTER_APP() 注册
app.mk 编译 app.c,由 CONFIG_APP_HELLO_WORLD 控制
app.name 定义 CONFIG_APP_HELLO_WORLD 选项,在 menuconfig 中显示 "Hello World"
Kconfig 空框架,该 App 无额外配置项

4. 配置说明*

该 App 无额外的 Kconfig 子配置和宏定义。只需在 menuconfig 中选择 "Hello World" 即可。

修改日志级别可调整 app.c 中的 LOG_LVL 宏:

#define LOG_LVL 3   // 0: 无日志, 1: ERROR, 2: WARN, 3: INFO, 4: DEBUG

5. 工作原理*

5.1 初始化流程*

app_init() 中仅打印一条日志,无其他初始化操作。

5.2 事件处理*

app_event_response() 是事件驱动的入口。该 App 仅响应 Audio-in 录音完成事件:

事件 触发时机 处理逻辑
EVENT_AUDIO_IN_RECORD_DONE Audio-in 录音完成(默认配置约 40ms) 打印 "hello world!"

事件触发时间由每个 context 中的 PCM 帧长决定,默认配置下约 40ms 触发一次。

5.3 主循环*

app_task_loop() 为空实现,该 App 不需要在主循环中执行任务。

6. 使用方法*

6.1 编译*

# 使用 hello_world 的配置
cp configs/example/app/8006_hello_world_app.config .config
make defconfig
make clean; make

或通过 menuconfig 手动选择:

make menuconfig
# OVP Application Settings → Applications Selection → Hello World

6.2 烧录运行*

cd tools/bootx/
./flash_nor.sh 0 -r 1000000

7. 预期输出*

串口(921600 波特率)输出如下日志:

[APP_HELLO_WORLD] hello world!
[APP_HELLO_WORLD] hello world!
...

默认配置下每秒约输出 25 条。

8. 注意事项*

  1. OVP_APP 结构体是必须的:每个 App 必须定义 OVP_APP 结构体并调用 OVP_REGISTER_APP() 宏注册,否则框架无法找到该 App
  2. 回调函数签名固定:回调的函数签名必须与 ovp_app.h 中定义的一致,即使不使用的回调也要提供空实现
  3. 事件驱动模型:App 的主要逻辑应该放在 app_event_response() 中,而非 app_task_loop() 中轮询
  4. 日志 TAGLOG_TAG 宏定义了日志前缀,建议使用 [APP_XXX] 格式便于区分不同 App
  5. 休眠/唤醒未实现:当前 SDK 不支持休眠功能,app_suspend()app_resume() 保持空实现即可