你有没有过这样的烦恼:在树莓派、BeagleBone 或者其他 Linux 嵌入式板子上刷 GPIO、调 PWM、读 I²C,就跟爬长城似的,一头雾水?今天给大家安利一个「真·纯 C 手撕内核 API」的外设库——c-periphery。听完你就知道,外设操控还能这么简单。
什么是 c-periphery
简单说,c-periphery 是一个用纯 C 写成的用户态外设访问库,支持 GPIO、LED、PWM、SPI、I²C、MMIO、Serial 串口等接口。它把原本散落在 /sys、/dev、mmap、ioctl 等各式各样的调用封装成统一易用的 API。
-
• 重入安全(re-entrant)
-
• 只依赖标准 C 库和 Linux 内核
-
• 编译后生成静态或共享库,一键集成
-
• MIT 协议,商用无忧
-
它帮你解决了哪些痛点
-
1. 接口繁杂:不用再翻阅读写 sysfs、spidev/ioctl 手册,几行代码搞定。
-
2. 依赖膨胀:不需要 libgpiod、python、lua,只要 gcc 就能编译。
-
3. 跨平台:树莓派、阿里 T-Head、BeagleBone 一套 API 通吃。
-
4. 集成成本高:静态库、头文件拷过去就能用,不用改 CMakeLists.txt 一堆变量。
支持的接口一览
|
接口 |
功能描述 |
|
GPIO |
通用输入输出 |
|
LED |
系统 LED 控制 |
|
PWM |
脉宽调制 |
|
SPI |
串行外设接口 |
|
I2C |
I²C 总线访问 |
|
MMIO |
内存映射寄存器 |
|
Serial |
串口通信 |
快速上手:GPIO 翻转示例
举个最常见的例子,按键控制灯的翻转。完整代码都给你写好了,直接 copy 就行。
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "gpio.h"
int main(void){
gpio_t*in = gpio_new(),*out = gpio_new();
// 打开输入口(chip0,line 10)和输出口(chip0,line 12)
if(gpio_open(in,"/dev/gpiochip0",10, GPIO_DIR_IN)<0||
gpio_open(out,"/dev/gpiochip0",12, GPIO_DIR_OUT)<0){
fprintf(stderr,"Open GPIO 失败: %s\n", gpio_errmsg(in));
return 1;
}
bool v;
// 读按键,写反向值到 LED
if (gpio_read(in,&v)<0|| gpio_write(out,!v)<0){
fprintf(stderr,"I/O 错误: %s\n", gpio_errmsg(out));
}
gpio_close(in); gpio_close(out);
gpio_free(in); gpio_free(out);
return 0;
}
只要这十几行,你就拥有了稳定、可重入、零依赖的 GPIO 控制。
其他接口示例速览
-
• LED:
led_open("led0"),led_write(true)。 -
• PWM:
pwm_open(chip, channel)→pwm_set_frequency()→pwm_set_duty_cycle()→pwm_enable()。 -
• SPI:
spi_open("/dev/spidev1.0", mode, speed)→spi_transfer(buf, buf, len)。 -
• I²C:构建
i2c_msg数组,i2c_transfer(msgs, n)。 -
• MMIO:
mmio_open(base, len)→mmio_read32(offset)/mmio_ptr()→ 直接读寄存器。 -
• Serial:
serial_open("/dev/ttyUSB0", 115200)→serial_write()/serial_read()。
优缺点对比
|
优点 |
缺点 |
|
纯 C 实现、无额外依赖 |
只支持 Linux 平台 |
|
API 统一,调用简洁 |
错误信息较简略,调试时需加 printf |
|
静态/共享库可选,方便项目集成 |
文档散落在多个子模块,需要翻 README |
|
支持多种外设(GPIO、SPI、I²C、MMIO 等) |
不含高级封装(线程安全由用户自行保证) |
总结
说到底,c-periphery 就像给 C 程序员准备的一把瑞士军刀,你想不到的外设 I/O 它基本都罩着。少写几十行 boilerplate,减少三分之二踩坑时间,项目上线更顺溜。唯一要注意的,就是它只在 Linux 下跑,如果你还用 Windows、macOS,那就另选方案吧。
要是你偶尔还写 Python 或 Lua,也别担心,作者还维护了 python-periphery、lua-periphery;更有 Java、Dart 等社区贡献的移植库。总之,c-periphery 的生态够开阔,功能够全面,轻量、高效又稳定,值得一试。
项目地址:https://github.com/vsergeev/c-periphery