跳到主要内容

系统服务 · 系统控制

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.shlunch <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.solibsys.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.solibsys.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/watchdogwdctl 命令查看看门狗信息
  • 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