@s.frings

Versuchs mal mit dem Code
Code:
 
ISR(TIMER0_COMP_vect) {
    unsiged char tmp = ICR1L;
    ICR1L = ++tmp;
    if (tmp==100) {
        ICR1L=0;
        system_time++;
    }
}
Das sollte zumindest das out-in eliminieren, weil auf ICR1L in diesem fall nur zweimal zugegriffen wird. Das pushen/poppen der Register lässt sich AFAIK nicht so einfach umgehen, weil der GCC grundsätzlich alle möglicherweise benötigten Register bereits beim Funktionseintritt sichert (glaub ich zumindest irgendwo gelesen zu haben).

Ist es denn zwingend notwendig, dass system_time 32 Bit breit ist? Mit 16 Bit könnten 10 Takte eingespart werden.

Ansonsten bleibt eben nur das mehrfach erwähnte Schreiben der Funktion per Hand in Asm.

MfG Mark