Skip to content

Commit 3594450

Browse files
committed
Merge remote-tracking branch 'dok-net/master'
2 parents d9b0480 + c376c97 commit 3594450

File tree

3 files changed

+33
-23
lines changed

3 files changed

+33
-23
lines changed

cores/esp8266/Arduino.h

+1
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val);
217217
uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder);
218218

219219
void attachInterrupt(uint8_t pin, void (*)(void), int mode);
220+
void attachInterruptArg(uint8_t pin, void (*)(void*), void * arg, int mode);
220221
void detachInterrupt(uint8_t pin);
221222

222223
void preinit(void);

cores/esp8266/FunctionalInterrupt.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ typedef void (*voidFuncPtr)(void);
88
typedef void (*voidFuncPtrArg)(void*);
99

1010
// Helper functions for Functional interrupt routines
11-
extern "C" void ICACHE_RAM_ATTR __attachInterruptArg(uint8_t pin, voidFuncPtr userFunc, void*fp , int mode);
11+
extern "C" void __attachInterruptFunctionalArg(uint8_t pin, voidFuncPtr userFunc, void*fp , int mode, bool functional);
1212

1313

1414
void ICACHE_RAM_ATTR interruptFunctional(void* arg)
@@ -49,7 +49,7 @@ void attachInterrupt(uint8_t pin, std::function<void(void)> intRoutine, int mode
4949
as->interruptInfo = ii;
5050
as->functionInfo = fi;
5151

52-
__attachInterruptArg (pin, (voidFuncPtr)interruptFunctional, as, mode);
52+
__attachInterruptFunctionalArg (pin, (voidFuncPtr)interruptFunctional, as, mode, true);
5353
}
5454

5555
void attachScheduledInterrupt(uint8_t pin, std::function<void(InterruptInfo)> scheduledIntRoutine, int mode)
@@ -67,5 +67,5 @@ void attachScheduledInterrupt(uint8_t pin, std::function<void(InterruptInfo)> sc
6767
as->interruptInfo = ii;
6868
as->functionInfo = fi;
6969

70-
__attachInterruptArg (pin, (voidFuncPtr)interruptFunctional, as, mode);
70+
__attachInterruptFunctionalArg (pin, (voidFuncPtr)interruptFunctional, as, mode, true);
7171
}

cores/esp8266/core_esp8266_wiring_digital.cpp

+29-20
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,9 @@ typedef void (*voidFuncPtrArg)(void*);
109109

110110
typedef struct {
111111
uint8_t mode;
112-
void (*fn)(void);
113-
void * arg;
112+
voidFuncPtr fn;
113+
void* arg;
114+
bool functional;
114115
} interrupt_handler_t;
115116

116117
//duplicate from functionalInterrupt.h keep in sync
@@ -125,11 +126,10 @@ typedef struct {
125126
void* functionInfo;
126127
} ArgStructure;
127128

128-
static interrupt_handler_t interrupt_handlers[16];
129+
static interrupt_handler_t interrupt_handlers[16] = { {0, 0, 0, 0}, };
129130
static uint32_t interrupt_reg = 0;
130131

