SFBTicker.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00028 #ifndef SFBTICKER_H_
00029 #define SFBTICKER_H_
00030
00031 #include "SFBTypes.h"
00032 #include "SFBHWPins.h"
00033 #include "SFBHWMisc.h"
00034
00040 enum SFBTickerCategories {
00041 TICKER_BACKGROUND,
00042
00043 TICKER_SERIAL_ISR,
00044
00045 TICKER_OTHER_ISR,
00046
00047 TICKER_PACKET_HANDLER,
00048
00049 TICKER_ALARM_HANDLER,
00050
00051 TICKER_SKETCH0,
00052
00053 TICKER_SKETCH1,
00054
00055 TICKER_SKETCH2,
00056
00057 MAX_TICKERS
00058 };
00059
00079 class SFBTicker {
00080 public:
00081
00099 inline void pushTime(u32 code) {
00100 u32 var;
00101 suspendInterrupts(var);
00102 pushTimeISR(code);
00103 restoreInterrupts(var);
00104 }
00105
00116 inline void popTime() {
00117 u32 var;
00118 suspendInterrupts(var);
00119 popTimeISR();
00120 restoreInterrupts(var);
00121 }
00122
00128 inline void pushTimeISR(u32 code) {
00129 u32 was = top();
00130 push(code);
00131 switchCode(was,top());
00132 }
00133
00139 inline void popTimeISR() {
00140 u32 was = top();
00141 pop();
00142 switchCode(was,top());
00143 }
00144
00155 u32 getUsec(u32 category) ;
00156
00161 u32 getTotalUsec() { return micros()-startUsec; }
00162
00177 void reset(u32 intoState = TICKER_BACKGROUND) ;
00178
00179 private:
00180 u32 totalUsec[MAX_TICKERS];
00181 u32 enterUsec[MAX_TICKERS];
00182 u32 startUsec;
00183 u32 stack;
00184 enum {
00185 BITS = 3,
00186 MASK = (1<<BITS)-1
00187 };
00188 inline u32 crop(u32 code) { return code&MASK; }
00189 inline void push(u32 code) { stack = (stack<<BITS)|crop(code); }
00190 inline void pop() { stack >>= BITS; }
00191 inline u32 top() { return crop(stack); }
00192 inline void switchCode(u32 from, u32 to) {
00193 u32 now = micros();
00194 totalUsec[from] += now - enterUsec[from];
00195 enterUsec[to] = now;
00196 }
00197 };
00198
00203 extern SFBTicker Ticker;
00204
00226 class SFBProfile {
00227 public:
00228
00239 u32 getMsec(u32 tickerCode) ;
00240
00258 u32 getPPM(u32 tickerCode) ;
00259
00264 u32 getTotalMsec() ;
00265
00269 void begin() ;
00270
00275 void end() ;
00276
00277 private:
00278 friend void updateProfile(u32 when, void * arg);
00279 void update(u32 when);
00280 u32 totalMsec[MAX_TICKERS];
00281 u32 totalTime;
00282 u8 alarmNumber;
00283 };
00284
00289 extern SFBProfile Profile;
00290 #endif