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 interrupts() xt_rsil(0)
|
||||||
#define noInterrupts() xt_rsil(15)
|
#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 clockCyclesPerMicrosecond() ( F_CPU / 1000000L )
|
||||||
#define clockCyclesToMicroseconds(a) ( (a) / clockCyclesPerMicrosecond() )
|
#define clockCyclesToMicroseconds(a) ( (a) / clockCyclesPerMicrosecond() )
|
||||||
|
@ -8,23 +8,51 @@ extern "C" {
|
|||||||
#include "ets_sys.h"
|
#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))
|
// InterruptLock is used when you want to completely disable locks
|
||||||
#define xt_enable_interrupts(state) __asm__ __volatile__("wsr %0,ps; isync" :: "a" (state) : "memory")
|
//{
|
||||||
|
// {
|
||||||
|
// InterruptLock lock;
|
||||||
|
// // do work within interrupt lock here
|
||||||
|
// }
|
||||||
|
// do work outside of interrupt lock here outside its scope
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
|
||||||
class InterruptLock {
|
class InterruptLock {
|
||||||
public:
|
public:
|
||||||
InterruptLock() {
|
InterruptLock() {
|
||||||
xt_disable_interrupts(_state, 15);
|
_state = = xt_rsil(15);
|
||||||
}
|
}
|
||||||
|
|
||||||
~InterruptLock() {
|
~InterruptLock() {
|
||||||
xt_enable_interrupts(_state);
|
xt_wsr_ps(_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
uint32_t _state;
|
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
|
#endif //INTERRUPTS_H
|
||||||
|
Loading…
x
Reference in New Issue
Block a user