Browse Source

freemodbus: fix event processing failure after destroy

Closes https://github.com/espressif/esp-idf/issues/5275
aleks 5 years ago
parent
commit
07bfb7cac9
1 changed files with 7 additions and 2 deletions
  1. 7 2
      components/freemodbus/port/portevent_m.c

+ 7 - 2
components/freemodbus/port/portevent_m.c

@@ -252,7 +252,7 @@ eMBMasterReqErrCode eMBMasterWaitRequestFinish( void ) {
                                                 MB_EVENT_REQ_MASK,  // The bits within the event group to wait for.
                                                 pdTRUE,             // Masked bits should be cleared before returning.
                                                 pdFALSE,            // Don't wait for both bits, either bit will do.
-                                                1000 );             // Wait forever for either bit to be set. //portMAX_DELAY
+                                                portMAX_DELAY );    // Wait forever for either bit to be set.
     xRecvedEvent = (eMBMasterEventType)(uxBits);
     if (xRecvedEvent) {
         ESP_LOGD(MB_PORT_TAG,"%s: returned event = 0x%x", __func__, xRecvedEvent);
@@ -271,7 +271,12 @@ eMBMasterReqErrCode eMBMasterWaitRequestFinish( void ) {
         }
     } else {
         ESP_LOGE(MB_PORT_TAG,"%s: Incorrect event or timeout xRecvedEvent = 0x%x", __func__, uxBits);
-        assert(0);
+        // https://github.com/espressif/esp-idf/issues/5275
+        // if a no event is received, that means vMBMasterPortEventClose()
+        // has been closed, so event group has been deleted by FreeRTOS, which
+        // triggers the send of 0 value to the event group to unlock this task
+        // waiting on it. For this patch, handles it as a time out without assert.
+        eErrStatus = MB_MRE_TIMEDOUT;
     }
     return eErrStatus;
 }