Predavani hodnot mezi asm a C v CCS 550

Josef Štengl ok1ced na nagano.cz
Čtvrtek Leden 22 21:21:38 CET 2015


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.

ced


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.
>
> PH
>
>
> 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
>
>     ced
>
>
>
>
>     Dne 22.1.2015 v 15:28 Pavel Hudeček napsal(a):
>      > Dobrý den všem,
>      > 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?
>      >
>      > Děkuji,
>      > PH
>      >
>      >
>      > _______________________________________________
>      > HW-list mailing list - sponsored by www.HW.cz
>      > Hw-list na list.hw.cz
>      > http://list.hw.cz/mailman/listinfo/hw-list
>      >
>     _______________________________________________
>     HW-list mailing list - sponsored by www.HW.cz
>     Hw-list na list.hw.cz
>     http://list.hw.cz/mailman/listinfo/hw-list
>
>
>
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>


Další informace o konferenci Hw-list