]> granicus.if.org Git - esp-idf/commitdiff
freemodbus: change critical sections to semaphore mutex
authoraleks <aleks@espressif.com>
Thu, 7 Mar 2019 08:51:25 +0000 (09:51 +0100)
committeraleks <aleks@espressif.com>
Thu, 7 Mar 2019 08:59:40 +0000 (09:59 +0100)
revert changes made in mbrtu.c, mbascii.c
change critical section type to semaphore mutex instead of spin lock

Closes: https://github.com/espressif/esp-idf/issues/3009
components/freemodbus/modbus/ascii/mbascii.c
components/freemodbus/modbus/rtu/mbrtu.c
components/freemodbus/port/port.h
components/freemodbus/port/portother.c
components/freemodbus/port/portserial.c

index 55490903caa990d7b747199e16ef546340ad825e..c513457eae2c49e93cab683b3e4db720d54d2228 100644 (file)
@@ -110,6 +110,7 @@ eMBASCIIInit( UCHAR ucSlaveAddress, UCHAR ucPort, ULONG ulBaudRate, eMBParity eP
     eMBErrorCode    eStatus = MB_ENOERR;
     ( void )ucSlaveAddress;
     
+    ENTER_CRITICAL_SECTION(  );
     ucMBLFCharacter = MB_ASCII_DEFAULT_LF;
 
     if( xMBPortSerialInit( ucPort, ulBaudRate, 7, eParity ) != TRUE )
@@ -121,6 +122,7 @@ eMBASCIIInit( UCHAR ucSlaveAddress, UCHAR ucPort, ULONG ulBaudRate, eMBParity eP
         eStatus = MB_EPORTERR;
     }
 
+    EXIT_CRITICAL_SECTION(  );
 
     return eStatus;
 }
