Для кода:
uint8_t count;
ISR(TIMER1_OVF_vect, ISR_NAKED)
{
count++;
reti();
}
Сгенерированная сборка:
--- F:\atmel-prj\compiler-test2\compiler-test2\Debug/.././compiler-test2.c -----
{
00000048 PUSH R1 Push register on stack
00000049 PUSH R0 Push register on stack
0000004A IN R0,0x3F In from I/O location
0000004B PUSH R0 Push register on stack
0000004C CLR R1 Clear Register
0000004D PUSH R24 Push register on stack
count++;
0000004E LDS R24,0x0100 Load direct from data space
00000050 SUBI R24,0xFF Subtract immediate
00000051 STS 0x0100,R24 Store direct to data space
}
00000053 POP R24 Pop register from stack
00000054 POP R0 Pop register from stack
00000055 OUT 0x3F,R0 Out to I/O location
00000056 POP R0 Pop register from stack
00000057 POP R1 Pop register from stack
00000058 RETI Interrupt return
Теперь, насколько я понимаю, можно исключить как минимум одну, а то и две пары push-pop:
чтобы сохранить один push-pop, устраните r24, используя вместо него r0
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 count++; LDS R0,0x0100 Load direct from data space SUBI R0,0xFF Subtract immediate STS 0x0100,R0 Store direct to data space ...
Обратите внимание, что ни один код не использует r1 для значения 0, поэтому используйте только r1 для всех целей.
PUSH R1 Push register on stack IN R1,0x3F In from I/O location PUSH R1 Push register on stack CLR R1 Clear Register count++; LDS R0,0x0100 Load direct from data space SUBI R0,0xFF Subtract immediate STS 0x0100,R0 Store direct to data space ...
Любой из них экономит нам драгоценные байты и микросекунды.
Есть ли способ, которым я могу каким-то образом поместить эти или подобные оптимизации в цепочку инструментов/библиотеки atmel studio, чтобы мой скомпилированный код генерировался немного лучше?
Много кода, связанного с прерываниями и вызовами функций, а также некоторые переводы с языка C на ассемблер можно многое оптимизировать.