PIC vs ATMEL #2

Nagy Endre gumo at lucifer.kgt.bme.hu
Wed Feb 11 22:56:40 CET 2004


> > Megoldhato, de minek? C-be szokas asm betetet tenni olyan helyeken, ahol
> > az elengedhetetlen. Ha az IIR szurodnel par utasitas kulonbseg mar
> > halalos, akkor beteheted asm-be.
>
> Van ott meg mas is, pl infra kommunikacio, AD mukodtetes, grafikus
> lcd kezeles, hanggeneralas PWM-el mexakitasbol, stb... Ezeket mindet
> asm-ben kell megirni, nem tudom mit lehetne C-ben...

Gyakorlatilag mindegyiket jol meg lehet irni C-ben. Optimalizacio utan
remek kod lesz belole, mintha csak asm-ben irtak volna.

> Foleg hogy a mexakitasok nem mentik el memoriaba a regisztereket,
> hanem le van foglalva nehany amit a foprogram nem hasznal, a nagyobb
> sebesseg erdekeben. Ezt hogy lehetne megcsinalni C-bol?
> (Ez komolyan erdekel, van megoldas?)

A gcc szerintem csak akkor csinalja ezt, ha tul sok szabad regisztere
marad az optimalizaciokor. Az asm direktiva mondjuk tud olyat, hogy
regisztereket tartsunk fenn a C kod elol, ha jol remlik, az inline asm
doksiban van a mikentje leirva (ritka ronda).

> irtam is a listara, ki akartam deriteni hogy hogyan adhatok at
> parametereket asm-bol egy C fuggvenynek. Bonyolult, logikatlan,
> ertelmetlen kodot csinal, ide-oda mozgatja a regisztereket feleslegesen.

A fordito alapbol eleg szajbaragos kodot fordit, gyakorlatilag egymas utan
rakja a sablonjait. Ide-oda pakolaszik, es eloszeretettel hasznalja a
vermet. Aztan az optimalizacio kitakaritja az egesz kodot, es az olyan
lesz, mint a vizfolyas.

> >> optimalizacio szintjetol is fugg. (ha kikapcsolom az optimalizaciot,
> >> regiszterben varja, ha bekapcsolom, a memoriaban, erdekes...)
> >
> > Vannak ezt szabalyozo parameterei is a forditonak.
>
> Pl? Az IAR-nek nincs. A doksiban azt irjak, hogy az r17:r16-ban

Az Atmelnek tenyleg nincs sok. A gcc manual szerint:

           AVR Options

           -mmcu=mcu  -msize  -minit-stack=n  -mno-interrupts -mcall-prologues
           -mno-tablejump  -mtiny-stack

Ezek kozul egyedul a -mcall-prologues befolyasolja a fuggvenyhivast, az
sem erdemben.

Az optimalizacio viszont rendesen megbolygatja. Az egyik leggyakrabban
hasznalt kapcsolo a -fomit-frame-pointer, ez pl. befolyassal van ra.
Es tenger sok optimalizacios parameter van.

De ha szukseges, az optimalizaciot a volatile tipusmodosito letiltja.
A volatile-kent definialt fuggveny az alapertelmezett modon hivodik,
a program tobbi reszetol fuggetlenul.

> kell megadni, ha csak egy parameter van, de az 'optimalizacio' ezt
> atteszi a memoriaba. Kerdes, hogy minek. Optimalizacio nelkul csak
> regiszterekben elfer minden, nem ertem miert jo hogy a ketszer
> lassabb memoriaba kiteszi...

Azt a forditot akkor en is melloznem inkabb...

> > http://www.kgt.bme.hu/nagye/iir/
...
> Egesz jo, de az enyem jobb :)

Elhiszem. En az egesz jora palyazok, nulla erofeszitessel, azonnalra :)
(Termekfejlesztesrol szolva: sokszor az is szamit, hogy ki az elso.)

> Nem tudom megmerni hany ciklus, mert a __mulsi3 fuggveny nincs meg.

A gcc avr-libc-jebe jellemzoen az Atmel appnotes-bol emeltek at az effele
muveleteket. Valoszinuleg az appnotes mulsi3 nevu asm fuggvenyet talalnad
ott linkeles utan, annak is a sebessegre optimalizalt valtozatat.

> Mas kerdes, hogy a szuro fociklusaban egyaltalan miert van rcall,
> a hozza tartozo ret-tel egyutt 7..9 ciklus, meg tobb ha esetleg kulso
> memoriaban lenne a stack.

Az oldalnyi optimalizacios parameter kozott vannak erre valok is, csak ugy
vettem eszre, hogy a -O3-at jelenleg elengedi a fule mellett az avr-gcc.
A -O3 kapcsolja be eloszor a -finline-functions-t:

       -finline-functions
           Integrate all simple functions into their callers.  The compiler
           heuristically decides which functions are simple enough to be worth
           integrating in this way.

           If all calls to a given function are integrated, and the function
           is declared "static", then the function is normally not output as
           assembler code in its own right.

> Nem hasznal konstans 0 regisztert, azzal is sok ciklust meg lehet
> takaritani.

Nem tudom, hogy ebben miert nem hasznalja, mert amugy szokta.
A __zero_reg__ hivatkozik ra, ez benne is van minden avr-gcc altal
generalt asm-ben.

> Kene latni a __mulsi3 fuggvenyt. Veletlenul nincs tele push/pop-pal?

Nincs, ld. Atmel appnotes.

> Ha geci akarnek lenni, abba kotnek bele, hogy ez igy egyaltalan
> nem is mukodik, mert rosszul skalazod az egyutthatokat.

Hat mert hasamra utottem, es ez jott ki :) De az egyutthatokat semmibol
nem tart atirni.

Gumo



More information about the Elektro mailing list