GrabBag/Test/GpioModuleTest
2026-08-04 14:23:07 +08:00
..
2026-08-04 14:23:07 +08:00
2026-08-04 14:23:07 +08:00
2026-08-04 14:23:07 +08:00
2026-08-04 14:23:07 +08:00

GpioModuleTest

该程序直接调用 Module/GpioModuleGpioInput 公共接口,用于在 Linux 板卡上验证 I/O3 急停输入、输入极性和消抖逻辑。

默认配置对应当前停机引导急停配置:

  • 输入配置文件:/sys/external_gpio/jwsioc_inout_gpio3
  • 电平读取文件:/sys/external_gpio/jwsioc_gpio3
  • 高电平有效
  • 常闭安全回路:正常时 I/O3 接 GND按下急停或线路断开时回路断开
  • 轮询周期10ms
  • 消抖时间50ms

运行示例:

sudo ./GpioModuleTest --seconds 30

CMake 交叉编译

测试目录可以独立编译,不需要先生成 libGpioModule.a。CMake 会直接编译 Module/GpioModule/Src/GpioInput.cpp 并链接测试程序。

使用已有 toolchain 文件:

cmake -S Test/GpioModuleTest -B build/GpioModuleTest-arm \
  -DCMAKE_TOOLCHAIN_FILE=/path/to/aarch64-toolchain.cmake \
  -DCMAKE_BUILD_TYPE=Release
cmake --build build/GpioModuleTest-arm --parallel

也可以直接指定交叉编译器:

cmake -S Test/GpioModuleTest -B build/GpioModuleTest-arm \
  -DCMAKE_SYSTEM_NAME=Linux \
  -DCMAKE_SYSTEM_PROCESSOR=aarch64 \
  -DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ \
  -DCMAKE_BUILD_TYPE=Release
cmake --build build/GpioModuleTest-arm --parallel

生成的程序位于:

build/GpioModuleTest-arm/bin/GpioModuleTest

测试期间先保持 I/O3 与 GND 正常闭合,再按下急停或断开线路。预期输出:

VALUE: INACTIVE (logical 0) [initial]  # I/O3 与 GND 闭合,系统正常
IO3: INACTIVE (logical 0)
VALUE: ACTIVE (logical 1) [changed]    # 急停按下或线路断开
IO3: ACTIVE (logical 1)
VALUE: INACTIVE (logical 0) [changed]  # 回路重新闭合

程序启动时先向 jwsioc_inout_gpio3 写入 0,将 I/O3 配置为输入,然后每 10ms 读取 jwsioc_gpio3。默认每 500ms 打印一次状态,可通过 --print-ms 调整。UNAVAILABLE 表示配置文件或电平文件不可访问,应同时查看前面的 ERROR

需要覆盖文件路径时:

sudo ./GpioModuleTest \
  --direction /sys/external_gpio/jwsioc_inout_gpio3 \
  --value /sys/external_gpio/jwsioc_gpio3 \
  --seconds 30

若测试结果与预期极性相反,可以临时增加 --active-low 排查;正式急停逻辑固定为常闭回路断开触发,不应通过反转极性掩盖接线问题。

退出码:

  • 0GPIO 至少成功连接一次。
  • 1:命令行参数错误。
  • 2:模块启动失败,或测试期间 GPIO 始终不可用。
  • 3:当前平台不是 Linux。