WinAVR parece producir mucho código inútil, por ejemplo, para el siguiente método C
ISR(INT0_vect) {
TCCR1B = 0x09;
}
produce ( -Os
)
PUSH R1 Push register on stack
PUSH R0 Push register on stack
IN R0,0x3F In from I/O location
PUSH R0 Push register on stack
CLR R1 Clear Register
PUSH R24 Push register on stack
LDI R24,0x09 Load immediate
STS 0x0081,R24 Store direct to data space
POP R24 Pop register from stack
POP R0 Pop register from stack
OUT 0x3F,R0 Out to I/O location
POP R0 Pop register from stack
POP R1 Pop register from stack
RETI Interrupt return
aunque
PUSH R0 Push register on stack
LDI R0,0x09 Load immediate
STS 0x0081,R0 Store direct to data space
POP R0 Pop register from stack
RETI Interrupt return
debería ser suficiente. Dado que estos comandos adicionales llevan tiempo, mi pregunta es: ¿cómo decirle al compilador que produzca sólo el código necesario? ¿O hay alguna herramienta que pueda optimizar el código de bytes directamente?
ACTUALIZACIÓN: He intentado
ISR(INT0_vect, ISR_NAKED) {
asm volatile(
"push r0 \n\t"
"ldi r0, %[value] \n\t"
"sts %[ioReg], r0 \n\t"
"pop r0 \n\t"
"reti \n\t"
: // output
: // input
[ioReg] "M" (_SFR_IO_ADDR(TCCR1B)),
[value] "M" (0 << ICNC1
| 0 << ICES1
| 0 << WGM13
| 1 << WGM12
| 0 << CS12
| 0 << CS11
| 1 << CS10)
);
}
pero el compilador se queja:
c:\temp/ccjBxDFz.s: Assembler messages:
c:\temp/ccjBxDFz.s:30: Error: register number above 15 required
He leído mucha documentación/tutoriales del ensamblador en línea del AVR, pero no consigo que compile.