一、问题描述
需求: 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();
}