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