我们在CMSIS和freertos中遇到了STM32F407板上的互惠件。
有两个线程可以通过UART访问硬件收音机。我们正在使用Mutex来确保一个线程一次可以与收音机交谈。
每次捕获或成功释放Mutex时,使用SWO将其打印到串行端口,我们可以看到在某些情况下发生以下情况:
-
线程1使用osmutexwait(roadisaccessmutex,400(
成功捕获静音 线程2使用osmutexrease(roadisaccessmutex(
成功释放了相同的静音
从我的理解中,只能由当前持有静音的线程释放互斥。
来自两个静音调用的返回值是OSOK。递归静音词已在配置文件中关闭。这两个线程都是相同的优先级。
可能相关信息:CMSIS诉1.02Freertosv。8.2.1
SWO输出的代码:
void SWO_write(char* output)
{
for(int i = 0; i < strlen(output); i++)
{
ITM_SendChar(output[i]);
}
}
每当成功呼叫后立即捕获或释放Mutex时,此代码都会调用。呼叫的结果传递了一个无效的终止字符串。
我们正在使用的CMSIS和FREERTOS的配置确实允许一个线程释放由另一个线程捕获的Mutex。
我添加了一个新的Mutex来测试一个线程是否可以捕获它,另一个线程可以释放它。我在调试器中检查了每个调用的值,并返回OSOK。CMSIS/FREERTOS确实允许此行为。这两个位置是唯一更改静音的区域。
cmsis不需要获取静音的螺纹与释放它的线相同。来自osMutexRelease
的CMSIS-RTOS文档:
osstatus osmutexrelease(osmutexid mutex_id(
释放使用osmutexwait获得的静音。其他线程 目前等待同一静音现在将被放入状态 准备就绪。
状态和错误代码
- OSOK:静音已正确释放。
- oserrorsource:静音以前没有获得。
- oserrorParameter:参数mutex_id不正确。
- oserrorisr:osmutexrelease无法从中断服务例程中调用。
请注意,当不同的线程获取并释放Mutex时,条件没有错误代码。
具有相同的线程获取和释放互斥性是很好的设计,但是CMSIS并未执行。