<html>
<head>
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<font face="Helvetica, Arial, sans-serif">Rozdelovani na vic radku a
dokonce ani vkladani ruznych meziinstrukci nepomaha...<br>
<br>
Protoze se nemuzu spolehnout na to, ze to priste nezoptimalizuje
jinak, zkusil jsem pouzit inline assembler.<br>
<br>
__asm {LDR data,[addr,#0]}<br>
test_send (data, 4); // LDR r0,[r5,#0] works well...<br>
addr += 4;<br>
<br>
<br>
data = test_receive (4, 0);<br>
__asm volatile {STR data,[addr,#0]}<br>
addr += 4;<br>
<br>
Prvni pripad je IMHO jasny - volani funkce zafunguje jako
dostatecna bariera pro optimalizaci, takze LDR se pouzije (na to
jsem prisel uz na zacatku).<br>
<br>
V druhem pripade kompilator tvrdosijne ukazuje vlastni
inteligenci: i pres explicitni zapsani instrukce je ve vyslednem
kodu opet STM.<br>
<br>
Po rade ruznych (vice ci mene zmatenych pokusu:-) nakonec
zafungovalo:<br>
__asm volatile {<br>
STR data,[addr,#0]<br>
ADDS addr,addr,#4<br>
}<br>
I kdyz je mozne, ze po pripadnem upgradu na novou verzi prekladace
to zas prestane fungovat...<br>
<br>
Hynek<br>
<br>
<br>
</font>
<div class="moz-cite-prefix">Dne 8.7.2015 14:31, Tomáš Hamouz
napsal(a):<br>
</div>
<blockquote cite="mid:1223881964.20150708143155@divesoft.cz"
type="cite">
<pre wrap="">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 <a class="moz-txt-link-freetext" href="http://www.efton.sk/sk/volatile.htm">http://www.efton.sk/sk/volatile.htm</a>
Tomáš
</pre>
</blockquote>
</body>
</html>