WinAVR parece producir una gran cantidad de código inútil, por ejemplo, para el siguiente método de 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. Debido a que estos comandos adicionales llevan tiempo, mi pregunta: ¿cómo decirle al compilador que produzca solo el código requerido? ¿O hay una herramienta que puede optimizar el código de byte directamente?
ACTUALIZACIÓN: Lo 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 un montón de documentación / tutoriales de ensambladores en línea de AVR, pero no puedo compilarlos.