131-
void ICACHE_RAM_ATTR interrupt_handler(void *arg) {
132-
(void) arg;
132+
void ICACHE_RAM_ATTR interrupt_handler(void *) {
133133
uint32_t status = GPIE;
134134
GPIEC = status;//clear them interrupts
135135
uint32_t levels = GPI;
@@ -147,13 +147,16 @@ void ICACHE_RAM_ATTR interrupt_handler(void *arg) {
147147
// to make ISR compatible to Arduino AVR model where interrupts are disabled
148148
// we disable them before we call the client ISR
149149
uint32_t savedPS = xt_rsil(15); // stop other interrupts
150-
ArgStructure* localArg = (ArgStructure*)handler->arg;
151-
if (localArg && localArg->interruptInfo)
152-
{
153-
localArg->interruptInfo->pin = i;
154-
localArg->interruptInfo->value = __digitalRead(i);
155-
localArg->interruptInfo->micro = micros();
156-
}
150+
if (handler->functional)
151+
{
152+
ArgStructure* localArg = (ArgStructure*)handler->arg;
153+
if (localArg && localArg->interruptInfo)
154+
{
155+
localArg->interruptInfo->pin = i;
156+
localArg->interruptInfo->value = __digitalRead(i);
157+
localArg->interruptInfo->micro = micros();
158+
}
159+
}
157160
if (handler->arg)
158161
{
159162
((voidFuncPtrArg)handler->fn)(handler->arg);
@@ -170,8 +173,7 @@ void ICACHE_RAM_ATTR interrupt_handler(void *arg) {
170173

171174
extern void cleanupFunctional(void* arg);
172175

173-
extern void ICACHE_RAM_ATTR __attachInterruptArg(uint8_t pin, voidFuncPtr userFunc, void *arg, int mode) {
174-
176+
extern void __attachInterruptFunctionalArg(uint8_t pin, voidFuncPtrArg userFunc, void *arg, int mode, bool functional) {
175177
// #5780
176178
// https://github.com/esp8266/esp8266-wiki/wiki/Memory-Map
177179
if ((uint32_t)userFunc >= 0x40200000)
@@ -185,12 +187,13 @@ extern void ICACHE_RAM_ATTR __attachInterruptArg(uint8_t pin, voidFuncPtr userFu
185187
ETS_GPIO_INTR_DISABLE();
186188
interrupt_handler_t *handler = &interrupt_handlers[pin];
187189
handler->mode = mode;
188-
handler->fn = userFunc;
189-
if (handler->arg) // Clean when new attach without detach
190+
handler->fn = (voidFuncPtr)userFunc;
191+
if (handler->functional && handler->arg) // Clean when new attach without detach
190192
{
191193
cleanupFunctional(handler->arg);
192194
}
193195
handler->arg = arg;
196+
handler->functional = functional;
194197
interrupt_reg |= (1 << pin);
195198
GPC(pin) &= ~(0xF << GPCI);//INT mode disabled
196199
GPIEC = (1 << pin); //Clear Interrupt for this pin
@@ -200,12 +203,16 @@ extern void ICACHE_RAM_ATTR __attachInterruptArg(uint8_t pin, voidFuncPtr userFu
200203
}
201204
}
202205

203-
extern void ICACHE_RAM_ATTR __attachInterrupt(uint8_t pin, voidFuncPtr userFunc, int mode )
206+
extern void __attachInterruptArg(uint8_t pin, voidFuncPtrArg userFunc, void * arg, int mode)
204207
{
205-
__attachInterruptArg (pin, userFunc, 0, mode);
208+
__attachInterruptFunctionalArg(pin, userFunc, arg, mode, false);
209+
}
210+
211+
extern void __attachInterrupt(uint8_t pin, voidFuncPtr userFunc, int mode ) {
212+
__attachInterruptFunctionalArg(pin, (voidFuncPtrArg)userFunc, 0, mode, false);
206213
}
207214

208-
extern void ICACHE_RAM_ATTR __detachInterrupt(uint8_t pin) {
215+
extern void __detachInterrupt(uint8_t pin) {
209216
if(pin < 16) {
210217
ETS_GPIO_INTR_DISABLE();
211218
GPC(pin) &= ~(0xF << GPCI);//INT mode disabled
@@ -214,11 +221,12 @@ extern void ICACHE_RAM_ATTR __detachInterrupt(uint8_t pin) {
214221
interrupt_handler_t *handler = &interrupt_handlers[pin];
215222
handler->mode = 0;
216223
handler->fn = 0;
217-
if (handler->arg)
224+
if (handler->functional && handler->arg)
218225
{
219226
cleanupFunctional(handler->arg);
220227
}
221228
handler->arg = 0;
229+
handler->functional = false;
222230
if (interrupt_reg)
223231
ETS_GPIO_INTR_ENABLE();
224232
}
@@ -243,6 +251,7 @@ extern void pinMode(uint8_t pin, uint8_t mode) __attribute__ ((weak, alias("__pi
243251
extern void digitalWrite(uint8_t pin, uint8_t val) __attribute__ ((weak, alias("__digitalWrite")));
244252
extern int digitalRead(uint8_t pin) __attribute__ ((weak, alias("__digitalRead")));
245253
extern void attachInterrupt(uint8_t pin, voidFuncPtr handler, int mode) __attribute__ ((weak, alias("__attachInterrupt")));
254+
extern void attachInterruptArg(uint8_t pin, voidFuncPtrArg handler, void * arg, int mode) __attribute__ ((weak, alias("__attachInterruptArg")));
246255
extern void detachInterrupt(uint8_t pin) __attribute__ ((weak, alias("__detachInterrupt")));
247256

248257
};

0 commit comments

Comments
 (0)