[OT] ARM IDE Licence

Jan Waclawek konfera na efton.sk
Pátek Leden 25 19:02:38 CET 2013


>To je prave vec, co jsem chtel tim souctem zkusit, ale v assembleru jsem 
>nejak nebyl moudry...
>Ten reg. s15 je v FPU? 

Ano.

>A ten soucet adddf3 ji take pouziva? 

Nie.

Ten sucet (implementovany kniznicnou funkciou kompilatora ako adddf3) je
totiz implicitne double
http://en.wikipedia.org/wiki/Double-precision_floating-point_format (kvoli
typovacim pravidlam jazyka C, ktore sme tu uz x-krat preberali) a FPU v
Cortex-M4 je single-precision
http://en.wikipedia.org/wiki/Single-precision_floating-point_format , t.j.
"len" "float" (32-bit). Preto je tam volana aj _f2d (float-to-double) a
_d2f (double-to-float), s naslednou konverziou single floatu pomocou FPU
na integer (kvoli naslednemu pouzitiu v Delay()).

Ak 
float f = x + 2.1;
zmenite na 
float f = x + 2.1f;
tak ten vypocet uz bude ciste single-precision a prekladac to prelozi ako
(mam zapnutu optimalizaciu takze veci su trocha poprehadzovane, ukazem len
relevantne casti)


(Teraz jedna medzipoznamka: Cortex-Mx jadra do znacnej miery "trpia" tym,
ze kym datove slovo je 32-bitove, instrukcne slovo spracovavane v jednom
takte je 16-bitove (implementovana je len tzv. "Thumb2" instrukcna
pod-sada) (pozor, neznamena to, ze su instrukcie 16-bitove, znacna cast
instrukcii je dvoj-pol-slovnych, zhodou okolnosti vsetky instrukcie v
nasej ukazke su tohoto druhu). To sice dramaticky zmensuje pocet hradiel
jadra (citaj: plochu kremika, citaj: cenu cipu), na druhej strane je to
vsak robi problematickym nacitanie konstanty do 32-bitoveho registra
jadra. Preto sa na to ide v roznych situaciach roznymi sposobmi, a zhodou
okolnosti tu mame dve typicke ukazky. Preto som si dovolil trocha odbocit
a ukazat, ako sa to robi...)

    float f = x + 2.1f;
 8000a3a:	ed9f 7a38 	vldr	s14, [pc, #224]	; 8000b1c <main+0x154> 
  [...] 
 8000b1c:	40066666 	.word	0x40066666
Tu je ta 32-bitova konstanta, reprezentujuca 2.1 v single precision (vid
napr. http://www.binaryconvert.com/result_float.html?decimal=050046049 )
ulozena priamo v pamati (v programovej pamati FLASH, je ulozena hned za
funkciou v ktorej je pouzita) a cita sa nepriamo. Ako bazovy register je
pouzity register r15, ktory je v jadrach ARM priamo programovym citacom.
Vyhoda tejto metody je, ze sa da pouzit akakolvek konstanta; nevyhoda je,
ze sa k FLASH nepristupuje sekvencne (co kazi vselijake cachingy a
prefetche a podobne) a ze ten ofset nemoze byt lubovolne velky, t.j. sa to
neda pouzit (resp. je to problematickejsie) u dlhych funkcii. Na citanie
je pouzita instrukcia FPU ktora konstantu cita rovno do registra FPU.

Nasleduje dalsie krkolomne nacitanie 32-bitovej konstanty, tentokrat po
pol-slovach dvojicou instrukcii ktore su obe dvoj-instrukcno-polslovne:
    volatile float x = 3.0;
 8000a40:	f04f 0800 	mov.w	r8, #0                        do spodneho
halfwordu r8 sa da 0
    volatile float x = 3.0;
 8000a58:	f2c4 0840 	movt	r8, #16448	; 0x4040      do horneho halfwordu r8
sa da 0x4040 - to je spolu 3.0 v single precision
 (vid napr.
http://www.binaryconvert.com/result_float.html?hexadecimal=40400000 )
    volatile float x = 3.0;
 8000ae6:	f8cd 8004 	str.w	r8, [sp, #4]                  kedze je x
volatile, musi sa hodnota ulozit - kedze je x ne-static lokalna, uklada
 sa na stack frame (je to pomerne nezmyselna kombinacia, vhodna len na
ladenie, aby nam tu premennu prekladac nevyoptimalizoval)
    float f = x + 2.1f;
 8000aea:	eddd 7a01 	vldr	s15, [sp, #4]                 kedze je x
volatile, musi sa aj nacitat; rovno sa cita instrukciou FPU ktora ju
 ulozi do registra s15 v FPU
 8000aee:	ee77 7a87 	vadd.f32	s15, s15, s14         toto je samotne scitanie
    Delay (f);
 8000af2:	eefc 7ae7 	vcvt.u32.f32	s15, s15              a toto je konverzia
z float na binary
 8000af6:	ee17 ca90 	vmov	ip, s15                       a napokon sa
vysledna binary hodnota prenesie do registra r12 (zvaneho z roznych
dovodov aj ip), kde ju pouziva nasledny kod implementujuci Delay()



Do pozornosti okrem ineho davam PM0214 (STM32F4xx Cortex-M4 programming
manual, ST-ov vycuc z kompletneho ARMovskeho Cortex-M4 manualu)
http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/PROGRAMMING_MANUAL/DM00046982.pdf
, kap.4.6 a kap.3.10.


wek





Další informace o konferenci Hw-list