[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