一、问题描述
需求: ESP32S3单片机,连接一个麦克风读取5s后,编码后发送到百度云进行语音识别。通过freertos框架,将任务放在核1中运行(放在核0同样报错)
问题: 在最后的发送语音数据中,ESP32崩溃重启,显示错误Guru Meditation Error: Core 1 panic’ed (Double exception).
尝试解决: 将任务放在loop()中运行,而不是通过freertos的task运行,可以正常运行。
二、问题解决
- 放在loop()中运行
- 增加task的任务栈空间大小,从原来的2048增加到20480之后可以正常运行了
三、扩展
后续想要将录音时间增加并发送,例如增加到10s,此时放在loop中也无法运行了。报错如下,怀疑可能式内存不够了。
Guru Meditation Error: Core 1 panic'ed (Interrupt wdt timeout on CPU1).
四、相关代码
void speech_recognition_send()
{assembleJson(token);sendToSTT(); // 这一部分中更长的录音时间会导致需要的任务栈空间增加,导致任务崩溃Serial.println("Recognition complete");
}void assembleJson(String token)
{memset(data_json, '\0', data_json_len * sizeof(char));strcat(data_json, "{");strcat(data_json, "\"format\":\"pcm\",");strcat(data_json, "\"rate\":16000,");strcat(data_json, "\"channel\":1,");strcat(data_json, "\"cuid\":\"577200\",");strcat(data_json, "\"token\":\"");strcat(data_json, token.c_str());strcat(data_json, "\",");sprintf(data_json + strlen(data_json), "\"len\":%d,", adc_data_len * 2);strcat(data_json, "\"speech\":\"");strcat(data_json, base64::encode((uint8_t *)adc_data, adc_data_len * sizeof(uint16_t)).c_str());strcat(data_json, "\"");strcat(data_json, "}");// 显示长度Serial.println(strlen(data_json));// 显示JSON数据的前面部分// Serial.println(data_json);
}void sendToSTT()
{// 以下部分会受录音长度影响,超过5s很可能导致内存崩溃重启int httpCode;http_client.begin("http://vop.baidu.com/server_api");http_client.addHeader("Content-Type", "application/json");// http_client.addHeader("Accept", "application/json");httpCode = http_client.POST(data_json);if (httpCode > 0){if (httpCode == HTTP_CODE_OK){String payload = http_client.getString();Serial.println(payload);}}else{Serial.printf("[HTTP] POST failed, error: %s\n", http_client.errorToString(httpCode).c_str());}http_client.end();
}