You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用STM32F103C8+CMSIS-RTOS2调用osMutexAcquire()时程序崩溃求助

问题排查与修复

核心崩溃原因

你的代码存在互斥锁操作不匹配的致命问题:

  • 两个线程都是调用osMutexAcquire(myMutex1, osWaitForever)获取互斥锁,但释放时却调用osMutexRelease(myMutex2)
  • CMSIS-RTOS2明确要求:释放互斥锁的线程必须是当前持有该锁的线程,且只能释放自己获取的那把锁。错误释放未持有的锁会触发系统断言或非法内存访问,直接导致程序崩溃。

代码修复方案

修正互斥锁释放逻辑,同时修复代码中的拼写错误:

// 修正线程名拼写错误,同时遵循CMSIS-RTOS2线程函数标准签名
void child_task2(void *argument)
{
    while(1)
    {
        osMutexAcquire(myMutex1, osWaitForever);
        // 修正字符串拼写错误
        _send("Hello from child2\n");
        // 释放自己获取的myMutex1
        osMutexRelease(myMutex1);
        osDelay(100);
    }
}

void child_task1(void *argument)
{
    while(1)
    {
        osMutexAcquire(myMutex1, osWaitForever);
        _send("Hello from child1\n");
        osMutexRelease(myMutex1);
        osDelay(100);
    }
}

额外检查项

  • 确认myMutex1已通过osMutexNew()完成正确初始化,未初始化的互斥锁句柄调用osMutexAcquire同样会引发崩溃
  • 严格遵循CMSIS-RTOS2线程函数的标准签名void(*)(void*),避免因签名不兼容导致的潜在问题

内容的提问来源于stack exchange,提问作者Djelti Mohamed Amine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 19:24:10