diff --git a/core/platform/lf_arduino_support.c b/core/platform/lf_arduino_support.c index 0e5d276f3..3659caa22 100644 --- a/core/platform/lf_arduino_support.c +++ b/core/platform/lf_arduino_support.c @@ -133,14 +133,17 @@ int lf_clock_gettime(instant_t* t) { * nested critical sections. */ int lf_critical_section_enter() { - _lf_num_nested_critical_sections++; - // if (_lf_num_nested_critical_sections++ == 0) { - // // First nested entry into a critical section. - // // If interrupts are not initially enabled, then increment again to prevent - // // TODO: Do we need to check whether the interrupts were enabled to - // // begin with? AFAIK there is no Arduino API for that - // noInterrupts(); - // } + if (_lf_num_nested_critical_sections++ == 0) { + // First nested entry into a critical section. + // If interrupts are not initially enabled, then increment again to prevent + // TODO: Do we need to check whether the interrupts were enabled to + // begin with? AFAIK there is no Arduino API for that + #if BOARD==MBED + core_util_critical_section_enter(); //MBED Boards use an RTOS, so we use a specific call to enter a critical section. + #else + noInterrupts(); + #endif + } return 0; } @@ -158,10 +161,13 @@ int lf_critical_section_exit() { if (_lf_num_nested_critical_sections <= 0) { return 1; } - // if (--_lf_num_nested_critical_sections == 0) { - // interrupts(); - // } - --_lf_num_nested_critical_sections; + if (--_lf_num_nested_critical_sections == 0) { + #if BOARD==MBED + core_util_critical_section_exit(); //MBED Boards use an RTOS, so we use a specific call to exit a critical section. + #else + interrupts(); + #endif + } return 0; } diff --git a/include/core/platform/lf_arduino_support.h b/include/core/platform/lf_arduino_support.h index a8a7f9e8a..ea3986ef5 100644 --- a/include/core/platform/lf_arduino_support.h +++ b/include/core/platform/lf_arduino_support.h @@ -36,57 +36,65 @@ THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include // For CLOCK_MONOTONIC #include +#define AVR 0 +#define megaAVR 1 +#define SAMD 2 +#define SAM 3 +#define MBED 4 + #ifndef BOARD -#if defined(ARDUINO_AVR_ADK) - #define BOARD "Mega Adk" +#if defined(ARDUINO_AVR_ADK) + #define BOARD AVR #elif defined(ARDUINO_AVR_BT) // Bluetooth - #define BOARD "Bt" -#elif defined(ARDUINO_AVR_DUEMILANOVE) - #define BOARD "Duemilanove" -#elif defined(ARDUINO_AVR_ESPLORA) - #define BOARD "Esplora" -#elif defined(ARDUINO_AVR_ETHERNET) - #define BOARD "Ethernet" -#elif defined(ARDUINO_AVR_FIO) - #define BOARD "Fio" + #define BOARD AVR +#elif defined(ARDUINO_AVR_DUEMILANOVE) + #define BOARD AVR +#elif defined(ARDUINO_AVR_ESPLORA) + #define BOARD AVR +#elif defined(ARDUINO_AVR_ETHERNET) + #define BOARD AVR +#elif defined(ARDUINO_AVR_FIO) + #define BOARD AVR #elif defined(ARDUINO_AVR_GEMMA) - #define BOARD "Gemma" -#elif defined(ARDUINO_AVR_LEONARDO) - #define BOARD "Leonardo" + #define BOARD AVR +#elif defined(ARDUINO_AVR_LEONARDO) + #define BOARD AVR #elif defined(ARDUINO_AVR_LILYPAD) - #define BOARD "Lilypad" + #define BOARD AVR #elif defined(ARDUINO_AVR_LILYPAD_USB) - #define BOARD "Lilypad Usb" -#elif defined(ARDUINO_AVR_MEGA) - #define BOARD "Mega" -#elif defined(ARDUINO_AVR_MEGA2560) - #define BOARD "Mega 2560" -#elif defined(ARDUINO_AVR_MICRO) - #define BOARD "Micro" -#elif defined(ARDUINO_AVR_MINI) - #define BOARD "Mini" -#elif defined(ARDUINO_AVR_NANO) - #define BOARD "Nano" -#elif defined(ARDUINO_AVR_NG) - #define BOARD "NG" -#elif defined(ARDUINO_AVR_PRO) - #define BOARD "Pro" -#elif defined(ARDUINO_AVR_ROBOT_CONTROL) - #define BOARD "Robot Ctrl" -#elif defined(ARDUINO_AVR_ROBOT_MOTOR) - #define BOARD "Robot Motor" -#elif defined(ARDUINO_AVR_UNO) || defined(__AVR_ATmega4809__) - #define BOARD "Uno" -#elif defined(ARDUINO_AVR_YUN) - #define BOARD "Yun" + #define BOARD AVR +#elif defined(ARDUINO_AVR_MEGA) + #define BOARD AVR +#elif defined(ARDUINO_AVR_MEGA2560) + #define BOARD AVR +#elif defined(ARDUINO_AVR_MICRO) + #define BOARD AVR +#elif defined(ARDUINO_AVR_MINI) + #define BOARD AVR +#elif defined(ARDUINO_AVR_NANO) + #define BOARD AVR +#elif defined(ARDUINO_AVR_NG) + #define BOARD AVR +#elif defined(ARDUINO_AVR_PRO) + #define BOARD AVR +#elif defined(ARDUINO_AVR_ROBOT_CONTROL) + #define BOARD AVR +#elif defined(ARDUINO_AVR_ROBOT_MOTOR) + #define BOARD AVR +#elif defined(ARDUINO_AVR_UNO) || defined(__AVR_ATmega4809__) + #define BOARD AVR +#elif defined(ARDUINO_AVR_YUN) + #define BOARD AVR // These boards must be installed separately: -#elif defined(ARDUINO_SAM_DUE) - #define BOARD "Due" -#elif defined(ARDUINO_SAMD_ZERO) - #define BOARD "Zero" -#elif defined(ARDUINO_ARC32_TOOLS) - #define BOARD "101" +#elif defined(ARDUINO_SAM_DUE) + #define BOARD SAM +#elif defined(ARDUINO_SAMD_ZERO) + #define BOARD SAMD +#elif defined(ARDUINO_ARC32_TOOLS) + #define BOARD SAM +#elif defined(ARDUINO_ARDUINO_NANO33BLE) + #define BOARD MBED #endif #endif