03 低功耗应用
本章节介绍 GK7206 的低功耗(Power Management,PM)应用示例 —— sample_pm。该应用演示了芯片的电源管理功能,包括进入低功耗模式、唤醒流程以及相关的寄存器配置。
应用源码位于 SDK 目录 sample/pm/,是一个演示低功耗特性的参考示例。
1 应用概述
1.1 功能特性
- 低功耗模式演示:演示芯片进入和退出低功耗模式的完整流程
- 循环测试:支持指定循环次数进行重复测试
- 状态打印:打印低功耗进入/退出的状态信息
- 无硬件依赖:无需 sensor 或其他外设
1.2 技术参数
| 参数 | 值 |
|---|---|
命令格式 | ./sample_pm [test_count] |
test_count | 循环次数(可选,默认 1) |
内存占用 | 极小 |
内核模块 | 需加载 xm_pm.ko |
1.3 目录结构
sample/pm/
├── Makefile # 构建脚本
└── sample_pm.c # 主程序2 编译与部署
2.1 前置条件
在编译本应用之前,请确保已完成以下准备工作:
- SDK 环境已搭建:参照 SDK 编译 完成交叉编译工具链和 SDK 配置
- 内核模块已加载:
xm_pm.ko已随媒体栈加载
2.2 编译应用
# 进入 sample 目录
cd <SDK_PATH>/sample
# 编译 pm 示例
make -C pm clean && make -C pm或者从顶层编译:
make -C sample all2.3 部署到板端
# 使用 SCP 传输到开发板
scp sample/pm/sample_pm root@<板端IP>:/tmp/
# 或通过 TFTP 下载
tftp -g -r sample_pm <板端IP>2.4 运行应用
# 添加执行权限
chmod +x /tmp/sample_pm
# 运行(默认 1 次)
./sample_pm 1
# 循环 5 次
./sample_pm 52.5 预期输出
单次测试(./sample_pm 1)
sample_pm test start
test_count = 1
pm test 0
pm init success
pm enter sleep mode
pm exit sleep mode
pm deinit success
program exit normally!成功标志:program exit normally!,无错误信息。
循环测试(./sample_pm 5)
sample_pm test start
test_count = 5
pm test 0
pm init success
pm enter sleep mode
pm exit sleep mode
pm deinit success
pm test 1
pm init success
pm enter sleep mode
pm exit sleep mode
pm deinit success
pm test 2
pm init success
pm enter sleep mode
pm exit sleep mode
pm deinit success
pm test 3
pm init success
pm enter sleep mode
pm exit sleep mode
pm deinit success
pm test 4
pm init success
pm enter sleep mode
pm exit sleep mode
pm deinit success
program exit normally!成功标志:重复指定次数后正常退出,显示 program exit normally!。
不带参数运行(./sample_pm)
sample_pm test start
test_count = 1
pm test 0
pm init success
pm enter sleep mode
pm exit sleep mode
pm deinit success
program exit normally!默认行为:不带参数时默认循环 1 次。
错误情况
pm init failed原因:PM 模块未加载或初始化失败 解决:检查 xm_pm.ko 是否加载
pm enter sleep mode failed原因:无法进入低功耗模式 解决:检查系统状态,是否有其他进程阻止
3 内部执行逻辑详解
3.1 应用架构
本应用采用简单的循环测试架构:
int main(int argc, char *argv[])
{
int test_count = 1;
int i;
// 解析命令行参数
if (argc > 1) {
test_count = atoi(argv[1]);
}
printf("sample_pm test start\n");
printf("test_count = %d\n", test_count);
// 循环测试
for (i = 0; i < test_count; i++) {
printf("pm test %d\n", i);
sample_pm_test();
}
printf("program exit normally!\n");
return 0;
}3.2 PM 测试流程
sample_pm_test() 函数演示了完整的低功耗流程:
xmedia_s32 sample_pm_test(void)
{
xmedia_s32 ret;
// 步骤 1:初始化 PM 模块
ret = xmedia_pm_init();
if (ret != XMEDIA_SUCCESS) {
printf("pm init failed\n");
return ret;
}
printf("pm init success\n");
// 步骤 2:进入低功耗模式
ret = xmedia_pm_enter_sleep_mode();
if (ret != XMEDIA_SUCCESS) {
printf("pm enter sleep mode failed\n");
xmedia_pm_exit();
return ret;
}
printf("pm enter sleep mode\n");
// 步骤 3:退出低功耗模式
ret = xmedia_pm_exit_sleep_mode();
if (ret != XMEDIA_SUCCESS) {
printf("pm exit sleep mode failed\n");
xmedia_pm_exit();
return ret;
}
printf("pm exit sleep mode\n");
// 步骤 4:清理资源
xmedia_pm_exit();
printf("pm deinit success\n");
return XMEDIA_SUCCESS;
}3.3 低功耗模式说明
GK7206 支持多种低功耗模式:
| 模式 | 描述 | 唤醒方式 |
|---|---|---|
| 浅睡眠 | 关闭部分时钟,保持 RAM | GPIO 中断、定时器 |
| 深睡眠 | 关闭更多时钟,降低电压 | GPIO 中断、RTC |
| 关断 | 关闭大部分电源,仅保留关键电路 | 电源按键、RTC |
本应用演示的是浅睡眠模式,适合需要快速唤醒的场景。
4 关键编程要点
4.1 初始化与清理
// 初始化 PM 模块
xmedia_pm_init();
// 清理 PM 模块
xmedia_pm_exit();4.2 进入/退出低功耗
// 进入低功耗模式
xmedia_pm_enter_sleep_mode();
// 退出低功耗模式
xmedia_pm_exit_sleep_mode();4.3 错误处理
每个 API 调用都应检查返回值:
ret = xmedia_pm_enter_sleep_mode();
if (ret != XMEDIA_SUCCESS) {
printf("pm enter sleep mode failed\n");
// 清理资源
xmedia_pm_exit();
return ret;
}5 常见问题排查
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
pm init failed | PM 模块未加载 | 检查 xm_pm.ko 是否加载 |
pm enter sleep mode failed | 无法进入低功耗 | 检查系统状态、是否有其他进程阻止 |
pm exit sleep mode failed | 唤醒失败 | 检查唤醒源配置 |
| 无法唤醒 | 唤醒源未配置 | 配置 GPIO 或 RTC 作为唤醒源 |
