Оптимизатор иногда творит чудеса
[Отвлекусь на минутку.
Пока писатели компиляторов недалеко продвинулись. Вот пример из вашего lst-файла
0000001c <__do_copy_data>:
__do_copy_data():
1c: 10 e0 ldi r17,0x00 ;0
1e: a0 e6 ldi r26,0x60 ;96
20: b0 e0 ldi r27,0x00 ;0
22: ee e2 ldi r30,0x2E ;46
24: f2 e0 ldi r31,0x02 ;2
26: 02 c0 rjmp .+4 ;0x2c <__do_copy_data+0x10>
28: 05 90 lpm r0,Z+
2a: 0d 92 st X+,r0
2c: a2 36 cpi r26,0x62 ;98
2e: b1 07 cpc r27,r17
30: d9 f7 brne .-10 ;0x28 <__do_copy_data+0xc>
Здесь копируются два байта из флеши с начальным адресом 0х02ЕЕ в ОЗУ 0х060
Программист просто бы коротко написал
lpm r16,z+
sts 0x060,r16
lpm r16,z
sts 0x061,r16
Ну и где тут пресловутая оптимизация?
Абсурд ситуации усиливается тем фактом, что в этих адресах ничего нет! Нечего копировать!
Далее очищается 5 байт ОЗУ, тоже никакой оптимизации
00000032 <__do_clear_bss>:
__do_clear_bss():
32: 20 e0 ldi r18, 0x00 ; 0
34: a2 e6 ldi r26, 0x62 ; 98
36: b0 e0 ldi r27, 0x00 ; 0
38: 01 c0 rjmp .+2 ; 0x3c <.do_clear_bss_start>
3a: 1d 92 st X+, r1
3c: a7 36 cpi r26, 0x67 ; 103
3e: b2 07 cpc r27, r18
40: e1 f7 brne .-8 ; 0x3a <.do_clear_bss_loop>
Переход на главную программу мэйн. В конце мэйна стоит ловушка - бесконечный цикл, поэтому нет выхода.
Но нет, оптимизатор после мэйна ставит ещё одну ловушку! Это насмешка над оптимизацией!
42: 01 d0 call .+2 ; 0x46 <main>
44: f2 c0 rjmp .+484 ; 0x22a <_exit>
И ещё за каким-то шутом в скомпилированную программу воткнули п/п обработку прерывания от таймера, хотя она и не используется! Тоже апофеоз оптимизации!
Извините за оффтоп, просто давно уже надоели эти разговоры про оптимизацию.]