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