From 7342811c373ab7732614d5067bcfad087de96d13 Mon Sep 17 00:00:00 2001 From: aleks Date: Thu, 7 Mar 2019 09:51:25 +0100 Subject: [PATCH] freemodbus: change critical sections to semaphore mutex 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/port/port.h | 7 +++++-- components/freemodbus/port/portother.c | 12 ++++++------ components/freemodbus/port/portserial.c | 2 -- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/components/freemodbus/port/port.h b/components/freemodbus/port/port.h index c7965a1f23..0d8173a654 100644 --- a/components/freemodbus/port/port.h +++ b/components/freemodbus/port/port.h @@ -60,8 +60,11 @@ #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; diff --git a/components/freemodbus/port/portother.c b/components/freemodbus/port/portother.c index e4b90e64c0..a789545598 100644 --- a/components/freemodbus/port/portother.c +++ b/components/freemodbus/port/portother.c @@ -32,16 +32,16 @@ #include #include #include -#include /* ----------------------- 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 diff --git a/components/freemodbus/port/portserial.c b/components/freemodbus/port/portserial.c index 3543135ee3..dee5fdd365 100644 --- a/components/freemodbus/port/portserial.c +++ b/components/freemodbus/port/portserial.c @@ -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)