大家好,我在 LicheePi 4A (Revy OS) 上尝试移植并使用 wiringX 库控制 GPIO 时遇到了问题,想请教一下各位大佬。
环境信息:
-
硬件: LicheePi 4A (16GB)
-
系统: Revy OS (基于 Debian)
-
工具链: RuyiSDK
操作步骤: 我下载了 wiringX 源码,手动修复了部分构建脚本错误(注释了不兼容的平台代码),成功编译并安装了库。 因为 LicheePi 4A 的 GPIO 在 Sysfs 中的起始编号是 480,所以我使用 generic 模式编写了如下测试代码:
C
#include <unistd.h>
#include <wiringx.h>
#include <stdio.h>
int main() {
// 1. 初始化 WiringX (使用 generic 模式以避免段错误)
// Generic 模式通过 Linux Sysfs 接口控制,兼容性最强
if(wiringXSetup("generic", NULL) == -1) {
wiringXGC();
printf("WiringX 初始化失败!\n");
return -1;
}
// 2. 定义要操作的引脚
// LicheePi 4A 的 GPIO 控制器起始引脚号为 480
int PIN_LED = 480;
if(wiringXValidGPIO(PIN_LED) != 0) {
printf("无效的 GPIO 引脚号: %d\n", PIN_LED);
return -1;
}
// 3. 设置引脚模式为输出
pinMode(PIN_LED, PINMODE_OUTPUT);
printf("开始运行 Blink 测试 (按 Ctrl+C 退出)...\n");
while(1) {
printf("LED 亮 (Pin %d)\n", PIN_LED);
digitalWrite(PIN_LED, HIGH); // 输出高电平 (3.3V)
sleep(1); // 等待 1 秒
printf("LED 灭 (Pin %d)\n", PIN_LED);
digitalWrite(PIN_LED, LOW); // 输出低电平 (0V)
sleep(1); // 等待 1 秒
}
return 0;
}
报错现象: 运行编译后的程序(已给 sudo 权限),直接提示: Segmentation fault
我的分析(求证): 我排查后怀疑是 GPIO 编号过大 导致的。 LicheePi 4A 的 GPIO 编号是从 480 开始的。我推测 wiringX 的 generic 模式在内部实现时,可能维护了一个静态数组来管理引脚状态。如果这个数组的大小是针对树莓派等传统板子设计的(例如大小只有 64 或 128),那么当我传入 480 作为索引时,就会发生数组越界访问,从而导致段错误。
请问大家是否有遇到过类似情况?在这个平台上使用 wiringX 是否必须修改源码中的数组大小定义?
非常感谢!
