ARM Cortex-M0+ a rozdil LDM a LDR

Hynek Sladky econf na centrum.cz
Středa Červenec 8 14:46:54 CEST 2015


Rozdelovani na vic radku a dokonce ani vkladani ruznych meziinstrukci 
nepomaha...

Protoze se nemuzu spolehnout na to, ze to priste nezoptimalizuje jinak, 
zkusil jsem pouzit inline assembler.

           __asm {LDR data,[addr,#0]}
           test_send (data, 4); // LDR r0,[r5,#0] works well...
           addr += 4;


           data = test_receive (4, 0);
           __asm volatile {STR data,[addr,#0]}
           addr += 4;

Prvni pripad je IMHO jasny - volani funkce zafunguje jako dostatecna 
bariera pro optimalizaci, takze LDR se pouzije (na to jsem prisel uz na 
zacatku).

V druhem pripade kompilator tvrdosijne ukazuje vlastni inteligenci: i 
pres explicitni zapsani instrukce je ve vyslednem kodu opet STM.

Po rade ruznych (vice ci mene zmatenych pokusu:-) nakonec zafungovalo:
           __asm volatile {
             STR data,[addr,#0]
             ADDS addr,addr,#4
           }
I kdyz je mozne, ze po pripadnem upgradu na novou verzi prekladace to 
zas prestane fungovat...

Hynek


Dne 8.7.2015 14:31, Tomáš Hamouz napsal(a):
> Zkuste mu vnutit rozdělení těch operací.
> Na starších ARMech funguje
>
>     *ptr = data;
>     asm volatile ("");      // ano, opravdu prazdny kus assembleru
>     ptr++;
>
>     pripadne tam ten nop vnutit
>
>     *ptr = data;
>     asm volatile ("nop\r\n");
>     ptr++;
>
>
> Na Cortexech jsou na to nějaké pseudoindstrukce.
> Prostudujte také toto http://www.efton.sk/sk/volatile.htm
>
> Tomáš
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20150708/3be30be9/attachment.html>


Další informace o konferenci Hw-list