From 5c8c68f98b680cd28d1de34ae9c0ea117783a215 Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Sun, 21 Apr 2019 01:35:32 +0200 Subject: [PATCH 01/14] - attachInterrupt and detachInterrupt don't require ICACHE_RAM_ATTR. - fix incorrect handling of non-"functional" interrupt handlers. - complete and expose attachInterruptArg(). --- cores/esp8266/Arduino.h | 1 + cores/esp8266/FunctionalInterrupt.cpp | 6 +-- cores/esp8266/core_esp8266_wiring_digital.cpp | 47 +++++++++++-------- 3 files changed, 32 insertions(+), 22 deletions(-) diff --git a/cores/esp8266/Arduino.h b/cores/esp8266/Arduino.h index 34e5fb8fce..91ef7a43f1 100644 --- a/cores/esp8266/Arduino.h +++ b/cores/esp8266/Arduino.h @@ -217,6 +217,7 @@ void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val); uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder); void attachInterrupt(uint8_t pin, void (*)(void), int mode); +void attachInterruptArg(uint8_t pin, void (*)(void*), void * arg, int mode); void detachInterrupt(uint8_t pin); void preinit(void); diff --git a/cores/esp8266/FunctionalInterrupt.cpp b/cores/esp8266/FunctionalInterrupt.cpp index 2633c63182..ec09788a85 100644 --- a/cores/esp8266/FunctionalInterrupt.cpp +++ b/cores/esp8266/FunctionalInterrupt.cpp @@ -8,7 +8,7 @@ typedef void (*voidFuncPtr)(void); typedef void (*voidFuncPtrArg)(void*); // Helper functions for Functional interrupt routines -extern "C" void ICACHE_RAM_ATTR __attachInterruptArg(uint8_t pin, voidFuncPtr userFunc, void*fp , int mode); +extern "C" void __attachInterruptFunctionalArg(uint8_t pin, voidFuncPtr userFunc, void*fp , int mode, bool functional); void ICACHE_RAM_ATTR interruptFunctional(void* arg) @@ -49,7 +49,7 @@ void attachInterrupt(uint8_t pin, std::function intRoutine, int mode as->interruptInfo = ii; as->functionInfo = fi; - __attachInterruptArg (pin, (voidFuncPtr)interruptFunctional, as, mode); + __attachInterruptFunctionalArg (pin, (voidFuncPtr)interruptFunctional, as, mode, true); } void attachScheduledInterrupt(uint8_t pin, std::function scheduledIntRoutine, int mode) @@ -67,5 +67,5 @@ void attachScheduledInterrupt(uint8_t pin, std::function sc as->interruptInfo = ii; as->functionInfo = fi; - __attachInterruptArg (pin, (voidFuncPtr)interruptFunctional, as, mode); + __attachInterruptFunctionalArg (pin, (voidFuncPtr)interruptFunctional, as, mode, true); } diff --git a/cores/esp8266/core_esp8266_wiring_digital.cpp b/cores/esp8266/core_esp8266_wiring_digital.cpp index 0a8a7252f1..5bf59172fd 100644 --- a/cores/esp8266/core_esp8266_wiring_digital.cpp +++ b/cores/esp8266/core_esp8266_wiring_digital.cpp @@ -109,8 +109,9 @@ typedef void (*voidFuncPtrArg)(void*); typedef struct { uint8_t mode; - void (*fn)(void); - void * arg; + voidFuncPtr fn; + void* arg; + bool functional; } interrupt_handler_t; //duplicate from functionalInterrupt.h keep in sync @@ -125,11 +126,10 @@ typedef struct { void* functionInfo; } ArgStructure; -static interrupt_handler_t interrupt_handlers[16]; +static interrupt_handler_t interrupt_handlers[16] = {0,}; static uint32_t interrupt_reg = 0; void ICACHE_RAM_ATTR interrupt_handler(void *arg) { - (void) arg; uint32_t status = GPIE; GPIEC = status;//clear them interrupts uint32_t levels = GPI; @@ -147,13 +147,16 @@ void ICACHE_RAM_ATTR interrupt_handler(void *arg) { // to make ISR compatible to Arduino AVR model where interrupts are disabled // we disable them before we call the client ISR uint32_t savedPS = xt_rsil(15); // stop other interrupts - ArgStructure* localArg = (ArgStructure*)handler->arg; - if (localArg && localArg->interruptInfo) - { - localArg->interruptInfo->pin = i; - localArg->interruptInfo->value = __digitalRead(i); - localArg->interruptInfo->micro = micros(); - } + if (handler->functional) + { + ArgStructure* localArg = (ArgStructure*)handler->arg; + if (localArg && localArg->interruptInfo) + { + localArg->interruptInfo->pin = i; + localArg->interruptInfo->value = __digitalRead(i); + localArg->interruptInfo->micro = micros(); + } + } if (handler->arg) { ((voidFuncPtrArg)handler->fn)(handler->arg); @@ -170,8 +173,7 @@ void ICACHE_RAM_ATTR interrupt_handler(void *arg) { extern void cleanupFunctional(void* arg); -extern void ICACHE_RAM_ATTR __attachInterruptArg(uint8_t pin, voidFuncPtr userFunc, void *arg, int mode) { - +extern void __attachInterruptFunctionalArg(uint8_t pin, voidFuncPtrArg userFunc, void *arg, int mode, bool functional) { // #5780 // https://github.com/esp8266/esp8266-wiki/wiki/Memory-Map if ((uint32_t)userFunc >= 0x40200000) @@ -185,12 +187,13 @@ extern void ICACHE_RAM_ATTR __attachInterruptArg(uint8_t pin, voidFuncPtr userFu ETS_GPIO_INTR_DISABLE(); interrupt_handler_t *handler = &interrupt_handlers[pin]; handler->mode = mode; - handler->fn = userFunc; - if (handler->arg) // Clean when new attach without detach + handler->fn = (voidFuncPtr)userFunc; + if (handler->functional && handler->arg) // Clean when new attach without detach { cleanupFunctional(handler->arg); } handler->arg = arg; + handler->functional = functional; interrupt_reg |= (1 << pin); GPC(pin) &= ~(0xF << GPCI);//INT mode disabled GPIEC = (1 << pin); //Clear Interrupt for this pin @@ -200,12 +203,16 @@ extern void ICACHE_RAM_ATTR __attachInterruptArg(uint8_t pin, voidFuncPtr userFu } } -extern void ICACHE_RAM_ATTR __attachInterrupt(uint8_t pin, voidFuncPtr userFunc, int mode ) +extern void __attachInterruptArg(uint8_t pin, voidFuncPtrArg userFunc, void * arg, int mode) { - __attachInterruptArg (pin, userFunc, 0, mode); + __attachInterruptFunctionalArg(pin, userFunc, arg, mode, false); +} + +extern void __attachInterrupt(uint8_t pin, voidFuncPtr userFunc, int mode ) { + __attachInterruptFunctionalArg(pin, (voidFuncPtrArg)userFunc, 0, mode, false); } -extern void ICACHE_RAM_ATTR __detachInterrupt(uint8_t pin) { +extern void __detachInterrupt(uint8_t pin) { if(pin < 16) { ETS_GPIO_INTR_DISABLE(); GPC(pin) &= ~(0xF << GPCI);//INT mode disabled @@ -214,11 +221,12 @@ extern void ICACHE_RAM_ATTR __detachInterrupt(uint8_t pin) { interrupt_handler_t *handler = &interrupt_handlers[pin]; handler->mode = 0; handler->fn = 0; - if (handler->arg) + if (handler->functional && handler->arg) { cleanupFunctional(handler->arg); } handler->arg = 0; + handler->functional = false; if (interrupt_reg) ETS_GPIO_INTR_ENABLE(); } @@ -243,6 +251,7 @@ extern void pinMode(uint8_t pin, uint8_t mode) __attribute__ ((weak, alias("__pi extern void digitalWrite(uint8_t pin, uint8_t val) __attribute__ ((weak, alias("__digitalWrite"))); extern int digitalRead(uint8_t pin) __attribute__ ((weak, alias("__digitalRead"))); extern void attachInterrupt(uint8_t pin, voidFuncPtr handler, int mode) __attribute__ ((weak, alias("__attachInterrupt"))); +extern void attachInterruptArg(uint8_t pin, voidFuncPtrArg handler, void * arg, int mode) __attribute__ ((weak, alias("__attachInterruptArg"))); extern void detachInterrupt(uint8_t pin) __attribute__ ((weak, alias("__detachInterrupt"))); }; From 669b9cee7a241f1fbd8b07eba3592bc8281f275c Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Sun, 21 Apr 2019 02:06:12 +0200 Subject: [PATCH 02/14] Fix CI warnings. --- cores/esp8266/core_esp8266_wiring_digital.cpp | 4 ++-- libraries/SoftwareSerial | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cores/esp8266/core_esp8266_wiring_digital.cpp b/cores/esp8266/core_esp8266_wiring_digital.cpp index 5bf59172fd..8f7f6c16d8 100644 --- a/cores/esp8266/core_esp8266_wiring_digital.cpp +++ b/cores/esp8266/core_esp8266_wiring_digital.cpp @@ -126,10 +126,10 @@ typedef struct { void* functionInfo; } ArgStructure; -static interrupt_handler_t interrupt_handlers[16] = {0,}; +static interrupt_handler_t interrupt_handlers[16] = {0}; static uint32_t interrupt_reg = 0; -void ICACHE_RAM_ATTR interrupt_handler(void *arg) { +void ICACHE_RAM_ATTR interrupt_handler(void *) { uint32_t status = GPIE; GPIEC = status;//clear them interrupts uint32_t levels = GPI; diff --git a/libraries/SoftwareSerial b/libraries/SoftwareSerial index d4ae180f33..9c5a0f7b88 160000 --- a/libraries/SoftwareSerial +++ b/libraries/SoftwareSerial @@ -1 +1 @@ -Subproject commit d4ae180f33347c851dc2e51ce1779f02b4d3fa11 +Subproject commit 9c5a0f7b887aa016df0b52441b583309e3976573 From 3c8a851ee8b4b753233de1e9416a894a91bec23e Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Sun, 21 Apr 2019 02:15:55 +0200 Subject: [PATCH 03/14] Revert "Fix CI warnings." This reverts commit 669b9cee7a241f1fbd8b07eba3592bc8281f275c. --- cores/esp8266/core_esp8266_wiring_digital.cpp | 4 ++-- libraries/SoftwareSerial | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cores/esp8266/core_esp8266_wiring_digital.cpp b/cores/esp8266/core_esp8266_wiring_digital.cpp index 8f7f6c16d8..5bf59172fd 100644 --- a/cores/esp8266/core_esp8266_wiring_digital.cpp +++ b/cores/esp8266/core_esp8266_wiring_digital.cpp @@ -126,10 +126,10 @@ typedef struct { void* functionInfo; } ArgStructure; -static interrupt_handler_t interrupt_handlers[16] = {0}; +static interrupt_handler_t interrupt_handlers[16] = {0,}; static uint32_t interrupt_reg = 0; -void ICACHE_RAM_ATTR interrupt_handler(void *) { +void ICACHE_RAM_ATTR interrupt_handler(void *arg) { uint32_t status = GPIE; GPIEC = status;//clear them interrupts uint32_t levels = GPI; diff --git a/libraries/SoftwareSerial b/libraries/SoftwareSerial index 9c5a0f7b88..d4ae180f33 160000 --- a/libraries/SoftwareSerial +++ b/libraries/SoftwareSerial @@ -1 +1 @@ -Subproject commit 9c5a0f7b887aa016df0b52441b583309e3976573 +Subproject commit d4ae180f33347c851dc2e51ce1779f02b4d3fa11 From c59a2c24f109ef4eedfa3a642f1dbfaff291398c Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Sun, 21 Apr 2019 02:18:34 +0200 Subject: [PATCH 04/14] Fix CI warnings. (cherry picked from commit 669b9cee7a241f1fbd8b07eba3592bc8281f275c) --- cores/esp8266/core_esp8266_wiring_digital.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cores/esp8266/core_esp8266_wiring_digital.cpp b/cores/esp8266/core_esp8266_wiring_digital.cpp index 5bf59172fd..8f7f6c16d8 100644 --- a/cores/esp8266/core_esp8266_wiring_digital.cpp +++ b/cores/esp8266/core_esp8266_wiring_digital.cpp @@ -126,10 +126,10 @@ typedef struct { void* functionInfo; } ArgStructure; -static interrupt_handler_t interrupt_handlers[16] = {0,}; +static interrupt_handler_t interrupt_handlers[16] = {0}; static uint32_t interrupt_reg = 0; -void ICACHE_RAM_ATTR interrupt_handler(void *arg) { +void ICACHE_RAM_ATTR interrupt_handler(void *) { uint32_t status = GPIE; GPIEC = status;//clear them interrupts uint32_t levels = GPI; From b7ca69904795be584b6b4429abc59ad7a5e037b3 Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Sun, 21 Apr 2019 02:40:11 +0200 Subject: [PATCH 05/14] Done fixing CI warnings. --- cores/esp8266/core_esp8266_wiring_digital.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cores/esp8266/core_esp8266_wiring_digital.cpp b/cores/esp8266/core_esp8266_wiring_digital.cpp index 8f7f6c16d8..b170f4ddd7 100644 --- a/cores/esp8266/core_esp8266_wiring_digital.cpp +++ b/cores/esp8266/core_esp8266_wiring_digital.cpp @@ -126,7 +126,7 @@ typedef struct { void* functionInfo; } ArgStructure; -static interrupt_handler_t interrupt_handlers[16] = {0}; +static interrupt_handler_t interrupt_handlers[16] = { {0, 0, 0, 0}, }; static uint32_t interrupt_reg = 0; void ICACHE_RAM_ATTR interrupt_handler(void *) { From efafcbded12fa806811a8025e515e8b0859df7f7 Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Sun, 21 Apr 2019 01:35:32 +0200 Subject: [PATCH 06/14] - attachInterrupt and detachInterrupt don't require ICACHE_RAM_ATTR. - fix incorrect handling of non-"functional" interrupt handlers. - complete and expose attachInterruptArg(). --- cores/esp8266/Arduino.h | 1 + cores/esp8266/FunctionalInterrupt.cpp | 6 +-- cores/esp8266/core_esp8266_wiring_digital.cpp | 47 +++++++++++-------- 3 files changed, 32 insertions(+), 22 deletions(-) diff --git a/cores/esp8266/Arduino.h b/cores/esp8266/Arduino.h index 34e5fb8fce..91ef7a43f1 100644 --- a/cores/esp8266/Arduino.h +++ b/cores/esp8266/Arduino.h @@ -217,6 +217,7 @@ void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val); uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder); void attachInterrupt(uint8_t pin, void (*)(void), int mode); +void attachInterruptArg(uint8_t pin, void (*)(void*), void * arg, int mode); void detachInterrupt(uint8_t pin); void preinit(void); diff --git a/cores/esp8266/FunctionalInterrupt.cpp b/cores/esp8266/FunctionalInterrupt.cpp index 2633c63182..ec09788a85 100644 --- a/cores/esp8266/FunctionalInterrupt.cpp +++ b/cores/esp8266/FunctionalInterrupt.cpp @@ -8,7 +8,7 @@ typedef void (*voidFuncPtr)(void); typedef void (*voidFuncPtrArg)(void*); // Helper functions for Functional interrupt routines -extern "C" void ICACHE_RAM_ATTR __attachInterruptArg(uint8_t pin, voidFuncPtr userFunc, void*fp , int mode); +extern "C" void __attachInterruptFunctionalArg(uint8_t pin, voidFuncPtr userFunc, void*fp , int mode, bool functional); void ICACHE_RAM_ATTR interruptFunctional(void* arg) @@ -49,7 +49,7 @@ void attachInterrupt(uint8_t pin, std::function intRoutine, int mode as->interruptInfo = ii; as->functionInfo = fi; - __attachInterruptArg (pin, (voidFuncPtr)interruptFunctional, as, mode); + __attachInterruptFunctionalArg (pin, (voidFuncPtr)interruptFunctional, as, mode, true); } void attachScheduledInterrupt(uint8_t pin, std::function scheduledIntRoutine, int mode) @@ -67,5 +67,5 @@ void attachScheduledInterrupt(uint8_t pin, std::function sc as->interruptInfo = ii; as->functionInfo = fi; - __attachInterruptArg (pin, (voidFuncPtr)interruptFunctional, as, mode); + __attachInterruptFunctionalArg (pin, (voidFuncPtr)interruptFunctional, as, mode, true); } diff --git a/cores/esp8266/core_esp8266_wiring_digital.cpp b/cores/esp8266/core_esp8266_wiring_digital.cpp index 0a8a7252f1..5bf59172fd 100644 --- a/cores/esp8266/core_esp8266_wiring_digital.cpp +++ b/cores/esp8266/core_esp8266_wiring_digital.cpp @@ -109,8 +109,9 @@ typedef void (*voidFuncPtrArg)(void*); typedef struct { uint8_t mode; - void (*fn)(void); - void * arg; + voidFuncPtr fn; + void* arg; + bool functional; } interrupt_handler_t; //duplicate from functionalInterrupt.h keep in sync @@ -125,11 +126,10 @@ typedef struct { void* functionInfo; } ArgStructure; -static interrupt_handler_t interrupt_handlers[16]; +static interrupt_handler_t interrupt_handlers[16] = {0,}; static uint32_t interrupt_reg = 0; void ICACHE_RAM_ATTR interrupt_handler(void *arg) { - (void) arg; uint32_t status = GPIE; GPIEC = status;//clear them interrupts uint32_t levels = GPI; @@ -147,13 +147,16 @@ void ICACHE_RAM_ATTR interrupt_handler(void *arg) { // to make ISR compatible to Arduino AVR model where interrupts are disabled // we disable them before we call the client ISR uint32_t savedPS = xt_rsil(15); // stop other interrupts - ArgStructure* localArg = (ArgStructure*)handler->arg; - if (localArg && localArg->interruptInfo) - { - localArg->interruptInfo->pin = i; - localArg->interruptInfo->value = __digitalRead(i); - localArg->interruptInfo->micro = micros(); - } + if (handler->functional) + { + ArgStructure* localArg = (ArgStructure*)handler->arg; + if (localArg && localArg->interruptInfo) + { + localArg->interruptInfo->pin = i; + localArg->interruptInfo->value = __digitalRead(i); + localArg->interruptInfo->micro = micros(); + } + } if (handler->arg) { ((voidFuncPtrArg)handler->fn)(handler->arg); @@ -170,8 +173,7 @@ void ICACHE_RAM_ATTR interrupt_handler(void *arg) { extern void cleanupFunctional(void* arg); -extern void ICACHE_RAM_ATTR __attachInterruptArg(uint8_t pin, voidFuncPtr userFunc, void *arg, int mode) { - +extern void __attachInterruptFunctionalArg(uint8_t pin, voidFuncPtrArg userFunc, void *arg, int mode, bool functional) { // #5780 // https://github.com/esp8266/esp8266-wiki/wiki/Memory-Map if ((uint32_t)userFunc >= 0x40200000) @@ -185,12 +187,13 @@ extern void ICACHE_RAM_ATTR __attachInterruptArg(uint8_t pin, voidFuncPtr userFu ETS_GPIO_INTR_DISABLE(); interrupt_handler_t *handler = &interrupt_handlers[pin]; handler->mode = mode; - handler->fn = userFunc; - if (handler->arg) // Clean when new attach without detach + handler->fn = (voidFuncPtr)userFunc; + if (handler->functional && handler->arg) // Clean when new attach without detach { cleanupFunctional(handler->arg); } handler->arg = arg; + handler->functional = functional; interrupt_reg |= (1 << pin); GPC(pin) &= ~(0xF << GPCI);//INT mode disabled GPIEC = (1 << pin); //Clear Interrupt for this pin @@ -200,12 +203,16 @@ extern void ICACHE_RAM_ATTR __attachInterruptArg(uint8_t pin, voidFuncPtr userFu } } -extern void ICACHE_RAM_ATTR __attachInterrupt(uint8_t pin, voidFuncPtr userFunc, int mode ) +extern void __attachInterruptArg(uint8_t pin, voidFuncPtrArg userFunc, void * arg, int mode) { - __attachInterruptArg (pin, userFunc, 0, mode); + __attachInterruptFunctionalArg(pin, userFunc, arg, mode, false); +} + +extern void __attachInterrupt(uint8_t pin, voidFuncPtr userFunc, int mode ) { + __attachInterruptFunctionalArg(pin, (voidFuncPtrArg)userFunc, 0, mode, false); } -extern void ICACHE_RAM_ATTR __detachInterrupt(uint8_t pin) { +extern void __detachInterrupt(uint8_t pin) { if(pin < 16) { ETS_GPIO_INTR_DISABLE(); GPC(pin) &= ~(0xF << GPCI);//INT mode disabled @@ -214,11 +221,12 @@ extern void ICACHE_RAM_ATTR __detachInterrupt(uint8_t pin) { interrupt_handler_t *handler = &interrupt_handlers[pin]; handler->mode = 0; handler->fn = 0; - if (handler->arg) + if (handler->functional && handler->arg) { cleanupFunctional(handler->arg); } handler->arg = 0; + handler->functional = false; if (interrupt_reg) ETS_GPIO_INTR_ENABLE(); } @@ -243,6 +251,7 @@ extern void pinMode(uint8_t pin, uint8_t mode) __attribute__ ((weak, alias("__pi extern void digitalWrite(uint8_t pin, uint8_t val) __attribute__ ((weak, alias("__digitalWrite"))); extern int digitalRead(uint8_t pin) __attribute__ ((weak, alias("__digitalRead"))); extern void attachInterrupt(uint8_t pin, voidFuncPtr handler, int mode) __attribute__ ((weak, alias("__attachInterrupt"))); +extern void attachInterruptArg(uint8_t pin, voidFuncPtrArg handler, void * arg, int mode) __attribute__ ((weak, alias("__attachInterruptArg"))); extern void detachInterrupt(uint8_t pin) __attribute__ ((weak, alias("__detachInterrupt"))); }; From e04ac236c6e30ca7d57a1b2835d62b32fcd5146e Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Sun, 21 Apr 2019 02:06:12 +0200 Subject: [PATCH 07/14] Fix CI warnings. --- cores/esp8266/core_esp8266_wiring_digital.cpp | 4 ++-- libraries/SoftwareSerial | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cores/esp8266/core_esp8266_wiring_digital.cpp b/cores/esp8266/core_esp8266_wiring_digital.cpp index 5bf59172fd..8f7f6c16d8 100644 --- a/cores/esp8266/core_esp8266_wiring_digital.cpp +++ b/cores/esp8266/core_esp8266_wiring_digital.cpp @@ -126,10 +126,10 @@ typedef struct { void* functionInfo; } ArgStructure; -static interrupt_handler_t interrupt_handlers[16] = {0,}; +static interrupt_handler_t interrupt_handlers[16] = {0}; static uint32_t interrupt_reg = 0; -void ICACHE_RAM_ATTR interrupt_handler(void *arg) { +void ICACHE_RAM_ATTR interrupt_handler(void *) { uint32_t status = GPIE; GPIEC = status;//clear them interrupts uint32_t levels = GPI; diff --git a/libraries/SoftwareSerial b/libraries/SoftwareSerial index d4ae180f33..9c5a0f7b88 160000 --- a/libraries/SoftwareSerial +++ b/libraries/SoftwareSerial @@ -1 +1 @@ -Subproject commit d4ae180f33347c851dc2e51ce1779f02b4d3fa11 +Subproject commit 9c5a0f7b887aa016df0b52441b583309e3976573 From 64a56c9896a5698c2e450e45bb349e7d3a5a6545 Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Sun, 21 Apr 2019 02:15:55 +0200 Subject: [PATCH 08/14] Revert "Fix CI warnings." This reverts commit 669b9cee7a241f1fbd8b07eba3592bc8281f275c. --- cores/esp8266/core_esp8266_wiring_digital.cpp | 4 ++-- libraries/SoftwareSerial | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cores/esp8266/core_esp8266_wiring_digital.cpp b/cores/esp8266/core_esp8266_wiring_digital.cpp index 8f7f6c16d8..5bf59172fd 100644 --- a/cores/esp8266/core_esp8266_wiring_digital.cpp +++ b/cores/esp8266/core_esp8266_wiring_digital.cpp @@ -126,10 +126,10 @@ typedef struct { void* functionInfo; } ArgStructure; -static interrupt_handler_t interrupt_handlers[16] = {0}; +static interrupt_handler_t interrupt_handlers[16] = {0,}; static uint32_t interrupt_reg = 0; -void ICACHE_RAM_ATTR interrupt_handler(void *) { +void ICACHE_RAM_ATTR interrupt_handler(void *arg) { uint32_t status = GPIE; GPIEC = status;//clear them interrupts uint32_t levels = GPI; diff --git a/libraries/SoftwareSerial b/libraries/SoftwareSerial index 9c5a0f7b88..d4ae180f33 160000 --- a/libraries/SoftwareSerial +++ b/libraries/SoftwareSerial @@ -1 +1 @@ -Subproject commit 9c5a0f7b887aa016df0b52441b583309e3976573 +Subproject commit d4ae180f33347c851dc2e51ce1779f02b4d3fa11 From 38ef0f1557252cdf9453e253b3e0fcd9bb6a3825 Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Sun, 21 Apr 2019 02:18:34 +0200 Subject: [PATCH 09/14] Fix CI warnings. (cherry picked from commit 669b9cee7a241f1fbd8b07eba3592bc8281f275c) --- cores/esp8266/core_esp8266_wiring_digital.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cores/esp8266/core_esp8266_wiring_digital.cpp b/cores/esp8266/core_esp8266_wiring_digital.cpp index 5bf59172fd..8f7f6c16d8 100644 --- a/cores/esp8266/core_esp8266_wiring_digital.cpp +++ b/cores/esp8266/core_esp8266_wiring_digital.cpp @@ -126,10 +126,10 @@ typedef struct { void* functionInfo; } ArgStructure; -static interrupt_handler_t interrupt_handlers[16] = {0,}; +static interrupt_handler_t interrupt_handlers[16] = {0}; static uint32_t interrupt_reg = 0; -void ICACHE_RAM_ATTR interrupt_handler(void *arg) { +void ICACHE_RAM_ATTR interrupt_handler(void *) { uint32_t status = GPIE; GPIEC = status;//clear them interrupts uint32_t levels = GPI; From 254302b98fa01fbd6db3c049839ce2d02b4b8997 Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Sun, 21 Apr 2019 02:40:11 +0200 Subject: [PATCH 10/14] Done fixing CI warnings. --- cores/esp8266/core_esp8266_wiring_digital.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cores/esp8266/core_esp8266_wiring_digital.cpp b/cores/esp8266/core_esp8266_wiring_digital.cpp index 8f7f6c16d8..b170f4ddd7 100644 --- a/cores/esp8266/core_esp8266_wiring_digital.cpp +++ b/cores/esp8266/core_esp8266_wiring_digital.cpp @@ -126,7 +126,7 @@ typedef struct { void* functionInfo; } ArgStructure; -static interrupt_handler_t interrupt_handlers[16] = {0}; +static interrupt_handler_t interrupt_handlers[16] = { {0, 0, 0, 0}, }; static uint32_t interrupt_reg = 0; void ICACHE_RAM_ATTR interrupt_handler(void *) { From 78aa3e84321935dcc3cfb7ebe8c293ccb0c06a79 Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Thu, 25 Apr 2019 23:50:06 +0200 Subject: [PATCH 11/14] Track breaking API chance in EspSoftwareSerial. --- libraries/SoftwareSerial | 2 +- libraries/esp8266/examples/SerialStress/SerialStress.ino | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/SoftwareSerial b/libraries/SoftwareSerial index d4ae180f33..88d582b81e 160000 --- a/libraries/SoftwareSerial +++ b/libraries/SoftwareSerial @@ -1 +1 @@ -Subproject commit d4ae180f33347c851dc2e51ce1779f02b4d3fa11 +Subproject commit 88d582b81e228a549d999693dcb170d86a96f483 diff --git a/libraries/esp8266/examples/SerialStress/SerialStress.ino b/libraries/esp8266/examples/SerialStress/SerialStress.ino index 1412abd2be..5500b10a62 100644 --- a/libraries/esp8266/examples/SerialStress/SerialStress.ino +++ b/libraries/esp8266/examples/SerialStress/SerialStress.ino @@ -72,8 +72,8 @@ void setup() { // using HardwareSerial0 pins, // so we can still log to the regular usbserial chips - SoftwareSerial* ss = new SoftwareSerial(3, 1); - ss->begin(SSBAUD); + SoftwareSerial* ss = new SoftwareSerial; + ss->begin(SSBAUD, 3, 1); ss->enableIntTx(false); logger = ss; logger->println(); From 1b4077f7995c938b588de1e3d4f6274e83fd41ad Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Mon, 29 Apr 2019 08:09:56 +0200 Subject: [PATCH 12/14] Update SoftwareSerial release only after PR containing interrupt handling with arguments. --- libraries/SoftwareSerial | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/SoftwareSerial b/libraries/SoftwareSerial index 88d582b81e..d4ae180f33 160000 --- a/libraries/SoftwareSerial +++ b/libraries/SoftwareSerial @@ -1 +1 @@ -Subproject commit 88d582b81e228a549d999693dcb170d86a96f483 +Subproject commit d4ae180f33347c851dc2e51ce1779f02b4d3fa11 From f21db9598d5cc4fb03e37e8fa74a2451502a3b92 Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Mon, 29 Apr 2019 11:00:50 +0200 Subject: [PATCH 13/14] Revert "Track breaking API chance in EspSoftwareSerial." This reverts commit 78aa3e84321935dcc3cfb7ebe8c293ccb0c06a79. --- libraries/esp8266/examples/SerialStress/SerialStress.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/esp8266/examples/SerialStress/SerialStress.ino b/libraries/esp8266/examples/SerialStress/SerialStress.ino index 5500b10a62..1412abd2be 100644 --- a/libraries/esp8266/examples/SerialStress/SerialStress.ino +++ b/libraries/esp8266/examples/SerialStress/SerialStress.ino @@ -72,8 +72,8 @@ void setup() { // using HardwareSerial0 pins, // so we can still log to the regular usbserial chips - SoftwareSerial* ss = new SoftwareSerial; - ss->begin(SSBAUD, 3, 1); + SoftwareSerial* ss = new SoftwareSerial(3, 1); + ss->begin(SSBAUD); ss->enableIntTx(false); logger = ss; logger->println(); From 4a78b1a18e7b17bb9d0779bd3e2a448e1d9307d8 Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Wed, 1 May 2019 22:50:09 +0200 Subject: [PATCH 14/14] Code formatting cleaned up a bit. --- cores/esp8266/core_esp8266_wiring_digital.cpp | 80 +++++++++---------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/cores/esp8266/core_esp8266_wiring_digital.cpp b/cores/esp8266/core_esp8266_wiring_digital.cpp index b170f4ddd7..7ae1de3889 100644 --- a/cores/esp8266/core_esp8266_wiring_digital.cpp +++ b/cores/esp8266/core_esp8266_wiring_digital.cpp @@ -53,17 +53,17 @@ extern void __pinMode(uint8_t pin, uint8_t mode) { GPEC = (1 << pin); //Disable GPC(pin) = (GPC(pin) & (0xF << GPCI)) | (1 << GPCD); //SOURCE(GPIO) | DRIVER(OPEN_DRAIN) | INT_TYPE(UNCHANGED) | WAKEUP_ENABLE(DISABLED) if(mode == INPUT_PULLUP) { - GPF(pin) |= (1 << GPFPU); // Enable Pullup + GPF(pin) |= (1 << GPFPU); // Enable Pullup } } else if(mode == WAKEUP_PULLUP || mode == WAKEUP_PULLDOWN){ GPF(pin) = GPFFS(GPFFS_GPIO(pin));//Set mode to GPIO GPEC = (1 << pin); //Disable if(mode == WAKEUP_PULLUP) { - GPF(pin) |= (1 << GPFPU); // Enable Pullup - GPC(pin) = (1 << GPCD) | (4 << GPCI) | (1 << GPCWE); //SOURCE(GPIO) | DRIVER(OPEN_DRAIN) | INT_TYPE(LOW) | WAKEUP_ENABLE(ENABLED) + GPF(pin) |= (1 << GPFPU); // Enable Pullup + GPC(pin) = (1 << GPCD) | (4 << GPCI) | (1 << GPCWE); //SOURCE(GPIO) | DRIVER(OPEN_DRAIN) | INT_TYPE(LOW) | WAKEUP_ENABLE(ENABLED) } else { - GPF(pin) |= (1 << GPFPD); // Enable Pulldown - GPC(pin) = (1 << GPCD) | (5 << GPCI) | (1 << GPCWE); //SOURCE(GPIO) | DRIVER(OPEN_DRAIN) | INT_TYPE(HIGH) | WAKEUP_ENABLE(ENABLED) + GPF(pin) |= (1 << GPFPD); // Enable Pulldown + GPC(pin) = (1 << GPCD) | (5 << GPCI) | (1 << GPCWE); //SOURCE(GPIO) | DRIVER(OPEN_DRAIN) | INT_TYPE(HIGH) | WAKEUP_ENABLE(ENABLED) } } } else if(pin == 16){ @@ -116,20 +116,20 @@ typedef struct { //duplicate from functionalInterrupt.h keep in sync typedef struct InterruptInfo { - uint8_t pin; - uint8_t value; - uint32_t micro; + uint8_t pin; + uint8_t value; + uint32_t micro; } InterruptInfo; typedef struct { - InterruptInfo* interruptInfo; - void* functionInfo; + InterruptInfo* interruptInfo; + void* functionInfo; } ArgStructure; static interrupt_handler_t interrupt_handlers[16] = { {0, 0, 0, 0}, }; static uint32_t interrupt_reg = 0; -void ICACHE_RAM_ATTR interrupt_handler(void *) { +void ICACHE_RAM_ATTR interrupt_handler(void*) { uint32_t status = GPIE; GPIEC = status;//clear them interrupts uint32_t levels = GPI; @@ -140,32 +140,32 @@ void ICACHE_RAM_ATTR interrupt_handler(void *) { while(changedbits){ while(!(changedbits & (1 << i))) i++; changedbits &= ~(1 << i); - interrupt_handler_t *handler = &interrupt_handlers[i]; + interrupt_handler_t* handler = &interrupt_handlers[i]; if (handler->fn && - (handler->mode == CHANGE || - (handler->mode & 1) == !!(levels & (1 << i)))) { + (handler->mode == CHANGE || + (handler->mode & 1) == !!(levels & (1 << i)))) { // to make ISR compatible to Arduino AVR model where interrupts are disabled // we disable them before we call the client ISR uint32_t savedPS = xt_rsil(15); // stop other interrupts - if (handler->functional) - { - ArgStructure* localArg = (ArgStructure*)handler->arg; - if (localArg && localArg->interruptInfo) - { - localArg->interruptInfo->pin = i; - localArg->interruptInfo->value = __digitalRead(i); - localArg->interruptInfo->micro = micros(); - } - } + if (handler->functional) + { + ArgStructure* localArg = (ArgStructure*)handler->arg; + if (localArg && localArg->interruptInfo) + { + localArg->interruptInfo->pin = i; + localArg->interruptInfo->value = __digitalRead(i); + localArg->interruptInfo->micro = micros(); + } + } if (handler->arg) { - ((voidFuncPtrArg)handler->fn)(handler->arg); + ((voidFuncPtrArg)handler->fn)(handler->arg); } else { - handler->fn(); + handler->fn(); } - xt_wsr_ps(savedPS); + xt_wsr_ps(savedPS); } } ETS_GPIO_INTR_ENABLE(); @@ -173,7 +173,7 @@ void ICACHE_RAM_ATTR interrupt_handler(void *) { extern void cleanupFunctional(void* arg); -extern void __attachInterruptFunctionalArg(uint8_t pin, voidFuncPtrArg userFunc, void *arg, int mode, bool functional) { +extern void __attachInterruptFunctionalArg(uint8_t pin, voidFuncPtrArg userFunc, void* arg, int mode, bool functional) { // #5780 // https://github.com/esp8266/esp8266-wiki/wiki/Memory-Map if ((uint32_t)userFunc >= 0x40200000) @@ -185,13 +185,13 @@ extern void __attachInterruptFunctionalArg(uint8_t pin, voidFuncPtrArg userFunc, if(pin < 16) { ETS_GPIO_INTR_DISABLE(); - interrupt_handler_t *handler = &interrupt_handlers[pin]; + interrupt_handler_t* handler = &interrupt_handlers[pin]; handler->mode = mode; handler->fn = (voidFuncPtr)userFunc; if (handler->functional && handler->arg) // Clean when new attach without detach - { - cleanupFunctional(handler->arg); - } + { + cleanupFunctional(handler->arg); + } handler->arg = arg; handler->functional = functional; interrupt_reg |= (1 << pin); @@ -203,13 +203,13 @@ extern void __attachInterruptFunctionalArg(uint8_t pin, voidFuncPtrArg userFunc, } } -extern void __attachInterruptArg(uint8_t pin, voidFuncPtrArg userFunc, void * arg, int mode) +extern void __attachInterruptArg(uint8_t pin, voidFuncPtrArg userFunc, void* arg, int mode) { - __attachInterruptFunctionalArg(pin, userFunc, arg, mode, false); + __attachInterruptFunctionalArg(pin, userFunc, arg, mode, false); } extern void __attachInterrupt(uint8_t pin, voidFuncPtr userFunc, int mode ) { - __attachInterruptFunctionalArg(pin, (voidFuncPtrArg)userFunc, 0, mode, false); + __attachInterruptFunctionalArg(pin, (voidFuncPtrArg)userFunc, 0, mode, false); } extern void __detachInterrupt(uint8_t pin) { @@ -218,13 +218,13 @@ extern void __detachInterrupt(uint8_t pin) { GPC(pin) &= ~(0xF << GPCI);//INT mode disabled GPIEC = (1 << pin); //Clear Interrupt for this pin interrupt_reg &= ~(1 << pin); - interrupt_handler_t *handler = &interrupt_handlers[pin]; + interrupt_handler_t* handler = &interrupt_handlers[pin]; handler->mode = 0; handler->fn = 0; if (handler->functional && handler->arg) - { - cleanupFunctional(handler->arg); - } + { + cleanupFunctional(handler->arg); + } handler->arg = 0; handler->functional = false; if (interrupt_reg) @@ -251,7 +251,7 @@ extern void pinMode(uint8_t pin, uint8_t mode) __attribute__ ((weak, alias("__pi extern void digitalWrite(uint8_t pin, uint8_t val) __attribute__ ((weak, alias("__digitalWrite"))); extern int digitalRead(uint8_t pin) __attribute__ ((weak, alias("__digitalRead"))); extern void attachInterrupt(uint8_t pin, voidFuncPtr handler, int mode) __attribute__ ((weak, alias("__attachInterrupt"))); -extern void attachInterruptArg(uint8_t pin, voidFuncPtrArg handler, void * arg, int mode) __attribute__ ((weak, alias("__attachInterruptArg"))); +extern void attachInterruptArg(uint8_t pin, voidFuncPtrArg handler, void* arg, int mode) __attribute__ ((weak, alias("__attachInterruptArg"))); extern void detachInterrupt(uint8_t pin) __attribute__ ((weak, alias("__detachInterrupt"))); };