【问题标题】:Embedded Linux. Execute block of code atomically嵌入式 Linux。原子地执行代码块
【发布时间】:2013-08-15 12:16:09
【问题描述】:

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

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

linux中有没有方法可以保证这组GPIO的写入(总共大约50usecs)不被其他线程打断?

【问题讨论】:

  • 令我震惊的是,这是一个需要内核驱动程序的完美示例……我不知道什么可以保证此功能。提高线程优先级会有所帮助,但这不是保证。
  • 这甚至是来自内核驱动程序的保证吗?我认为即使是内核驱动程序中的一段代码也有可能被中断。
  • 在内核驱动程序中,您可以锁定其他线程正在切换,是的。

标签: c linux scheduling embedded-linux atomic


【解决方案1】:

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

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

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

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

【讨论】:

  • 这些线程当前是用户空间pthreads,中断由调度程序完成,允许其他线程运行。问题不在于其他线程不遵守信号量,而是调度程序在需要原子执行的一段代码期间给其他线程时间。我的意思是 GPIO 写入需要 50 微秒,而这 50 微秒需要在处理器上连续,而不是这里的 25 微秒和几毫秒后的 25 微秒
  • 我明白了。在这种情况下,你应该看看你的内核有什么样的实时支持(rt.wiki.kernel.org/index.php/RT_PREEMPT_HOWTO)。或者实现一个你调用的内核空间组件(更重)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-14
相关资源
最近更新 更多