1

我们在 STM32F407 板上的 CMSIS 和 FreeRTOS 中遇到互斥锁问题。

有两个线程可以通过 UART 访问硬件无线电。我们使用互斥锁来确保一次只有一个线程可以与无线电通信。

每次成功捕获或释放互斥体时使用SWO打印到串口,我们可以看到在某些情况下会发生以下情况:

  • 线程 1 使用 osMutexWait(radioAccessMutex, 400) 成功捕获互斥锁

  • 线程 2 使用 osMutexRelease(radioAccessMutex) 成功释放相同的互斥锁

据我了解,互斥锁只能由当前持有互斥锁的线程释放。

两个互斥调用的返回值都是 osOK。递归互斥锁已在配置文件中关闭。两个线程的优先级相同。

可能相关信息:CMSIS v. 1.02 FreeRTOS v. 8.2.1

SWO 输出代码:

void SWO_write(char* output)
{
    for(int i = 0; i < strlen(output); i++)
    {
      ITM_SendChar(output[i]);
    }
}

每次成功调用后立即捕获或释放互斥锁时都会调用此代码。一个以 null 结尾的字符串与调用结果一起传入。

4

2 回答 2

0

我们使用的 CMSIS 和 FreeRTOS 的配置确实允许一个线程释放由另一个线程捕获的互斥锁。

我添加了一个新的互斥锁来测试一个线程是否可以捕获它而另一个线程可以释放它。我检查了调试器中每个调用的值,都返回 osOK。CMSIS/FreeRTOS 确实允许这种行为。这两个位置是唯一更改互斥锁的区域。

于 2018-02-15T13:43:03.427 回答
0

CMSIS 不要求获取互斥锁的线程与释放它的线程相同。来自CMSIS-RTOS文档osMutexRelease

osStatus osMutexRelease (osMutexId mutex_id)

释放使用 osMutexWait 获得的 Mutex。当前等待相同互斥锁的其他线程现在将进入状态就绪。

状态和错误代码

  • osOK:互斥锁已正确释放。
  • osErrorResource:之前没有获得互斥量。
  • osErrorParameter:参数mutex_id 不正确。
  • osErrorISR:无法从中断服务例程调用 osMutexRelease。

请注意,不同线程获取和释放互斥锁时的条件没有错误代码。

让同一个线程获取和释放互斥锁是很好的设计,但 CMSIS 并未强制执行。

于 2018-02-15T23:24:38.367 回答