使用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
相关产品推荐
相关产品推荐

