【发布时间】:2014-03-07 11:19:53
【问题描述】:
我有 2 个线程 Thread1 和 Thread2。而且我确实有一个外设读取或写入的功能。说一个 SPI 读或写函数。在某些情况下,两个线程都使用 SPI 函数。由于线程本质上是并发的,因此两个线程是否有可能同时尝试访问该函数。那就是想要将 0x10 0x25 写入 SPI 的 Thread1。而 Thread2 想要写入 0x20 0x56。如果不使用任何同步机制,是否有可能将错误的序列写入 SPI 缓冲区?
【问题讨论】:
-
是的,这种可能性是存在的。你最好在这里使用互斥锁!
-
即,函数开始时的互斥锁和函数仪式结束时的解锁?
-
没错。在 SPI_Read 例程开始时调用 Mutex-Get,在 SPI_Read 例程结束时调用 Mutex-Put。另外,将此 Mutex 初始化为继承优先级,以允许它使用优先级反转解决 3 线程死锁。
-
不是错字。假设您有 3 个线程,优先级为 High、Med 和 Low。现在,假设低优先级线程执行 SPI 读取请求,从而获取 SPI 互斥锁。然后,Med-priority 线程唤醒(无论出于何种原因),并立即切换到操作(因为它的优先级高于当前执行线程的优先级)。最后,高优先级线程唤醒执行 SPI 读取请求。由于低优先级线程已经获取了 SPI 互斥锁,因此高优先级线程被阻塞。
-
所以本质上,Med-priority 线程比 High-priority 线程“首选”。请注意,SPI 仅由低优先级线程和高优先级线程使用。 Med-priority线程与它无关。互斥锁可以使用优先级反转来解决这个死锁。
标签: c multithreading synchronization embedded-linux spi