Arduino esp32 случайно поврежденная переменная
Время от времени моя переменная повреждается. Иногда это происходит несколько раз подряд, а иногда-нет. Я поместил эти журналы, чтобы исключить вмешательство в какие-либо операции. Но, как вы можете видеть, только между одним журналом и другим данные грязные.
Это работает на ESP32 с arduino в качестве фреймворка, и эта процедура исходит из FreeRTOS dequeue.
журнал:
[D][RC_msgRouterProcessCommand.cpp:60] _cloudRXServiceWorker(): Mensaje desencolado:
topic: iot/riego/prueba/valvula/1
payload: {
"controlRemoto": true,
"modulo": 11,
"slot": 1,
"status": 1
}
[D][RC_msgRouterProcessCommand.cpp:61] _cloudRXServiceWorker(): running on core >>>> 0
[D][RC_msgRouterProcessCommand.cpp:62] _cloudRXServiceWorker(): 1 >>>>>>>>>>>>>>>>>>>>>> {
"controlRemoto": true,
"modulo": 11,
"slot": 1,
"status": 1
}
[D][RC_msgRouterProcessCommand.cpp:63] _cloudRXServiceWorker(): 1-1 >>>>>>>>>>>>>>>>>>>>>> {
"controlRemoto": true,
"modulo": 11,
"slot": 1,
"status": 1
}
[D][RC_msgRouterProcessCommand.cpp:64] _cloudRXServiceWorker(): 1-2 >>>>>>>>>>>>>>>>>>>>>> {
"controlRemoto": true,
"modulo": 11,
"slot": 1,
"status": 1
}
[D][RC_msgRouterProcessCommand.cpp:65] _cloudRXServiceWorker(): 1-3 >>>>>>>>>>>>>>>>>>>>>> ��@)�?
[D][RC_msgRouterProcessCommand.cpp:66] _cloudRXServiceWorker(): 1-4 >>>>>>>>>>>>>>>>>>>>>> ��@)�?
[D][RC_msgRouterProcessCommand.cpp:67] _cloudRXServiceWorker(): 1-5 >>>>>>>>>>>>>>>>>>>>>> ��@)�?
[D][RC_msgRouterProcessCommand.cpp:69] _cloudRXServiceWorker(): 2 >>>>>>>>>>>>>>>>>>>>>> ��@)�?
[D][RC_msgRouterProcessCommand.cpp:71] _cloudRXServiceWorker(): 3 >>>>>>>>>>>>>>>>>>>>>> ��@)�?
[D][RC_msgRouterProcessCommand.cpp:72] _cloudRXServiceWorker(): Item count: 5
[D][RC_msgRouterProcessCommand.cpp:73] _cloudRXServiceWorker(): 4 >>>>>>>>>>>>>>>>>>>>>> �^�?
[D][RC_msgRouterProcessCommand.cpp:76] _cloudRXServiceWorker(): Item @ index 0 : iot
[D][RC_msgRouterProcessCommand.cpp:76] _cloudRXServiceWorker(): Item @ index 1 : riego
[D][RC_msgRouterProcessCommand.cpp:76] _cloudRXServiceWorker(): Item @ index 2 : prueba
[D][RC_msgRouterProcessCommand.cpp:76] _cloudRXServiceWorker(): Item @ index 3 : valvula
[D][RC_msgRouterProcessCommand.cpp:76] _cloudRXServiceWorker(): Item @ index 4 : 1
[D][RC_msgRouterProcessCommand.cpp:78] _cloudRXServiceWorker(): 5 >>>>>>>>>>>>>>>>>>>>>> �^�?
[D][RC_msgRouterProcessCommand.cpp:93] _cloudRXServiceWorker(): CASE: RC_HW_TYPE_VALVULA
[D][RC_msgRouterProcessCommand.cpp:94] _cloudRXServiceWorker(): XXXXXXXXXXXXXXXXXXXXXXXXXXX �^�?
[E][RC_msgRouterProcessCommand.cpp:223] _get_valve_typeByPaylod(): _get_valve_typeByPaylod. deserializeJson Json:
�^�?
[E][RC_msgRouterProcessCommand.cpp:228] _get_valve_typeByPaylod(): Fallo la deserializacion del json
[E][RC_msgRouterProcessCommand.cpp:229] _get_valve_typeByPaylod(): Error: InvalidInput
фрагмент кода:
void RC_msgRouter::_cloudRXServiceWorker(){
log_d("iniciando worker cloudRXService running on core >>>> %d",xPortGetCoreID());
msg_t mensaje;
while (true)
{
if(xQueueReceive(QfromCloud, &mensaje , queueSpeed / portTICK_PERIOD_MS)){
log_d("Mensaje desencolado:\n topic: %s\n payload: %s", mensaje.topic,mensaje.payload);
log_d("running on core >>>> %d",xPortGetCoreID());
log_d("1 >>>>>>>>>>>>>>>>>>>>>> %s",mensaje.payload);
log_d("1-1 >>>>>>>>>>>>>>>>>>>>>> %s",mensaje.payload);
log_d("1-2 >>>>>>>>>>>>>>>>>>>>>> %s",mensaje.payload);
log_d("1-3 >>>>>>>>>>>>>>>>>>>>>> %s",mensaje.payload);
log_d("1-4 >>>>>>>>>>>>>>>>>>>>>> %s",mensaje.payload);
log_d("1-5 >>>>>>>>>>>>>>>>>>>>>> %s",mensaje.payload);
StringSplitter *splitter = new StringSplitter(mensaje.topic, '/', -1); // new StringSplitter(string_to_split, delimiter, limit)
log_d("2 >>>>>>>>>>>>>>>>>>>>>> %s",mensaje.payload);
int itemCount = splitter->getItemCount();
log_d("3 >>>>>>>>>>>>>>>>>>>>>> %s",mensaje.payload);
log_d("Item count: %d", itemCount);
log_d("4 >>>>>>>>>>>>>>>>>>>>>> %s",mensaje.payload);
for(int i = 0; i < itemCount; i++){
String item = splitter->getItemAtIndex(i);
log_d("Item @ index %d : %s", i,item);
}
log_d("5 >>>>>>>>>>>>>>>>>>>>>> %s",mensaje.payload);
@Diego Serrano, 👍0
Обсуждение1 ответ
Лучший ответ:
▲ 2
Проблема заключалась в том, что задача с более высоким приоритетом прерывала процесс. Я увеличил приоритет этой задачи, и проблема решена.
xTaskCreatePinnedToCore(_cloudRXServiceTask, "_cloudRXServiceTask", 2048, this, 20, &_cloudRXServiceWorker_handle,0);
,
@Diego Serrano
Смотрите также:
- esp32 Stack canary watchpoint срабатывает
- Почему функция server.on() из "ESPAsyncWebServer.h" выполняется на стороне setup(), а не на стороне loop()?
- ESP32 отправляет данные на другой ESP32 без установления соединения Wi-Fi
- Передача нестатической функции-члена с помощью bind
- Увеличить частоту дискретизации на плате ESP32
- Отправить только один пакет с одного ESP32 на другой ESP32 без подтверждения
- Использование лямбд в качестве функций обратного вызова
- Каков наилучший способ преобразования std::string в строку?
Скорее всего, в каком-то другом потоке происходит что-то, что повреждает (или даже полностью уничтожает) вашу полезную нагрузку., @Majenko
Thx @Majenko вот в чем была проблема., @Diego Serrano
Надеюсь, вы удалите этот динамически выделенный StringSplitter где-нибудь позже, иначе у него в конечном итоге закончится память. Нужно ли вообще так выделять его? Что-то вроде
StringSplitter splitter { mensaje.topic, '/', -1 };
должно быть просто отлично, и оно управляется автоматически, @KIIV@KIIV Я добавляю delete splitter; Спасибо за ваше предложение., @Diego Serrano