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