系统服务 · 系统控制
1. 模块概述
- 主要功能:系统控制模块,提供系统电源模式管理、看门狗控制和唤醒源配置功能,用于休眠、唤醒、看门狗喂狗等系统级管理场景
- 规格或特性:
- 支持多种电源模式:ACTIVE、IDLE、SENSOR_OFF、SUSPEND、HIBERNATE、POWEROFF、REBOOT
- 模式切换钩子函数支持,可在模式切换前执行自定义逻辑
- 看门狗控制:基于
/dev/watchdog设备,支持自动初始化和定期喂狗 - 唤醒源控制:支持网络唤醒(Wake-on-LAN)和 GPIO 唤醒(高/低电平触发)
- 相关目录结构:
components/system/sys/
├── include/sys.h # 对外 API 头文件
├── src/sys.c # 库实现源码
├── test/test_sys.c # 测试用例
├── CMakeLists.txt # 构建配置
└── README.md # 模块说明
2. 环境准备
前置条件
- 运行环境:Linux 内核(支持 watchdog、GPIO sysfs、ethtool)、CMake ≥ 3.16、gcc/clang 编译器
- 依赖与外部资源:无额外外部依赖,仅依赖标准 C 库
- 环境变量与初始化:若通过 SDK 编译,需先执行
source build/envsetup.sh并lunch <target> - 硬件与连接:目标板需支持看门狗和 GPIO,确认
/dev/watchdog和 GPIO sysfs 存在 - 工具与权限:看门狗、网络唤醒、GPIO 操作需 root 权限
构建编译
- 获取代码:代码位于 SDK 的
components/system/sys目录 - 本模块编译:
cd components/system/sys
mkdir build && cd build
cmake ..
cmake --build .
仅编译库(不编译测试):
cmake -DBUILD_SYS_TESTS=OFF ..
cmake --build .
- 产物:
- 用户态库:
libsys.so或libsys.a - 测试程序:
build/test_sys
- 用户态库:
3. 示例使用(从 0 跑通)
3.1 系统模式切换与钩子函数
前置:已编译 libsys,目标板已上电
步骤 1:运行测试程序
cd components/system/sys/build
sudo ./test_sys
预期现象:执行所有测试用例,输出类似:
[TEST] System mode operations... PASSED
[TEST] Hook registration... PASSED
[TEST] Watchdog operations... PASSED
[TEST] Network wakeup... PASSED
[TEST] GPIO wakeup... PASSED
All tests passed!
步骤 2:测试电源模式切换(需 root 权限)
sudo ./test_sys --mode-test
预期现象:系统切换到不同电源模式,输出显示当前模式状态
3.2 看门狗喂狗测试
前置:见 §2,确认 /dev/watchdog 存在
步骤 1:运行看门狗测试
sudo ./test_sys --watchdog
预期现象:程序定期喂狗,输出显示喂狗成功,系统不会重启
4. 应用开发
-
对外 API 或接口形态:
- 头文件:
include/sys.h - 库名:
libsys.so或libsys.a - 主要 API:
sys_set_mode()- 设置系统电源模式sys_get_mode()- 获取当前电源模式sys_register_hook()- 注册模式切换钩子函数sys_watchdog_feed()- 喂狗(重置看门狗定时器)sys_enable_wakeup_net()- 启用/禁用网络唤醒sys_enable_wakeup_gpio()- 配置 GPIO 唤醒源
- 头文件:
-
调用方式与注意点:
- 权限:大部分操作需 root 权限
- 钩子函数:返回非 0 值会阻止模式切换
- 看门狗:首次调用
sys_watchdog_feed()会自动初始化,需定期调用防止系统重启 - GPIO 唤醒:需确认 GPIO 编号和触发电平正确
-
参考 demo 或示例路径:
components/system/sys/test/test_sys.c
5. 调试指南
- 系统日志查看:
dmesg | grep -E "watchdog|gpio|wakeup"查看内核相关日志 - 看门狗状态:
cat /dev/watchdog或wdctl命令查看看门狗信息 - GPIO 状态:
cat /sys/class/gpio/gpio*/value查看 GPIO 状态 - 网络唤醒:
ethtool eth0 | grep Wake-on查看 WoL 状态
6. 常见问题
| 现象 | 可能原因 | 处理 |
|---|---|---|
sys_set_mode() 失败 | 权限不足或内核不支持该模式 | 使用 root 权限,检查内核电源管理配置 |
| 看门狗测试失败 | /dev/watchdog 不存在或权限不足 | 确认内核启用 watchdog,使用 sudo |
| 网络唤醒无效 | 网卡不支持 WoL 或未启用 | 检查硬件支持,使用 ethtool -s eth0 wol g |
| GPIO 唤醒失败 | GPIO 编号错误或 sysfs 不存在 | 确认 GPIO 编号,检查 /sys/class/gpio/ |
| 系统意外重启 | 看门狗超时未喂狗 | 确保定期调用 sys_watchdog_feed() |
附录:性能与测试数据
测试方法:使用 test_sys 程序在目标板上测试,硬件平台为 SPACEMIT K1 芯片,Linux 内核 5.10。部分测试需 root 权限。测试命令:
sudo ./test_sys