From 72cd4360024470447725aebb3018d583aea2468e Mon Sep 17 00:00:00 2001 From: Alvin Lee Date: Tue, 7 Nov 2017 15:39:22 +0800 Subject: [PATCH 1/3] patch for mbed-os issue#4686 --- drivers/Serial.cpp | 35 +++++++++++++++++++++++++++++++++-- drivers/Serial.h | 2 ++ drivers/SerialBase.cpp | 6 ++++-- 3 files changed, 39 insertions(+), 4 deletions(-) diff --git a/drivers/Serial.cpp b/drivers/Serial.cpp index 8e3ce518a53..2264bd3c411 100644 --- a/drivers/Serial.cpp +++ b/drivers/Serial.cpp @@ -15,6 +15,7 @@ */ #include "drivers/Serial.h" #include "platform/mbed_wait_api.h" +#include "platform/mbed_critical.h" #if DEVICE_SERIAL @@ -36,12 +37,42 @@ int Serial::_putc(int c) { return _base_putc(c); } +int Serial::getc() { + // Mutex is already held + if(!core_util_is_isr_active()) + { + return Stream::getc(); + } + else + { + return _base_getc(); + } +} + +int Serial::putc(int c) { + // Mutex is already held + if(!core_util_is_isr_active()) + { + return Stream::putc(c); + } + else + { + return _base_putc(c); + } +} + void Serial::lock() { - _mutex.lock(); + if(!core_util_is_isr_active()) + { + _mutex.lock(); + } } void Serial::unlock() { - _mutex.unlock(); + if(!core_util_is_isr_active()) + { + _mutex.unlock(); + } } } // namespace mbed diff --git a/drivers/Serial.h b/drivers/Serial.h index 549943a47c0..372e4b364d1 100644 --- a/drivers/Serial.h +++ b/drivers/Serial.h @@ -98,6 +98,8 @@ class Serial : public SerialBase, public Stream, private NonCopyable { { return SerialBase::writeable(); } + virtual int getc(); + virtual int putc(int c); protected: virtual int _getc(); diff --git a/drivers/SerialBase.cpp b/drivers/SerialBase.cpp index 5ec47ff83a6..70533e4392d 100644 --- a/drivers/SerialBase.cpp +++ b/drivers/SerialBase.cpp @@ -55,7 +55,8 @@ void SerialBase::format(int bits, Parity parity, int stop_bits) { int SerialBase::readable() { lock(); - int ret = serial_readable(&_serial); + int ret = 0; + ret = serial_readable(&_serial); unlock(); return ret; } @@ -63,7 +64,8 @@ int SerialBase::readable() { int SerialBase::writeable() { lock(); - int ret = serial_writable(&_serial); + int ret = 0; + ret = serial_writable(&_serial); unlock(); return ret; } From 231edebe8ac726e23dba1a06632aa62bf283d3f8 Mon Sep 17 00:00:00 2001 From: Alvin Lee Date: Tue, 7 Nov 2017 15:50:29 +0800 Subject: [PATCH 2/3] refining header --- drivers/Serial.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/Serial.h b/drivers/Serial.h index 372e4b364d1..296b4b69aea 100644 --- a/drivers/Serial.h +++ b/drivers/Serial.h @@ -98,8 +98,8 @@ class Serial : public SerialBase, public Stream, private NonCopyable { { return SerialBase::writeable(); } - virtual int getc(); - virtual int putc(int c); + int getc(); + int putc(int c); protected: virtual int _getc(); From fbffdd2a7cfd283ea4f61b19354891ada69259f8 Mon Sep 17 00:00:00 2001 From: Alvin Lee Date: Tue, 7 Nov 2017 16:30:20 +0800 Subject: [PATCH 3/3] refine padding --- drivers/Serial.cpp | 2 +- drivers/SerialBase.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/Serial.cpp b/drivers/Serial.cpp index 2264bd3c411..7f0dcab8229 100644 --- a/drivers/Serial.cpp +++ b/drivers/Serial.cpp @@ -57,7 +57,7 @@ int Serial::putc(int c) { } else { - return _base_putc(c); + return _base_putc(c); } } diff --git a/drivers/SerialBase.cpp b/drivers/SerialBase.cpp index 70533e4392d..ee0a2279b64 100644 --- a/drivers/SerialBase.cpp +++ b/drivers/SerialBase.cpp @@ -56,7 +56,7 @@ void SerialBase::format(int bits, Parity parity, int stop_bits) { int SerialBase::readable() { lock(); int ret = 0; - ret = serial_readable(&_serial); + ret = serial_readable(&_serial); unlock(); return ret; } @@ -65,7 +65,7 @@ int SerialBase::readable() { int SerialBase::writeable() { lock(); int ret = 0; - ret = serial_writable(&_serial); + ret = serial_writable(&_serial); unlock(); return ret; }