C-由一个线程捕获并由另一个CMSIS和FREERTOS STM板释放的Mutex



我们在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并未执行。

最新更新