(Hisilicon)笔试题:嵌入式Linux C语言GPIO中断与按键消抖(转载)

转载:https://mp.weixin.qq.com/s/auGOW4TbPgRx0rsB4ysxjA?mpshare=1&scene=1&srcid=0416tZqQbRIdlr8Dt1bOaB0m&sharer_shareinfo=bbe25af903019d6debb934098abecef4&sharer_shareinfo_first=bbe25af903019d6debb934098abecef4&color_scheme=light#rd

题目:在基于华为海思Hi3516DV300(ARM Cortex-A7)的嵌入式Linux系统上实现按键处理功能,要求:

  1. 配置GPIO4_7为中断输入(下降沿触发),连接外部按键(按下时接地,默认上拉);

  2. 实现按键消抖:检测到中断后,延迟20ms再次读取GPIO状态,确认按键确实按下;

  3. 按键事件处理:支持短按(按下时间<1s)和长按(按下时间≥1s)识别,分别记录事件类型;

  4. 应用层交互:通过消息队列将按键事件(类型、时间戳)发送给应用程序,应用层每5秒打印一次事件统计(短按次数、长按次数)。

详细分析过程:

一、核心考点拆解

本题聚焦嵌入式Linux下GPIO中断与输入设备处理,重点包括:

• GPIO中断配置(触发方式、上下拉设置);

• 硬件消抖 与软件滤波(解决机械抖动问题);

• 事件识别(短按/长按的时间判断逻辑);

• 进程间通信(消息队列的使用与数据传递)。

二、关键设计思路

  1. GPIO中断初始化:

◦ 设备树配置:在设备树中添加GPIO4_7节点,指定中断属性(interrupt-parent = <&gpio4>; interrupts = <7 IRQ_TYPE_EDGE_FALLING>),并设置上拉(gpio-pull-up = <1>);

◦ 驱动层初始化:通过gpio_request申请GPIO,调用request_irq注册中断处理函数,中断类型设为下降沿触发(IRQF_TRIGGER_FALLING);

◦ 中断共享 :若该GPIO中断可能被其他设备共享,需添加IRQF_SHARED标志,并在中断处理中判断是否为本设备触发。

  1. 按键消抖实现:

◦ 硬件基础:依赖GPIO内部上拉电阻 ,++确保按键未按下时输入为高电平,按下时为低电平++;

◦ 软件消抖:中断处理函数中,首先禁用中断(disable_irq_nosync),避免抖动引发多次中断;**延迟20ms(使用msleep)备注: 中断不是讲究快进快出的么? 为何能加入延时?**后重新读取GPIO电平,若仍为低电平则确认按键按下,否则视为抖动并忽略;

◦ 恢复中断:处理完成后重新使能中断(enable_irq),确保后续按键可被检测。

  1. 短按/长按识别:

◦ 计时起点:确认按键按下后,记录开始时间(使用jiffies或ktime_get_real);

◦ 释放检测:通过工作队列(struct work_struct)在后台轮询GPIO状态,当检测到电平回升(按键释放)时,计算按下持续时间(当前时间-开始时间);

◦ 事件分类:持续时间<1000ms为短按,≥1000ms为长按,分别更新对应的计数器。

  1. 消息队列通信:

◦ 队列创建:驱动层通过msgget创建消息队列(键值0x1234) ,应用层通过相同键值获取队列ID;(msgget重点)

◦ 数据结构:定义消息结构体(包含类型字段mtype=1、事件类型event_type、时间戳timestamp);

◦ 发送机制:每次识别到按键事件后,驱动层通过msgsnd将消息发送到队列;应用层通过msgrcv阻塞读取,并存入本地缓存用于统计。

三、实现难点解析

  1. 中断与工作队列协同:**中断处理函数需快速执行,因此将耗时的轮询释放操作交给工作队列,避免阻塞中断上下文;**需注意工作队列的调度延迟可能影响长按识别精度,可通过高优先级工作队列优化。 重点:搞清楚什么是中断的上下文,中断的回调函数能否加入延时?

  2. 时间计算精度:使用jiffies(内核节拍,通常10ms或1ms)计时可能存在误差,对长按判断影响较小,但如需更高精度(如500ms阈值),建议使用ktime_get_real(纳秒级)。

  3. 多按键扩展:若需支持多个按键,可通过数组管理不同GPIO的中断、计数器和工作队列,避免代码冗余;中断处理中通过dev_id区分不同按键,提高扩展性。

  4. 异常处理:若按键卡住(长期低电平),需在驱动层添加超时机制(如5秒后强制视为长按并重置状态),避免资源被永久占用。

四、考点总结

华为海思芯片在安防、物联网设备中应用广泛,GPIO中断是嵌入式设备与外部交互的基础功能。本题覆盖了从硬件配置到软件逻辑、再到进程通信的完整流程,核心考察:

• 中断处理的安全性(禁用/使能时机、上下文管理);

• 硬件特性与软件逻辑的结合(消抖策略设计);

• 时间敏感型任务的处理(长短按识别);

• 内核与应用层的数据交互能力。

实际面试中,可能会追问:如何处理多个按键同时按下的冲突?如何通过定时器优化长按检测?这些问题需要结合互斥机制和资源调度策略分析,体现对复杂场景的工程应对能力。

相关推荐
智感子3 小时前
测控链路:从传感器到上位机
人工智能·嵌入式硬件·fpga开发
阳光九叶草LXGZXJ7 小时前
达梦数据库-报错-15-列【XXX】长度超出定义
linux·运维·数据库·sql·学习
奔跑的大白啊7 小时前
多容器共享目录权限踩坑记
linux·ubuntu·共享目录·linux权限·docker 容器化部署
恒锐丰科技林技术员7 小时前
EG2129 带过流保护全桥驱动芯片解析
经验分享·嵌入式硬件·硬件工程
女神下凡10 小时前
芯参谋(43):DDR4_电路设计指南
arm开发·单片机·嵌入式硬件·设计规范
Android系统攻城狮10 小时前
Linux Gstreamer深度解析之gst_audio_encoder_set_frame_max调用流程与实战(六十一)
android·linux·运维·音视频·gstreamer音视频·音视频进阶·gstreamer音视频进阶
电子元器件选型哥11 小时前
MOS管驱动电阻怎么选?阻值大小到底影响什么?
单片机·嵌入式硬件·硬件工程师·半导体·电子元器件
H.莓飛11 小时前
【C++】命名空间、缺省参数、函数重载与引用
linux·开发语言·c++·visual studio
白搞电子11 小时前
ESP32-S31 上做可在线安装的 WASM 应用平台:0.4.9 Beta 发布
单片机·嵌入式硬件·物联网
91刘仁德11 小时前
IP协议详解:从IP协议头到网段划分、路由与NAT
linux·服务器·网络·网络协议·tcp/ip