我想使用基于 GPIO 的按钮。假设按下输入低电平,松开是高电平。硬件有做抖动消除(树莓派可能没有,但是应该不影响我这个比较宽泛的问题的讨论)。在写驱动的时候,脑海里浮现了一个奇怪的问题。
正常流程:
按键 ->硬件抖动消除 -> 中断产生,cpu 收到中断 ->中断处理程序读取 GPIO 的值(高还是低电平)判断按键的动作是什么,读到的值是 0 ,然后做相应的处理
但是我不知道是否在理论上存在这样一种可能:
按键 ->硬件抖动消除 -> 中断产生,cpu 收到中断 ->键被快速释放(假设理论上有个足够快的按键工具可以快速释放) -> 硬件抖动消除 ->由第一次中断引起的中断处理程序读取 GPIO 的值,读到的值是 1 。与正常流程不一样。
其实这个问题的本质我感觉是 GPIO 没有硬件 cache 来存储数据(也就是每次中断对应的 GPIO 值),后来的中断可能在理论上覆盖前面的值。但是像其他设备,比如网卡就有 cache 会存储数据,虽然 cache 的容量是有限制的,但是至少可以保证前几次中断来的数据不会被覆盖。cache 满了的时候,会丢弃后面的数据。请问这样理解对吗?
另外,正常流程中,读取 GPIO 值在中断的 top half 里面读比较好呢,还是在 bottom half 里面读也可以?是不是在 bottom half 里面读也无所谓,因为 GPIO 按键是个慢中断,在实践上没有我后面所说的 GPIO 值被后来的中断覆盖的问题。