news 2026/6/10 19:40:45

外设与接口:按键输入 (libgpiod)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
外设与接口:按键输入 (libgpiod)

1 API 介绍

以下是处理 GPIO 中断事件的核心 API。

1.1 事件请求与监听
intgpiod_line_request_both_edges_events(structgpiod_line*line,constchar*consumer);
  • 参数
    • linegpiod_line对象指针。
    • consumer:消费者名称(如"button-listener")。
  • 作用:将引脚配置为输入模式,同时监听 上升沿(Rising Edge)和 下降沿(Falling Edge)。
  • 返回:成功返回0,失败返回-1
1.2 等待事件(阻塞)
intgpiod_line_event_wait(structgpiod_line*line,conststructtimespec*timeout);
  • 参数
    • line:已请求事件的gpiod_line对象指针。
    • timeout:超时时间。传NULL表示无限等待(直到事件发生才唤醒,CPU 占用率为 0)。
  • 作用:阻塞当前进程,等待中断事件。这是实现低功耗按键检测的核心。
  • 返回0表示超时,1表示有事件发生,-1表示发生错误。
1.3 读取事件详情

事件数据结构

structgpiod_line_event{structtimespects;// 事件发生的时间戳(纳秒级精度)intevent_type;// 事件类型};
  • event_type 常用值
    • GPIOD_LINE_EVENT_RISING_EDGE:上升沿。
    • GPIOD_LINE_EVENT_FALLING_EDGE:下降沿。
intgpiod_line_event_read(structgpiod_line*line,structgpiod_line_event*event);
  • 参数
    • linegpiod_line对象指针。
    • event:指向struct gpiod_line_event的指针,用于接收事件数据。
  • 返回:成功返回0,失败返回-1

2 两种实现方案

2.1 轮询模式

代码如下:

#include<gpiod.h>#include<stdio.h>#include<time.h>// for nanosleep#defineCHIP_NAME"gpiochip3"#defineLINE_OFFSET5// GPIO3_A5#defineDEBOUNCE_MS20// 消抖时间窗口// 辅助函数:毫秒级延时voidmsleep(longms){structtimespects={.tv_sec=ms/1000,.tv_nsec=(ms%1000)*1000000};nanosleep(&ts,NULL);}intmain(){structgpiod_chip*chip=gpiod_chip_open_by_name(CHIP_NAME);structgpiod_line*line=gpiod_chip_get_line(chip,LINE_OFFSET);intval,last_val=1;// 假设初始状态为高(松开)// 1. 仅配置为输入模式 (不使用中断)if(gpiod_line_request_input(line,"debounce-worker")<0){perror("Request input failed");return-1;}while(1){// 2. 主动轮询当前值val=gpiod_line_get_value(line);// 3. 发现电平变化if(val!=last_val){// 4. 暂停 20ms,让信号飞一会儿(过滤噪声)msleep(DEBOUNCE_MS);// 5. 再次读取进行确认 (Double Check)intstable_val=gpiod_line_get_value(line);if(stable_val==val){// 如果20ms后电平依然没变,认为是有效按键if(stable_val==0)printf(">>> Button PRESSED (Stable)\n");elseprintf(" Button RELEASED (Stable)\n");last_val=stable_val;// 更新状态机}}// 6. 降低轮询频率,保护 CPU (至关重要)msleep(10);}gpiod_line_release(line);gpiod_chip_close(chip);return0;}
2.1 中断模式

利用内核中断机制,程序不需要时刻盯着引脚,而是挂起等待内核唤醒。

代码如下 :

#include<gpiod.h>#include<stdio.h>#include<stdlib.h>// for system()#defineCHIP_NAME"gpiochip0"#defineLINE_OFFSET14// GPIO0_B6 (Group 1 * 8 + 6 = 14)intmain(){structgpiod_chip*chip;structgpiod_line*line;structgpiod_line_eventevent;// 1. 基础初始化chip=gpiod_chip_open_by_name(CHIP_NAME);line=gpiod_chip_get_line(chip,LINE_OFFSET);// 2. 请求监测双边沿事件 (关键 API)if(gpiod_line_request_both_edges_events(line,"button-listener")<0){perror("Request events failed");return-1;}printf("Waiting for events on %s line %d...\n",CHIP_NAME,LINE_OFFSET);while(1){// 3. 阻塞等待事件,无超时 (NULL),CPU 占用 0%if(gpiod_line_event_wait(line,NULL)>0){// 4. 读取具体事件gpiod_line_event_read(line,&event);// 5. 区分按下还是松开if(event.event_type==GPIOD_LINE_EVENT_FALLING_EDGE){printf("[Timestamp: %ld] Button PRESSED\n",event.ts.tv_sec);// 业务逻辑:例如 system("/usr/bin/restart_app.sh &");}else{printf("[Timestamp: %ld] Button RELEASED\n",event.ts.tv_sec);}}}gpiod_line_release(line);gpiod_chip_close(chip);return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 14:01:23

Day 39 - 图像数据与显存

在深度学习的进阶之路上&#xff0c;从结构化数据转向图像数据是一个重要的里程碑。图像数据不仅在维度上更加复杂&#xff0c;对计算资源&#xff08;尤其是显存&#xff09;的需求也呈指数级增长。 本文将深入探讨图像数据的结构特性、PyTorch 中的模型定义差异&#xff0c;…

作者头像 李华
网站建设 2026/6/10 19:09:10

rbd写入的数据流

这个问题问得非常专业&#xff0c;而且你这个阶段问 “RBD 写入的数据流&#xff0c;最好能到落盘&#xff0c;并结合代码”&#xff0c;已经是Ceph 原理 / 源码级理解了 &#x1f44d; 我下面按 “从 write() 系统调用 → OSD 真正落盘” 的顺序&#xff0c;逐层拆解&#xff…

作者头像 李华
网站建设 2026/6/10 13:59:06

3分钟快速集成:轻量级JavaScript天气组件终极指南

3分钟快速集成&#xff1a;轻量级JavaScript天气组件终极指南 【免费下载链接】weather real weather for Javascript 项目地址: https://gitcode.com/gh_mirrors/weat/weather 想要为网站添加实时天气功能&#xff1f;Weather.js让您轻松实现专业级天气显示&#xff0c…

作者头像 李华
网站建设 2026/6/10 10:30:31

LXMusic V4版:智能音乐发现与个性化下载体验完全指南

你是否曾经为了找到一首心仪的冷门歌曲而翻遍各大音乐平台&#xff1f;或者因为下载音乐过程繁琐而放弃收藏&#xff1f;今天&#xff0c;让我们一起来探索LXMusic音乐下载器V4版如何彻底改变你的音乐获取方式。 【免费下载链接】LXMusic音源 lxmusic&#xff08;洛雪音乐&…

作者头像 李华
网站建设 2026/6/10 11:49:01

ros2常用命令

1、ros2安装 wget http://fishros.com/install -O fishros && . fishros2、小海龟&#xff1a;测试一下 ros2 run turtlesim turtlesim_noderos2 run turtlesim turtle_teleop_key3、colcon安装 sudo apt install python3-colcon-common-extensionscolcon --helppip3 s…

作者头像 李华
网站建设 2026/6/10 11:52:43

TranslucentTB安装失败终极解决方案:7步彻底修复透明任务栏问题

TranslucentTB安装失败终极解决方案&#xff1a;7步彻底修复透明任务栏问题 【免费下载链接】TranslucentTB 项目地址: https://gitcode.com/gh_mirrors/tra/TranslucentTB 你是否曾经对Windows单调的任务栏感到厌倦&#xff1f;想要体验透明、模糊的现代化效果&#x…

作者头像 李华