-
Notifications
You must be signed in to change notification settings - Fork 3
/
isrperf.ino
73 lines (64 loc) · 1.54 KB
/
isrperf.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
// isrperf
// interrupt latency using cycle counter
// fast port write (bit band) LED 13 *(int *)0x43fe1094 = 1;
// output 13 PTC5 LED input 12 PTC7 jumper 12 to 13
#define FASTISR
#define ROLLOVER ((F_CPU / 1000) - 1)
volatile unsigned int ti;
void isr() {
ti = SYST_CVR; // or do this in pins_teensy.c portc_isr()
#ifdef FASTISR
PORTC_ISFR = ~0; //clear
#endif
}
void setup() {
unsigned int t1,t2,t3,t4,t5;
char str[96];
pinMode(13,OUTPUT);
pinMode(12,INPUT);
GPIOC_PTOR = 1<<5; // LED toggle
Serial.begin(9600);
while (!Serial);
delay(123); // quiesce
t1 = SYST_CVR;
t2 = SYST_CVR;
GPIOC_PTOR = 1<<5;
t3 = SYST_CVR;
digitalWrite(13,LOW); // set bit
t4 = SYST_CVR;
isr();
t5 = SYST_CVR;
sprintf(str,"tick %d set %d write %d fcn %d %d",
t1-t2,t2-t3,t3-t4, t4-ti,ti-t5);
Serial.println(str);
Serial.println("jumper 12 to 13");
attachInterrupt(12,isr,RISING);
#ifdef FASTISR
attachInterruptVector(IRQ_PORTC, isr);
#endif
}
void loop(){
unsigned int t1,t3,t2,t4,t5,mint,maxt,i;
char str[64];
ti=0;
t1 = SYST_CVR;
GPIOC_PTOR = 1<<5; // LED toggle on
while(ti == 0); // wait
t3 = SYST_CVR;
sprintf(str,"%d %d %d isr %d %d",t1,ti,t3,t1-ti,ti-t3);
Serial.println(str);
digitalWrite(13,LOW);
mint=99999; maxt = 0;
for(i=0;i<10000; i++) {
t4 = SYST_CVR;
t3 = millis();
t5 = SYST_CVR;
t2=t4-t5;
if (t2 > ROLLOVER) t2 = ROLLOVER - (t5-t4);
if (t2> maxt) maxt=t2;
if (t2<mint) mint=t2;
}
Serial.print(maxt); Serial.print(" ");
Serial.println(mint);
delay(3000);
}