@@ -128,8 +130,10 @@ eMBASCIIInit( UCHAR ucSlaveAddress, UCHAR ucPort, ULONG ulBaudRate, eMBParity eP
 void
 eMBASCIIStart( void )
 {
+    ENTER_CRITICAL_SECTION(  );
     vMBPortSerialEnable( TRUE, FALSE );
     eRcvState = STATE_RX_IDLE;
+    EXIT_CRITICAL_SECTION(  );
 
     /* No special startup required for ASCII. */
     ( void )xMBPortEventPost( EV_READY );
@@ -138,8 +142,10 @@ eMBASCIIStart( void )
 void
 eMBASCIIStop( void )
 {
+    ENTER_CRITICAL_SECTION(  );
     vMBPortSerialEnable( FALSE, FALSE );
     vMBPortTimersDisable(  );
+    EXIT_CRITICAL_SECTION(  );
 }
 
 eMBErrorCode
index b0b84deb033a93e581fe2bd08bc3182b9124780e..28bd29622457ce0b86094fd34e3838224ae07479 100644 (file)
@@ -84,6 +84,7 @@ eMBRTUInit( UCHAR ucSlaveAddress, UCHAR ucPort, ULONG ulBaudRate, eMBParity ePar
     ULONG           usTimerT35_50us;
 
     ( void )ucSlaveAddress;
+    ENTER_CRITICAL_SECTION(  );
 
     /* Modbus RTU uses 8 Databits. */
     if( xMBPortSerialInit( ucPort, ulBaudRate, 8, eParity ) != TRUE )
@@ -116,6 +117,7 @@ eMBRTUInit( UCHAR ucSlaveAddress, UCHAR ucPort, ULONG ulBaudRate, eMBParity ePar
             eStatus = MB_EPORTERR;
         }
     }
+    EXIT_CRITICAL_SECTION(  );
 
     return eStatus;
 }
@@ -123,6 +125,7 @@ eMBRTUInit( UCHAR ucSlaveAddress, UCHAR ucPort, ULONG ulBaudRate, eMBParity ePar
 void
 eMBRTUStart( void )
 {
+    ENTER_CRITICAL_SECTION(  );
     /* Initially the receiver is in the state STATE_RX_INIT. we start
      * the timer and if no character is received within t3.5 we change
      * to STATE_RX_IDLE. This makes sure that we delay startup of the
@@ -132,13 +135,16 @@ eMBRTUStart( void )
     vMBPortSerialEnable( TRUE, FALSE );
     vMBPortTimersEnable(  );
 
+    EXIT_CRITICAL_SECTION(  );
 }
 
 void
 eMBRTUStop( void )
 {
+    ENTER_CRITICAL_SECTION(  );
     vMBPortSerialEnable( FALSE, FALSE );
     vMBPortTimersDisable(  );
+    EXIT_CRITICAL_SECTION(  );
 }
 
 // The lines below are required to suppress GCC warnings about unused but set variable 'xFrameReceived'
index c7965a1f23420d43c379fdfaf976a539646b3a60..0d8173a6543fbcc3cb0a8dd122caa4abe6b48946 100644 (file)
 #define MB_ENTER_CRITICAL(mux)      portENTER_CRITICAL(mux)
 #define MB_EXIT_CRITICAL(mux)       portEXIT_CRITICAL(mux)
 
-#define ENTER_CRITICAL_SECTION( )   ( vMBPortEnterCritical() )
-#define EXIT_CRITICAL_SECTION( )    ( vMBPortExitCritical() )
+#define ENTER_CRITICAL_SECTION( ) { ESP_LOGD(MB_PORT_TAG,"%s: Port enter critical.", __func__); \
+                                    vMBPortEnterCritical(); }
+
+#define EXIT_CRITICAL_SECTION( )  { vMBPortExitCritical(); \
+                                    ESP_LOGD(MB_PORT_TAG,"%s: Port exit critical", __func__); }
 
 typedef char    BOOL;
 
index e4b90e64c074f608d32637d1083f90fa6c7bea89..a789545598beaff5e1c5454bdf60b4d07dc47fab 100644 (file)
 #include <stdlib.h>
 #include <freertos/FreeRTOS.h>
 #include <freertos/task.h>
-#include <freertos/semphr.h>
 
 /* ----------------------- Modbus includes ----------------------------------*/
 #include "mb.h"
 #include "mbport.h"
+#include "sys/lock.h"
 
 /* ----------------------- Modbus includes ----------------------------------*/
 
 /* ----------------------- Variables ----------------------------------------*/
-static portMUX_TYPE mb_mutex = portMUX_INITIALIZER_UNLOCKED;
+static _lock_t s_port_lock;
 
 /* ----------------------- Start implementation -----------------------------*/
 
@@ -52,16 +52,16 @@ bMBPortIsWithinException( void )
     return bIsWithinException;
 }
 
-void
+inline void
 vMBPortEnterCritical( void )
 {
-    portENTER_CRITICAL(&mb_mutex);
+    _lock_acquire(&s_port_lock);
 }
 
-void
+inline void
 vMBPortExitCritical( void )
 {
-    portEXIT_CRITICAL(&mb_mutex);
+    _lock_release(&s_port_lock);
 }
 
 void
index 3543135ee3deaf1009f810c43e3e2af15f2cca8b..dee5fdd365e86dd990f72334e099e04506382993 100644 (file)
@@ -74,7 +74,6 @@ static USHORT uiRxBufferPos = 0;    // position in the receiver buffer
 void vMBPortSerialEnable(BOOL bRxEnable, BOOL bTxEnable)
 {
     // This function can be called from xMBRTUTransmitFSM() of different task
-    ENTER_CRITICAL_SECTION();
     if (bRxEnable) {
         //uart_enable_rx_intr(ucUartNumber);
         bRxStateEnabled = TRUE;
@@ -88,7 +87,6 @@ void vMBPortSerialEnable(BOOL bRxEnable, BOOL bTxEnable)
     } else {
         bTxStateEnabled = FALSE;
     }
-    EXIT_CRITICAL_SECTION();
 }
 
 static void vMBPortSerialRxPoll(size_t xEventSize)