我想使用基于 GPIO 的按钮。假设按下输入低电平,松开是高电平。硬件有做抖动消除(树莓派可能没有,但是应该不影响我这个比较宽泛的问题的讨论)。在写驱动的时候,脑海里浮现了一个奇怪的问题。
正常流程:
按键 ->硬件抖动消除 -> 中断产生,cpu 收到中断 ->中断处理程序读取 GPIO 的值(高还是低电平)判断按键的动作是什么,读到的值是 0 ,然后做相应的处理
但是我不知道是否在理论上存在这样一种可能:
按键 ->硬件抖动消除 -> 中断产生,cpu 收到中断 ->键被快速释放(假设理论上有个足够快的按键工具可以快速释放) -> 硬件抖动消除 ->由第一次中断引起的中断处理程序读取 GPIO 的值,读到的值是 1 。与正常流程不一样。
其实这个问题的本质我感觉是 GPIO 没有硬件 cache 来存储数据(也就是每次中断对应的 GPIO 值),后来的中断可能在理论上覆盖前面的值。但是像其他设备,比如网卡就有 cache 会存储数据,虽然 cache 的容量是有限制的,但是至少可以保证前几次中断来的数据不会被覆盖。cache 满了的时候,会丢弃后面的数据。请问这样理解对吗?
另外,正常流程中,读取 GPIO 值在中断的 top half 里面读比较好呢,还是在 bottom half 里面读也可以?是不是在 bottom half 里面读也无所谓,因为 GPIO 按键是个慢中断,在实践上没有我后面所说的 GPIO 值被后来的中断覆盖的问题。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.