我正在将使用电平触发中断的现有系统移植到嵌入式 Linux 设备。我遇到了一些麻烦,希望有人可以提供帮助。我的计划是使用 poll() 函数(在用户空间中,没有低级别驱动程序的计划)来检测 gpio 线何时为高电平。这是做某事的迹象。
不幸的是,我还没有弄清楚如何启用该条件。现在我正在做以下事情:
- 将 gpio 编号写入 /sys/class/gpio/export
- 将方向设置为“in”
- 将边缘设置为 ?
我可以设置 GPIO 以便当 gpio 线为高时 poll 将返回,即使 poll() 被多次调用而不清除条件,但如果线为低它会等待?我应该使用其他东西而不是尝试使用 poll() 吗?谢谢!
更新
我以为我有一个解决方案,但显然没有。我将 GPIO 线上的边缘设置为“上升”。在硬件方面,该线路与数据缓冲区的“FIFO used”计数相关联。如果 FIFO 中有数据,则该行为高电平。否则就低了。然后我设置了以下系统:
GetByte() {
Is there data in the FIFO? {
Read a byte.
Return
}
Call poll() to wait for the data {
Is there data in the FIFO? {
Read a byte.
Return
}
}
}
第一个“If”语句在那里,因为我一次只读取一个字节,如果条件没有改变,poll() 在超时之前不会返回(如果有多个字节,它不会在我的系统中先进先出)。我现在看到的问题是 poll() 有时会返回,但 FIFO 中没有任何数据。实际上,poll() 返回 '1',但 FIFO 报告它是空的。
我希望 poll() 只会在 gpioXX/value 文件由于 GPIO 线的“上升”边缘设置从 0 更改为 1 时检测到更改。那是对的吗?这是使用 poll() 的合理方式还是我应该考虑不同的设计。