最简APP示例*
提示
- SDK 路径: http://gitlab.nationalchip.com/nationalchip/voice-wifi-solution/ovp_aiot
- App 路径: SDK 路径下 app/hello_world/
- 适用芯片 8005/8006
1. 概述*
最简 OVP App 示例,演示了 OVP 应用框架的最小实现。每收到一次麦克风数据事件,打印一条 "hello world!" 日志。
2. 功能特性*
- 展示 OVP_APP 框架的标准回调(
app_init、app_event_response、app_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. 注意事项*
- OVP_APP 结构体是必须的:每个 App 必须定义
OVP_APP结构体并调用OVP_REGISTER_APP()宏注册,否则框架无法找到该 App - 回调函数签名固定:回调的函数签名必须与
ovp_app.h中定义的一致,即使不使用的回调也要提供空实现 - 事件驱动模型:App 的主要逻辑应该放在
app_event_response()中,而非app_task_loop()中轮询 - 日志 TAG:
LOG_TAG宏定义了日志前缀,建议使用[APP_XXX]格式便于区分不同 App - 休眠/唤醒未实现:当前 SDK 不支持休眠功能,
app_suspend()和app_resume()保持空实现即可