[OT] ARM IDE Licence

Jaroslav Buchta jaroslav.buchta na hascomp.cz
Pátek Leden 25 20:43:21 CET 2013


Dekuji za vycerpavajici popis, opravdu super shrnuti a respekt ;-)

Dne 25.1.2013 19:02, Jan Waclawek napsal(a):
>> 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
>
>
>
> _______________________________________________
> 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