Zur Zeitmessung im Sub-Mikrosekundenbereich steht kein freier Timer zur Verfügung, sondern nur einer der bereits als PWM-Generator mit hoher Wiederholfrequenz arbeiten muss.
| C++-Quelle | Kompilat | Verbesserung 1 | Verbesserung 2 | Verbesserung 3 |
|---|---|---|---|---|
// Zähler mit Schrittweite 150
static volatile unsigned t1h;
ISR(TIMER1_CAPT_vect) {
t1h+=150;
}
|
__vector_14: |
Unnötig gerette Register R0 und R1
.global __vector_14 __vector_14: push r0 in r0,SREG push r24 |
Nur ein Rechenregister-Byte
.global __vector_14 __vector_14: |
register unsigned isrsave asm("r2");
Gar kein (teures) push mehr
.global __vector_14 __vector_14: in r3,SREG mov r2,r24 lds r24,t1h subi r24,lo8(-150) sts t1h,r24 lds r24,t1h+1 sbci r24,hi8(-150) sts t1h+1,r24 mov r24,r2 out SREG,r3 reti |
| bei ≤ 8 KByte Flash | bei ≥ 16 KByte Flash |
|---|---|
|
|
Da die ISR alle 150 Takte aufgerufen wird ist die CPU-Last auf einem ATmega16U2 vorher 29 % und nachher 17 %. Auf einem ATmega32U4 wiederum wäre gar keine ISR vonnöten, dieser hat einen Timer mehr.