<html><body>Obsluha swi (kterou nemůžu změnit, neboť je součástí jakési lib, od které nemám zdrojáky) dělá toto: Pokud je parametr 458752, zapne privilegovaný režim. Pak je možno např. použít MRC p15.<br><br>Nakonec jsem našel i manuál jménem spnu151j a v něm je toto:<br><br>Do not change the value of a C/C++ variable when using an asm statement. This is<br>because the compiler does not verify such statements. They are inserted as is into the<br>assembly code, and potentially can cause problems if you are not sure of their effect<br><br>Chápu-li to správně, požadovanou věc provést lze, ale autor manuálu to nedoporučuje.<br>Ale pořád nevím jak. Navíc se vůbec nezmiňují o opačné cestě, tedy použití hodnoty z proměnné v inline asm, s čímž by tento problém být neměl.<br><br>PH<br><br>Od: Josef Štengl <ok1ced@nagano.cz><br><blockquote>Ehm, nedorozumění. Vy jste chtěl asm v C a já to pochopil jako mezi C a ASM zdrojovým souborem.<br>To nejde. Viz manuál ke kompilátoru C. Předávání proměnných nepodporuje. Tedy jestli se za poslední rok nic nezměnilo.<br><br>Je třeba to uďát jako ASM funkci a parametr je možno v SVC přerušení<br>a) přečíst z proměnné (rychlejší a nezávislé na ARM/THUMB2 a endianitě<br>b) přečíst instrukci svc v svc přerušení a bude to v armu, páč se to číslo do thumb2 nevejde.<br><br>A není mi jasné, proč do swi cpete tak velké číslo, když ho nečtete. Ale na vysvětlení netrvám, je to jen poznámka.<br><br>Jen mimochodem, je lepší psát __asm(...) místo asm(...). Ale to je věc jazykového purizmu, na funkci živočicháře to nemá vliv.<br><br>Dne 22.1.2015 v 20:34 Pavel Hudeček napsal(a):<br>> Odhad byl správný, jedná se o arm, konkrétně AM3358.<br>> Překladač Ti v5.1.1<br>> K výsledku to zatím nevede:<br>><br>> .       asm(" .ref ble\n"<br>> .                " ldr r1,ble\n"<br>> .                " swi #458752\n"<br>> .                " mrc p15, #0, r0, c12, c0, #0\n"<br>> .                " str [r1], r0\n"<br>> .       );<br>><br>>   [W0000]<br>>           Defined symbol 'ble' cannot have a .ref<br>>       .ref ble<br>><br>>   [E0001]<br>>           Address must be defined in the current section<br>>       ldr r1,ble<br>><br>>   [E0004]<br>>           Illegal operand<br>>       ldr r1,ble<br>><br>>   [E0005]<br>>           Missing operand(s)<br>>       str [r1], r0<br>><br>> ble je globální proměnná typu uint32_t. Když jsem ji ještě navíc udělal static, zmizel první warning, ale zbytek zůstal.<br>> Lokální static i nestatic též jen s errory.<br>><br>> Od: Josef Štengl <ok1ced@nagano.cz><br>>     Správně se zeptat :-)<br>>     1) Cílová platforma/procesor (lépe platforma, než označení čipu)<br>>     2) Překladač který používáte - asm zápisy se různí.<br>><br>>     Pak si najít manuál k překladači. A je - li to Texas, tak popis assembleru bude v jiném manuálu.<br>><br>>     Jinak je to věštění z křišťálové koule (bohužel nemám žádnou funkční ;-).<br>><br>><br>>     Z hlavy střelím jen možnost pro ARM a ti překladač. Ale vzhledem k tomu, že pojem ctg mi nic neříká, tak to můžete být<br>>     třeba pro C6000, což neznám (jen trochu C2000, mršku jednu proradnou):<br>><br>>     .ref n<br>>     ldr r1, n ; adresa do r1<br>>     ldr r0, [r1] ; hodnota do r0<br>><br>>     opačně<br>>     ldr r1, n ; adresa do r1<br>>     str r0, [r1] ; hodnota z r0 do n<br>><br>>     Dne 22.1.2015 v 15:28 Pavel Hudeček napsal(a):<br>>      > mám proměnnou n, která obsahuje 32b unsigned int a chtěl bych ji dostat do registru r0. Jindy zas potřebuji opačný<br>>     přenos.<br>>      ><br>>      > Při gůglení jsem našel, že by to v gcc mělo jít takto: mov r0,n. Jenže tak to nejde, takže se tu asi používá jiný<br>>      > překladač. (některé věci ze starterwaru mají dvě verze, jednu v adresáři gcc, druhou v cgt. Pokud první obsahuje<br>>     asm, tak<br>>      > mi obvykle nejde přeložit)<br>>      ><br>>      > Jak to tedy správně dělat? / Jak se správně ptát?</blockquote></body></html>