Predavani hodnot mezi asm a C v CCS 550

Pavel Hudeček edizon na seznam.cz
Čtvrtek Leden 22 21:38:05 CET 2015


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.

Nakonec jsem našel i manuál jménem spnu151j a v něm je toto:

Do not change the value of a C/C++ variable when using an asm statement. 
This is
because the compiler does not verify such statements. They are inserted as 
is into the
assembly code, and potentially can cause problems if you are not sure of 
their effect

Chápu-li to správně, požadovanou věc provést lze, ale autor manuálu to 
nedoporučuje.
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.

PH

Od: Josef Štengl <ok1ced na nagano.cz>
"Ehm, nedorozumění. Vy jste chtěl asm v C a já to pochopil jako mezi C a ASM
zdrojovým souborem.
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.

Je třeba to uďát jako ASM funkci a parametr je možno v SVC přerušení
a) přečíst z proměnné (rychlejší a nezávislé na ARM/THUMB2 a endianitě
b) přečíst instrukci svc v svc přerušení a bude to v armu, páč se to číslo 
do thumb2 nevejde.

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.

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.

Dne 22.1.2015 v 20:34 Pavel Hudeček napsal(a):
> Odhad byl správný, jedná se o arm, konkrétně AM3358.
> Překladač Ti v5.1.1
> K výsledku to zatím nevede:
>
> . asm(" .ref ble\n"
> . " ldr r1,ble\n"
> . " swi #458752\n"
> . " mrc p15, #0, r0, c12, c0, #0\n"
> . " str [r1], r0\n"
> . );
>
> [W0000]
> Defined symbol 'ble' cannot have a .ref
> .ref ble
>
> [E0001]
> Address must be defined in the current section
> ldr r1,ble
>
> [E0004]
> Illegal operand
> ldr r1,ble
>
> [E0005]
> Missing operand(s)
> str [r1], r0
>
> 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.
> Lokální static i nestatic též jen s errory.
>
> Od: Josef Štengl <ok1ced na nagano.cz>
> Správně se zeptat :-)
> 1) Cílová platforma/procesor (lépe platforma, než označení čipu)
> 2) Překladač který používáte - asm zápisy se různí.
>
> Pak si najít manuál k překladači. A je - li to Texas, tak popis assembleru
bude v jiném manuálu.
>
> Jinak je to věštění z křišťálové koule (bohužel nemám žádnou funkční ;-).
>
>
> 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
> třeba pro C6000, což neznám (jen trochu C2000, mršku jednu proradnou):
>
> .ref n
> ldr r1, n ; adresa do r1
> ldr r0, [r1] ; hodnota do r0
>
> opačně
> ldr r1, n ; adresa do r1
> str r0, [r1] ; hodnota z r0 do n
>
> Dne 22.1.2015 v 15:28 Pavel Hudeček napsal(a):
> > 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ý
> přenos.
> >
> > 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ý
> > překladač. (některé věci ze starterwaru mají dvě verze, jednu v adresáři
gcc, druhou v cgt. Pokud první obsahuje
> asm, tak
> > mi obvykle nejde přeložit)
> >
> > Jak to tedy správně dělat? / Jak se správně ptát?"
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20150122/389c85f6/attachment.html>


Další informace o konferenci Hw-list