0

目前,我在嵌入式 linux 设备(版本 2.6.28.10)上有一个用户空间应用程序,它切换 GPIO 引脚来控制一些自定义硬件。对 GPIO 寄存器的写入是从单独pthreads的所有需要​​访问设备的寄存器中进行的。大多数情况下,这可以正常工作,因为semaphore防止多个线程访问同时执行 GPIO 写入的部分。

问题在于,在写入这些 GPIO 寄存器(大约 24 个 8 位写入)的过程中,另一个线程will interrupt是当前线程,尽管由于信号量,中断线程无法修改寄存器,但控制权不会返回给正在写入的线程到 GPIO 几毫秒,这当然会使发送到外部设备的数据无效。

linux中有没有方法可以保证这组GPIO写入(总共大概50usecs)不会被另一个线程打断?

4

1 回答 1

0

从您的问题中不清楚该线程如何中断工作线程,以及它是哪种线程(用户空间,内核空间或实际中断)。

如果中断线程是用户空间线程,则可以让它尊重互斥信号量。另一种选择是暂时提高工作线程的优先级,这样 CPU 就不能从它身上拿走(如果有这样的设施)。

如果中断线程是内核空间线程,您可以尝试使用也可以从内核调用的信号量实现(System V 信号量)。这些虽然更重。

如果中断线程实际上是一个中断,那么您需要构建一个由您的用户空间线程调用的内核组件,这反过来又禁用了临界区中的中断。这将对性能产生负面影响。

于 2013-08-15T12:44:22.277 回答