From 07d4ac63e5be5030bef59bbde26d0c7b9ae9d41b Mon Sep 17 00:00:00 2001 From: Anirudh Rengarajan <44007330+arengarajan99@users.noreply.github.com> Date: Fri, 13 Jan 2023 12:07:01 -0800 Subject: [PATCH 1/6] Added preliminary multi-boardtype support for Arduino Different Arduino boards have different infrastructures, which requires us to determine what board type we are flashing to (AVR, SAM, SAMD, megaAVR, or MBED). Currently, the only change we need to make on reactor-c is ensuring MBED boards have a different call for disabling and enabling interrupts. --- core/platform/lf_arduino_support.c | 22 ++--- include/core/platform/lf_arduino_support.h | 96 ++++++++++++---------- 2 files changed, 64 insertions(+), 54 deletions(-) diff --git a/core/platform/lf_arduino_support.c b/core/platform/lf_arduino_support.c index a652638a5..32dd772c4 100644 --- a/core/platform/lf_arduino_support.c +++ b/core/platform/lf_arduino_support.c @@ -134,13 +134,14 @@ int lf_clock_gettime(instant_t* t) { */ 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 interrupts(); + } return 0; } @@ -158,9 +159,10 @@ int lf_critical_section_exit() { if (_lf_num_nested_critical_sections <= 0) { return 1; } - // if (--_lf_num_nested_critical_sections == 0) { - // interrupts(); - // } + 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(); + } --_lf_num_nested_critical_sections; return 0; } diff --git a/include/core/platform/lf_arduino_support.h b/include/core/platform/lf_arduino_support.h index a8a7f9e8a..f294527e5 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" -#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" -#elif defined(ARDUINO_AVR_GEMMA) - #define BOARD "Gemma" -#elif defined(ARDUINO_AVR_LEONARDO) - #define BOARD "Leonardo" -#elif defined(ARDUINO_AVR_LILYPAD) - #define BOARD "Lilypad" -#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_BT) // Bluetooth + #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 AVR +#elif defined(ARDUINO_AVR_LEONARDO) + #define BOARD AVR +#elif defined(ARDUINO_AVR_LILYPAD) + #define BOARD AVR +#elif defined(ARDUINO_AVR_LILYPAD_USB) + #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" + #define BOARD SAM #elif defined(ARDUINO_SAMD_ZERO) - #define BOARD "Zero" + #define BOARD SAMD #elif defined(ARDUINO_ARC32_TOOLS) - #define BOARD "101" + #define BOARD SAM +#elif defined(ARDUINO_ARDUINO_NANO33BLE) + #define BOARD MBED #endif #endif From 3baa0cde9a666b680caaec299f69751e3832c1d3 Mon Sep 17 00:00:00 2001 From: Anirudh Rengarajan <44007330+arengarajan99@users.noreply.github.com> Date: Fri, 13 Jan 2023 12:10:42 -0800 Subject: [PATCH 2/6] Fixed bug that always enabled interrupts. --- core/platform/lf_arduino_support.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/platform/lf_arduino_support.c b/core/platform/lf_arduino_support.c index 32dd772c4..fe3cd06ed 100644 --- a/core/platform/lf_arduino_support.c +++ b/core/platform/lf_arduino_support.c @@ -140,7 +140,7 @@ int lf_critical_section_enter() { // 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 interrupts(); + else noInterrupts(); } return 0; } From bac6fa99ca2be078ab913b05b0c9c556399b38c0 Mon Sep 17 00:00:00 2001 From: Anirudh Rengarajan <44007330+arengarajan99@users.noreply.github.com> Date: Fri, 13 Jan 2023 12:24:04 -0800 Subject: [PATCH 3/6] Changed If statements to preprocessor directives to prevent api calls from failing to compile --- core/platform/lf_arduino_support.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/core/platform/lf_arduino_support.c b/core/platform/lf_arduino_support.c index fe3cd06ed..45c828cc3 100644 --- a/core/platform/lf_arduino_support.c +++ b/core/platform/lf_arduino_support.c @@ -139,8 +139,11 @@ int lf_critical_section_enter() { // 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(); + #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; } @@ -160,8 +163,11 @@ int lf_critical_section_exit() { return 1; } 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(); + #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 } --_lf_num_nested_critical_sections; return 0; From a7ef3a495337b13c14ac3cda048dac057323cddf Mon Sep 17 00:00:00 2001 From: Anirudh Rengarajan <44007330+arengarajan99@users.noreply.github.com> Date: Fri, 13 Jan 2023 14:49:36 -0800 Subject: [PATCH 4/6] Changed define lookup from ARDUINO to PLATFORM_ARDUINO --- core/reactor_common.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/reactor_common.c b/core/reactor_common.c index 8ed74c2b9..fe9e49589 100644 --- a/core/reactor_common.c +++ b/core/reactor_common.c @@ -1925,7 +1925,7 @@ int process_args(int argc, const char* argv[]) { const char* units = argv[i++]; - #if defined(ARDUINO) + #if defined(PLATFORM_ARDUINO) duration = atol(time_spec); #else duration = atoll(time_spec); From e5173a7be8dcd596b243067f099649488bcebb6d Mon Sep 17 00:00:00 2001 From: Anirudh Rengarajan <44007330+arengarajan99@users.noreply.github.com> Date: Tue, 24 Jan 2023 08:20:20 -0800 Subject: [PATCH 5/6] Remove white space from header file --- include/core/platform/lf_arduino_support.h | 48 +++++++++++----------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/include/core/platform/lf_arduino_support.h b/include/core/platform/lf_arduino_support.h index f294527e5..ea3986ef5 100644 --- a/include/core/platform/lf_arduino_support.h +++ b/include/core/platform/lf_arduino_support.h @@ -43,55 +43,55 @@ THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define MBED 4 #ifndef BOARD -#if defined(ARDUINO_AVR_ADK) +#if defined(ARDUINO_AVR_ADK) #define BOARD AVR -#elif defined(ARDUINO_AVR_BT) // Bluetooth +#elif defined(ARDUINO_AVR_BT) // Bluetooth #define BOARD AVR -#elif defined(ARDUINO_AVR_DUEMILANOVE) +#elif defined(ARDUINO_AVR_DUEMILANOVE) #define BOARD AVR -#elif defined(ARDUINO_AVR_ESPLORA) +#elif defined(ARDUINO_AVR_ESPLORA) #define BOARD AVR -#elif defined(ARDUINO_AVR_ETHERNET) +#elif defined(ARDUINO_AVR_ETHERNET) #define BOARD AVR -#elif defined(ARDUINO_AVR_FIO) +#elif defined(ARDUINO_AVR_FIO) #define BOARD AVR -#elif defined(ARDUINO_AVR_GEMMA) +#elif defined(ARDUINO_AVR_GEMMA) #define BOARD AVR -#elif defined(ARDUINO_AVR_LEONARDO) +#elif defined(ARDUINO_AVR_LEONARDO) #define BOARD AVR -#elif defined(ARDUINO_AVR_LILYPAD) +#elif defined(ARDUINO_AVR_LILYPAD) #define BOARD AVR -#elif defined(ARDUINO_AVR_LILYPAD_USB) +#elif defined(ARDUINO_AVR_LILYPAD_USB) #define BOARD AVR -#elif defined(ARDUINO_AVR_MEGA) +#elif defined(ARDUINO_AVR_MEGA) #define BOARD AVR -#elif defined(ARDUINO_AVR_MEGA2560) +#elif defined(ARDUINO_AVR_MEGA2560) #define BOARD AVR -#elif defined(ARDUINO_AVR_MICRO) +#elif defined(ARDUINO_AVR_MICRO) #define BOARD AVR -#elif defined(ARDUINO_AVR_MINI) +#elif defined(ARDUINO_AVR_MINI) #define BOARD AVR -#elif defined(ARDUINO_AVR_NANO) +#elif defined(ARDUINO_AVR_NANO) #define BOARD AVR -#elif defined(ARDUINO_AVR_NG) +#elif defined(ARDUINO_AVR_NG) #define BOARD AVR -#elif defined(ARDUINO_AVR_PRO) +#elif defined(ARDUINO_AVR_PRO) #define BOARD AVR -#elif defined(ARDUINO_AVR_ROBOT_CONTROL) +#elif defined(ARDUINO_AVR_ROBOT_CONTROL) #define BOARD AVR -#elif defined(ARDUINO_AVR_ROBOT_MOTOR) +#elif defined(ARDUINO_AVR_ROBOT_MOTOR) #define BOARD AVR -#elif defined(ARDUINO_AVR_UNO) || defined(__AVR_ATmega4809__) +#elif defined(ARDUINO_AVR_UNO) || defined(__AVR_ATmega4809__) #define BOARD AVR -#elif defined(ARDUINO_AVR_YUN) +#elif defined(ARDUINO_AVR_YUN) #define BOARD AVR // These boards must be installed separately: -#elif defined(ARDUINO_SAM_DUE) +#elif defined(ARDUINO_SAM_DUE) #define BOARD SAM -#elif defined(ARDUINO_SAMD_ZERO) +#elif defined(ARDUINO_SAMD_ZERO) #define BOARD SAMD -#elif defined(ARDUINO_ARC32_TOOLS) +#elif defined(ARDUINO_ARC32_TOOLS) #define BOARD SAM #elif defined(ARDUINO_ARDUINO_NANO33BLE) #define BOARD MBED From 085f9c4ab3a4da6c064b56a8d16cef09a904eb91 Mon Sep 17 00:00:00 2001 From: Anirudh Rengarajan <44007330+arengarajan99@users.noreply.github.com> Date: Tue, 24 Jan 2023 08:21:36 -0800 Subject: [PATCH 6/6] Removed artifact code lines from when interrupts were disabled. --- core/platform/lf_arduino_support.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/core/platform/lf_arduino_support.c b/core/platform/lf_arduino_support.c index 48d57fc3c..3659caa22 100644 --- a/core/platform/lf_arduino_support.c +++ b/core/platform/lf_arduino_support.c @@ -133,7 +133,6 @@ 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 @@ -169,7 +168,6 @@ int lf_critical_section_exit() { interrupts(); #endif } - --_lf_num_nested_critical_sections; return 0; }