Predavani hodnot mezi asm a C v CCS 550

Josef Štengl ok1ced na nagano.cz
Sobota Leden 24 11:08:56 CET 2015


Ještě bych na začátek uložil r0 na konci obnovil, aby se mi nepřepisovala, když ji měním překladači pod rukou. Může to 
dělat zajímavé efekty, i když ve vašem případě je to asi jedno.

__asm(
     " swi #458752\n"
.   " stmfd sp!, {r0}\n"
...
.   " ldmfd sp!, {r0}\n"
);

Jako pokus ano, takové jednoduše přímé řešení, ale byl bych opatrný to zobecňovat. Při různé optimalizaci mají registry 
tendenci měnit čísla. A dost blbě se to pak hledá :-(. Taky důvod proč jsem opustil inline asm v C (vyjma jednoduchých 
operací neměníc registry).

Mimochodem, v jakém CPU módu pokračujete, nebo to už není součást pokusu?

ced




Dne 23.1.2015 v 20:50 Pavel Hudeček napsal(a):
> Protože se jedná o pokus, stačilo provizorní řešení: Podívat se, jak ukládá hodnoty do pole a pak prostě mezi jeho
> přístupy k poli umístit svoje:-)
> (čísla v komentářích jsou přečtené výsledky)
>
> p32[1]=0x123456;
> //p32[2]=&bleble;
> asm(
> .   " swi #458752\n"
> .   " mrc p15, #0, r0, c0, c0, #3\n" // c0, TLB Type Register
> .   " str r0, [v3, #16]\n"           // 01202000
> .   " mrc p15, #0, r0, c1, c0, #0\n" // c1, Control Register
> .   " str r0, [v3, #16+4]\n"     // 7d18c500
> .   " mrc p15, #0, r0, c1, c1, #2\n" // c1, Nonsecure Access Control Register
> .   " str r0, [v3, #16+8]\n"     // 000c0700
> .   " mrc p15, #0, r0, c2, c0, #0\n" // c2, Translation Table Base Register 0
> .   " str r0, [v3, #16+12]\n"     // 00400c80
> .   " mrc p15, #0, r0, c2, c0, #1\n" //    c2, Translation Table Base Register 1
> .   " str r0, [v3, #16+16]\n"     // 0
> .   " mrc p15, #0, r0, c2, c0, #2\n" // c2, Translation Table Base Control Register
> .   " str r0, [v3, #16+20]\n"     // 0
> .   " mrc p15, #0, r0, c3, c0, #0\n" // c3, Domain Access Control Register
> .   " str r0, [v3, #16+24]\n"     // 55555555
> .   " mrc p15, #0, r0, c5, c0, #0\n" // c5, Data Fault Status Register
> .   " str r0, [v3, #16+28]\n"     // 0
> .   " mrc p15, #0, r0, c5, c0, #1\n" // c5, Instruction Fault Status Register
> .   " str r0, [v3, #16+32]\n"     // 0
> .   " mrc p15, #0, r0, c6, c0, #0\n" // c6, Data Fault Address Register
> .   " str r0, [v3, #16+36]\n"     // 0
> .   " mrc p15, #0, r0, c6, c0, #2\n" // c6, Instruction Fault Address Register
> .     // 0
> .     // c8, TLB operations
> .   " str r0, [v3, #16+40]\n"
> .   " mrc p15, #0, r0, c10, c0, #0\n" // c10, TLB Lockdown Registers - data
> .   " str r0, [v3, #16+44]\n"     // 0000c013
> .   " mrc p15, #0, r0, c10, c0, #1\n" // c10, TLB Lockdown Registers - instr
> .   " str r0, [v3, #16+48]\n"     // 00000011
> .   " mrc p15, #0, r0, c10, c2, #0\n" // c10, Memory Region Remap Registers - prim
> .   " str r0, [v3, #16+52]\n"     // a48a0900
> .   " mrc p15, #0, r0, c10, c2, #1\n" // c10, Memory Region Remap Registers - norm
> .   " str r0, [v3, #16+56]\n"     // e048e044
> .   " mrc p15, #0, r0, c13, c0, #0\n" // c13, FCSE PID Register
> .   " str r0, [v3, #16+60]\n"     // 0
> .   " mrc p15, #0, r0, c13, c0, #1\n" // c13, Context ID Register
> .   " str r0, [v3, #16+64]\n"     // 0
> );
> p32[2]=bleble;
>
>
> -------------------------------------
>
> a takhle to přeložil:
>
>
>   LDR       V9, $C$CON158         ; [DPU_8_PIPE0] |965|
>   STR       V9, [V3, #4]          ; [DPU_8_PIPE0] |965|
>
>   swi #458752
>   mrc p15, #0, r0, c0, c0, #3
>   str r0, [v3, #16]
>   mrc p15, #0, r0, c1, c0, #0
>   str r0, [v3, #16+4]
>   mrc p15, #0, r0, c1, c1, #2
>   str r0, [v3, #16+8]
>   mrc p15, #0, r0, c2, c0, #0
>   str r0, [v3, #16+12]
>   mrc p15, #0, r0, c2, c0, #1
>   str r0, [v3, #16+16]
>   mrc p15, #0, r0, c2, c0, #2
>   str r0, [v3, #16+20]
>   mrc p15, #0, r0, c3, c0, #0
>   str r0, [v3, #16+24]
>   mrc p15, #0, r0, c5, c0, #0
>   str r0, [v3, #16+28]
>   mrc p15, #0, r0, c5, c0, #1
>   str r0, [v3, #16+32]
>   mrc p15, #0, r0, c6, c0, #0
>   str r0, [v3, #16+36]
>   mrc p15, #0, r0, c6, c0, #2
>   str r0, [v3, #16+40]
>   mrc p15, #0, r0, c10, c0, #0
>   str r0, [v3, #16+44]
>   mrc p15, #0, r0, c10, c0, #1
>   str r0, [v3, #16+48]
>   mrc p15, #0, r0, c10, c2, #0
>   str r0, [v3, #16+52]
>   mrc p15, #0, r0, c10, c2, #1
>   str r0, [v3, #16+56]
>   mrc p15, #0, r0, c13, c0, #0
>   str r0, [v3, #16+60]
>   mrc p15, #0, r0, c13, c0, #1
>   str r0, [v3, #16+64]
>
>
> PH
>
>
> Od: Josef Štengl <ok1ced na nagano.cz>
>
>     Hmm. Že posílám maily s chybným obsahem to vím, ale že i ty co jsem nechtěl, protože mi došlo že píši kraviny ... :-(
>     Adr existuje.
>
>
>     Dne 23.1.2015 v 15:07 Pavel Hudeček napsal(a):
>      > Zajímavé je, že chybu to hlásilo stejnou s ldr i adr:-)
>      > Asi se dělá kontrola operandů ještě před kontrolou instrukcí.
>      >
>      > Od: Josef Štengl <ok1ced na nagano.cz>
>      > No bodeď, když adr není instrukce ARMu :-D
>      >
>      > Dne 22.1.2015 v 21:02 Pavel Hudeček napsal(a):
>      > > Počet errorů klesl na 1:
>      > >
>      > > [E0004]
>      > > Illegal operand
>      > > adr r1, ble
>      > >
>      > > Od: Tom Meinlschmidt <hw na meinlschmidt.org>
>      > > tipnul bych
>      > >
>      > > .global ble\n
>      > > adr r1, ble\n
>      > >
>      > > > On Jan 22, 2015, at 20:34 , Pavel Hudeček <edizon na seznam.cz> wrote:
>      > > >
>      > > > 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?
>
>
>
> _______________________________________________
> 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