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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 09:45:04