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);

, 👍0

Обсуждение

Скорее всего, в каком-то другом потоке происходит что-то, что повреждает (или даже полностью уничтожает) вашу полезную нагрузку., @Majenko

Thx @Majenko вот в чем была проблема., @Diego Serrano

Надеюсь, вы удалите этот динамически выделенный StringSplitter где-нибудь позже, иначе у него в конечном итоге закончится память. Нужно ли вообще так выделять его? Что-то вроде StringSplitter splitter { mensaje.topic, '/', -1 }; должно быть просто отлично, и оно управляется автоматически, @KIIV

@KIIV Я добавляю delete splitter; Спасибо за ваше предложение., @Diego Serrano


1 ответ


Лучший ответ:

2

Проблема заключалась в том, что задача с более высоким приоритетом прерывала процесс. Я увеличил приоритет этой задачи, и проблема решена.

xTaskCreatePinnedToCore(_cloudRXServiceTask, "_cloudRXServiceTask", 2048, this, 20, &_cloudRXServiceWorker_handle,0);
,