mirror of
https://github.com/esp8266/Arduino.git
synced 2025-04-22 21:23:07 +03:00
make compatible with existing interrupt lock class
Support both the normal auto lock at all levels, and the lock at a specific level requiring different syntax
This commit is contained in:
parent
57642c10b6
commit
dfeed84ecb
@ -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() )
|
||||
|
@ -8,23 +8,51 @@ extern "C" {
|
||||
#include "ets_sys.h"
|
||||
}
|
||||
|
||||
// these auto classes wrap up xt_rsil so your code can be simplier, but can only be
|
||||
// used in an ino or cpp files.
|
||||
|
||||
#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")
|
||||
// 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
|
||||
|
Loading…
x
Reference in New Issue
Block a user