M5Atom Lite运行互斥量多任务测试代码后开机崩溃循环重启问题
故障触发原因
该问题的核心触发点是互斥量未初始化就被调用,触发FreeRTOS内核断言导致设备复位:
- 全局声明的
SemaphoreHandle_t xMutex = NULL仅定义了互斥量的句柄指针,未实际分配内核层面的互斥量资源 - setup函数中未执行互斥量初始化操作,直接创建了绑定核心0的子任务
- 核心0的子任务、核心1运行的loop任务先后对值为NULL的互斥量句柄调用
xSemaphoreTake接口,触发FreeRTOS的参数合法性校验断言,直接触发软件复位循环
解决办法
在setup函数中创建子任务之前,先调用xSemaphoreCreateMutex()完成互斥量的初始化,确认创建成功后再启动子任务即可。
修正后的完整代码
#include <Arduino.h> SemaphoreHandle_t xMutex = NULL; volatile int a = 0; void subprocess(void *pvParameters) { for (;;) { if (xSemaphoreTake(xMutex, (portTickType)1000) == pdTRUE) { Serial.println(2 * a); a++; xSemaphoreGive(xMutex); } delay(1000); } } void setup() { Serial.begin(115200); // 先初始化互斥量 xMutex = xSemaphoreCreateMutex(); // 可选:增加互斥量创建成功校验,避免内存不足导致的异常 if(xMutex == NULL){ Serial.println("互斥量创建失败"); return; } // 互斥量创建成功后再启动子任务 xTaskCreatePinnedToCore(subprocess, "subprocess", 4096, NULL, 1, NULL, 0); } void loop() { if (xSemaphoreTake(xMutex, (portTickType)1000) == pdTRUE) { Serial.println(2 * a + 1); a++; xSemaphoreGive(xMutex); } delay(1000); }
内容的提问来源于stack exchange,提问作者botamochi6277
相关产品推荐
相关产品推荐

