我们遇到了CMSIS中的互斥锁和STM32F407主板上的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结尾的字符串。
答案 0 :(得分:0)
我们正在使用的CMSIS和FreeRTOS的配置允许一个线程释放由另一个线程捕获的互斥锁。
我添加了一个新的互斥锁来测试一个线程是否可以捕获它而另一个线程可以释放它。我检查了调试器中每个调用的值,并返回osOK。 CMSIS / FreeRTOS确实允许这种行为。这两个位置是唯一可以更换互斥锁的区域。
答案 1 :(得分:0)
CMSIS不要求获取互斥锁的线程与释放互斥锁的线程相同。来自osMutexRelease
的{{3}}文档:
osStatus osMutexRelease(osMutexId mutex_id)
发布使用osMutexWait获得的互斥锁。其他线程 目前等待相同的互斥锁现在将进入该状态 READY。
状态和错误代码
- osOK:互斥锁已正确释放。
- osErrorResource:以前没有获得互斥锁。
- osErrorParameter:参数mutex_id不正确。
- osErrorISR:无法从中断服务程序中调用osMutexRelease。
请注意,当不同的线程获取并释放互斥锁时,条件没有错误代码。
拥有相同的线程获取并释放互斥锁是一个很好的设计,但它不是由CMSIS强制执行的。