Skip to content

Commit

Permalink
make compatible with existing interrupt lock class
Browse files Browse the repository at this point in the history
Support both the normal auto lock at all levels, and the lock at a
specific level requiring different syntax
  • Loading branch information
Makuna committed Aug 4, 2015
1 parent 57642c1 commit dfeed84
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 26 deletions.
21 changes: 0 additions & 21 deletions cores/esp8266/Arduino.h
Original file line number Diff line number Diff line change
Expand Up @@ -160,27 +160,6 @@ void ets_intr_unlock();
#define interrupts() xt_rsil(0)
#define noInterrupts() xt_rsil(15)

// this auto class wraps up xt_rsil so your code can be simplier, but can only be
// used in an ino or cpp files. A normal use pattern is like
//
//{
// {
// InterruptLock(1); // this routine will allow level 2 and above
// // do work within interrupt lock here
// }
// do work outside of interrupt lock here outside its scope
//}
//
#define InterruptLock(intrLevel) \
class _AutoDisableIntr { \
public: \
_AutoDisableIntr() { _savedPS = xt_rsil(intrLevel); } \
~_AutoDisableIntr() { xt_wsr_ps(_savedPS); } \
private: \
uint32_t _savedPS; \
}; \
_AutoDisableIntr _autoDisableIntr


#define clockCyclesPerMicrosecond() ( F_CPU / 1000000L )
#define clockCyclesToMicroseconds(a) ( (a) / clockCyclesPerMicrosecond() )
Expand Down
38 changes: 33 additions & 5 deletions cores/esp8266/interrupts.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,23 +8,51 @@ extern "C" {
#include "ets_sys.h"
}


#define xt_disable_interrupts(state, level) __asm__ __volatile__("rsil %0," __STRINGIFY(level) : "=a" (state))
#define xt_enable_interrupts(state) __asm__ __volatile__("wsr %0,ps; isync" :: "a" (state) : "memory")
// these auto classes wrap up xt_rsil so your code can be simplier, but can only be
// used in an ino or cpp files.

// InterruptLock is used when you want to completely disable locks
//{
// {
// InterruptLock lock;
// // do work within interrupt lock here
// }
// do work outside of interrupt lock here outside its scope
//}
//

class InterruptLock {
public:
InterruptLock() {
xt_disable_interrupts(_state, 15);
_state = = xt_rsil(15);
}

~InterruptLock() {
xt_enable_interrupts(_state);
xt_wsr_ps(_state);
}

protected:
uint32_t _state;
};

// AutoInterruptLock is when you need to set a specific level, A normal use pattern is like
//
//{
// {
// AutoInterruptLock(1); // this routine will allow level 2 and above
// // do work within interrupt lock here
// }
// do work outside of interrupt lock here outside its scope
//}
//
#define AutoInterruptLock(intrLevel) \
class _AutoDisableIntr { \
public: \
_AutoDisableIntr() { _savedPS = xt_rsil(intrLevel); } \
~_AutoDisableIntr() { xt_wsr_ps(_savedPS); } \
private: \
uint32_t _savedPS; \
}; \
_AutoDisableIntr _autoDisableIntr

#endif //INTERRUPTS_H

0 comments on commit dfeed84

Please sign in to comment.