Просмотр исходного кода

freemodbus: fix issues when modbus master and slave work simultaneously (backport v4.3)

Alex Lisitsyn 4 лет назад
Родитель
Сommit
4f716817e0

+ 20 - 5
components/freemodbus/Kconfig

@@ -187,25 +187,40 @@ menu "Modbus configuration"
                 Modbus stack event processing time.
 
     config FMB_TIMER_PORT_ENABLED
-        bool "Modbus slave stack use timer for 3.5T symbol time measurement"
+        bool "Modbus stack use timer for 3.5T symbol time measurement"
         default n
         help
                 If this option is set the Modbus stack uses timer for T3.5 time measurement.
                 Else the internal UART TOUT timeout is used for 3.5T symbol time measurement.
 
     config FMB_TIMER_GROUP
-        int "Modbus Timer group number"
+        int "Slave Timer group number"
         range 0 1
         default 0
         help
-                Modbus Timer group number that is used for timeout measurement.
+                Modbus slave Timer group number that is used for timeout measurement.
 
     config FMB_TIMER_INDEX
-        int "Modbus Timer index in the group"
+        int "Slave Timer index in the group"
         range 0 1
         default 0
         help
-                Modbus Timer Index in the group that is used for timeout measurement.
+                Modbus slave Timer Index in the group that is used for timeout measurement.
+
+    config FMB_MASTER_TIMER_GROUP
+        int "Master Timer group number"
+        range 0 1
+        default FMB_TIMER_GROUP
+        help
+                Modbus master Timer group number that is used for timeout measurement.
+
+    config FMB_MASTER_TIMER_INDEX
+        int "Master Timer index"
+        range 0 1
+        default FMB_TIMER_INDEX
+        help
+                Modbus master Timer Index in the group that is used for timeout measurement.
+                Note: Modbus master and slave should have different timer index to be able to work simultaneously.
 
     config FMB_TIMER_ISR_IN_IRAM
         bool "Place timer interrupt handler into IRAM"

+ 1 - 1
components/freemodbus/modbus/mb.c

@@ -54,7 +54,7 @@
 #endif
 
 #ifndef MB_PORT_HAS_CLOSE
-#define MB_PORT_HAS_CLOSE 0
+#define MB_PORT_HAS_CLOSE 1
 #endif
 
 /* ----------------------- Static variables ---------------------------------*/

+ 2 - 0
components/freemodbus/port/port.h

@@ -61,6 +61,8 @@
 
 #define MB_TCP_FRAME_LOG_BUFSIZE        (256)
 
+#define MB_PORT_HAS_CLOSE               (1) // Define to explicitly close port on destroy
+
 // Define number of timer reloads per 1 mS
 #define MB_TIMER_TICS_PER_MS            (20UL)
 

+ 1 - 2
components/freemodbus/port/porttimer.c

@@ -147,8 +147,7 @@ vMBPortTimersDisable(void)
 void vMBPortTimerClose(void)
 {
 #ifdef CONFIG_FMB_TIMER_PORT_ENABLED
-    ESP_ERROR_CHECK(timer_pause(usTimerGroupIndex, usTimerIndex));
-    ESP_ERROR_CHECK(timer_disable_intr(usTimerGroupIndex, usTimerIndex));
+    ESP_ERROR_CHECK(timer_deinit(usTimerGroupIndex, usTimerIndex));
     ESP_ERROR_CHECK(esp_intr_free(xTimerIntHandle));
 #endif
 }

+ 5 - 9
components/freemodbus/port/porttimer_m.c

@@ -50,16 +50,13 @@
 #define MB_TIMER_DIVIDER        ((TIMER_BASE_CLK / 1000000UL) * MB_TICK_TIME_US - 1) // divider for 50uS
 #define MB_TIMER_WITH_RELOAD    (1)
 
-// Timer group and timer number to measure time (configurable in KConfig)
-#define MB_TIMER_INDEX          (CONFIG_FMB_TIMER_INDEX)
-#define MB_TIMER_GROUP          (CONFIG_FMB_TIMER_GROUP)
-
 /* ----------------------- Variables ----------------------------------------*/
 static USHORT usT35TimeOut50us;
 
-static const USHORT usTimerIndex = MB_TIMER_INDEX;      // Initialize Modbus Timer index used by stack,
-static const USHORT usTimerGroupIndex = MB_TIMER_GROUP; // Timer group index used by stack
-static timer_isr_handle_t xTimerIntHandle;              // Timer interrupt handle
+// Initialize Modbus Timer group and index used by stack
+static const USHORT usTimerIndex = CONFIG_FMB_MASTER_TIMER_INDEX;
+static const USHORT usTimerGroupIndex = CONFIG_FMB_MASTER_TIMER_GROUP;
+static timer_isr_handle_t xTimerIntHandle;  // Timer interrupt handle
 
 /* ----------------------- static functions ---------------------------------*/
 static void IRAM_ATTR vTimerGroupIsr(void *param)
@@ -193,7 +190,6 @@ vMBMasterPortTimersDisable()
 
 void vMBMasterPortTimerClose(void)
 {
-    ESP_ERROR_CHECK(timer_pause(usTimerGroupIndex, usTimerIndex));
-    ESP_ERROR_CHECK(timer_disable_intr(usTimerGroupIndex, usTimerIndex));
+    ESP_ERROR_CHECK(timer_deinit(usTimerGroupIndex, usTimerIndex));
     ESP_ERROR_CHECK(esp_intr_free(xTimerIntHandle));
 }

+ 1 - 1
components/freemodbus/serial_slave/modbus_controller/mbc_serial_slave.c

@@ -173,7 +173,7 @@ static esp_err_t mbc_serial_slave_destroy(void)
     mb_error = eMBClose();
     MB_SLAVE_CHECK((mb_error == MB_ENOERR), ESP_ERR_INVALID_STATE,
             "mb stack close failure returned (0x%x).", (uint32_t)mb_error);
-
+    mbs_interface_ptr = NULL;
     vMBPortSetMode((UCHAR)MB_PORT_INACTIVE);
     return ESP_OK;
 }