Имею (вредную?) привычку после компиляции смотреть листинг, чтобы оценить насколько результат близок к тому, что я написал бы на ассемблере. И, как всегда, смотрю, и сердце кровью обливается. Это даже при том, что я в армовском ассемблере почти ничего не понимаю. Поначалу у меня была сравнительно старая версия иара - 4.40A, и я решил что неоптимальность связанна именно с этим. Поэтому скачал 5.11. Код действительно стал лучше, но не на много. Наиболее непонятны для меня некоторые операции со стеком, которые компилятор вставляет при входе/выходе из процедуры при компиляции в режиме THUMB. Вот достаточно простой пример:
Код
3 void putchar( char a)
4 {
\ putchar:
\ 00000000 01B5 PUSH {R0,LR}
5 AT91PS_USART pUSART = AT91C_BASE_US0;
6
7 while( !(pUSART->US_CSR & AT91C_US_TXRDY) );
\ ??putchar_0:
\ 00000002 0449 LDR R1,??putchar_1 ;; 0xfffc0014
\ 00000004 0968 LDR R1,[R1, #+0]
\ 00000006 8907 LSLS R1,R1,#+30
\ 00000008 FBD5 BPL ??putchar_0
8 pUSART->US_THR = a;
\ 0000000A 0249 LDR R1,??putchar_1 ;; 0xfffc0014
\ 0000000C 8860 STR R0,[R1, #+8]
9 }
\ 0000000E 08BC POP {R3}
\ 00000010 01BC POP {R0}
\ 00000012 0047 BX R0 ;; return
\ ??putchar_1:
\ 00000014 1400FCFF DC32 0xfffc0014
4 {
\ putchar:
\ 00000000 01B5 PUSH {R0,LR}
5 AT91PS_USART pUSART = AT91C_BASE_US0;
6
7 while( !(pUSART->US_CSR & AT91C_US_TXRDY) );
\ ??putchar_0:
\ 00000002 0449 LDR R1,??putchar_1 ;; 0xfffc0014
\ 00000004 0968 LDR R1,[R1, #+0]
\ 00000006 8907 LSLS R1,R1,#+30
\ 00000008 FBD5 BPL ??putchar_0
8 pUSART->US_THR = a;
\ 0000000A 0249 LDR R1,??putchar_1 ;; 0xfffc0014
\ 0000000C 8860 STR R0,[R1, #+8]
9 }
\ 0000000E 08BC POP {R3}
\ 00000010 01BC POP {R0}
\ 00000012 0047 BX R0 ;; return
\ ??putchar_1:
\ 00000014 1400FCFF DC32 0xfffc0014
Несмотря на то, что в функции не происходит вызова других функций, зачем-то в стек сохраняется LR. Более того, с ним за компанию сохраняется параметр, передаваемый в функцию, который потом восстанавливается в r3

Это кривость компилятора? или я чего-то не так делаю? Пугает то, что даже такую простую функцию откомпилить нормально не получается. Это чтож будет на реальных программах. Так недолго довести производительность ARM до уровня AVR
