嵌入式Linux。以原子方式执行代码块

时间:2013-08-15 12:16:10

标签: c linux scheduling embedded-linux atomicity

目前,我在嵌入式Linux设备(版本2.6.28.10)上有一个用户空间应用程序,它正在切换GPIO引脚以控制某些自定义硬件。对GPIO寄存器的写操作来自单独的pthreads,所有这些都需要访问器件。大多数情况下这很好用,因为有semaphore阻止多个线程访问GPIO同时写入的部分。

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

linux中是否有一种方法可以确保这组GPIO写入(总共约50个usecs)不会被另一个线程中断?

1 个答案:

答案 0 :(得分:0)

从你的问题中不清楚这个线程如何中断工作线程,以及它是什么类型的线程(用户空间,内核空间或实际中断)。

如果中断线程是用户空间线程,您可以让它尊重互斥信号量。另一个选择是暂时提高工作线程的优先级,以便不能从中取走CPU(如果有这样的工具可用)。

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

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