C absolut cimu valtozo generalasa
hg12345
hg12345 at freemail.hu
Wed Jan 7 07:44:52 CET 2004
Hi
Mint irtam az IAR fordito a constans cim definiciot nem szerette....
Nem PIC-re szeretnem forditani, hanem ARM-ra....
Az IAR forditonal beallithato a bitmezo feltoltesi iranya.
Sajnos nem vagyok C-ben otthon, de azt tovabbra sem ertem, a
generalt kod ha abszolut cimet adok meg miert lesz PC relativ!
A PC (8x6)-n ezt meg megtudom erteni, de uC kornyezetben sokkal
szivesen latok valodi abszolut kodot a PC-relatil megadasban egy ARM-
7-sen.
Udv
HG
> > Andras Tantos wrote:
> > > Oszinten szolva ennek nem tudom mi az ertelme:
> > >
> > > #define valtozo (*((volatile unsigned char *)(x20)))
> > >
> > > Ez ugyanugy mukodik, mint a fenti (felteve, hogy nem gepeltem
el) csak
> epp
> > > minden C fordito megeszi.
> >
> > Viszont nem biztos hogy ugyanolyan kodot general belole.
>
> Miert nem? Konstans cim elerese. Ha ezt a fordito masnak forditja,
mint a
> konstans cimen levo valatozo elereset, akkor eleg vacak a fordito
(SzVSz).
>
> > >>vagy egy bitet is meg lehet adni
> > >>// 20h cim 1. bitje.
> > >>static bit valami @ 0x20*8+1;
> > >
> > > Ennek mar tobb ertelme van, de itt nem csak a definialas, hanem
maga a
> tipus
> > > se szabvanyos.
> >
> > Mondtam hogy nem szabvanyos, de ha mikrokontrollerre forditasz,
akkor
> > altalaban fontosabb hogy gyors, hatekony legyen a kod, es ennyi
> > szabvanytalansagot meg lehet engedni.
>
> Ebben nincs vita. Ha *kell* el lehet terni a szabvanytol, foleg, ha a
> hordozhatosag nem szempont. Ez igaz a felhasznalora. A
> fordito/nyelv/kornyezet fejlesztoi viszont haromszor el kellene
> gondolkozzanak minden nem szabvanyos megoldas beepitesen. Lasd
fenti pelda:
> olyan forditot irni, ami a fenti makro-val ugyanazt a kodot generalja,
mint
> az altalad emlitett speci, nem szabvanyos szintaxis-sal kb.
ugyanakkora
> melo. Ebben az esetben pedig nincs elonye a nem-szabvanyos
megoldas
> alkalmazasanak, tehat kerulendo - mondom meg egyszer nem
felhasznalo, hanem
> fordito tervezo szempontjabol.
>
> > > Amugy egy ilyen definicio nagyon veszelyes tud lenni:
> > > Mit fog erre a fordito generalni. Felthetoen kenytelen lesz olvasni
a
> >
> > Nem veszelyes, a PIC processzornak vannak bit-kezelo utasitasai,
es a PICC
> > ezeket forditja a kodba. Sot! Ha egy byte valtozora megadod hogy
x|=0x40,
> > akkor is bit utasitas fog forditani ami beallitja a 6. bitet!
>
> Megneztem a PIC (PIC18c) leirasat, a kovetkezo van benne:
>
> 31.4.2 Bit Manipulation
>
> All bit manipulation instructions will first read the entire register,
> operate on the selected bit and then write the result back to
> (read-modify-write (R-M-W)) the specified register. The user should
keep
> this in mind when operating on some Special Function Registers, such
as the
> Port Pin Register
>
> En is pontosan errol beszeltem: a megoldas nem altalanos, bizonyos
tipusu HW
> regiszterek kezelesere nem alkalmas. Akkor viszont szebb,
konnyebben
> karbantarthato kodot eredmenyez az, ha nem haszalod ki ezt a
lehetoseget, es
> minden HW regisztert sajat koddal ersz el. Es megint csak: a fordito
dolga
> lenne az, hogy ezeket a kodreszleteket optimalis kodda forditsa az
adott
> porcesszoron, pl. ha vannak, ilyen bit-utasitasokka. Egyebkent te is
irod,
> hogy az x|=0x40 is bit-muvelet lesz, tehat a fordito meg is teszi
neked ezt
> a sziveseget.
>
> > > miatt. Viszont, hogy pontosan mi fog tortenni, az el van rejtve
eloled,
> es
> > > nincs beleszolasod a dolgok folyasaba. En nem hasznalnam. Ez
az egyik
> oka
> >
> > Nincs elrejtve, kered hogy ASM kodba forditson, es megnezed mit
csinalt
> belole.
>
> Nem errol van szo. Ugy altalaban nem szerencses, a fordito
viselkedesere
> biznod a program mukodeset. (pl. if ((MyPtr != NULL) && (MyPtr-
>MyData ==
> 3)) {...}). Egy verzio valtas, vagy a forditonak adott forditasi opciok
> valtozasa eleg ahhoz, hogy a programod mukodokepesbol hibassa
valjon. A
> forraskodnak egyertelmunek kell lennie, azaz ne lehessen olyan
(hibatlan)
> forditot irni, ami a programodbol nem mukodo kodot general. Ebben
az esetben
> legfeljebb azert kellhet az ASM kodot nezned, hogy miert lett
lassu/nagy a
> programod es nem azert, hogy miert nem mukodik. De a fenti
esetben fontosabb
> az a teny, hogy a megoldas csak bizonyos tipusu regiszterek eseten
mukodik
> helyesen, viszont ha raszoksz a hasznalatara, egy-ket olyan helyen is
> hasznalni fogod, ahol nem ervenyes a hasznalata. Ha vigyazol, akkor
viszont
> ket radikalisan kulonbozo szintaxist kell hasznalnod a ket kulonbozo
tipusu
> regsziter eleresehez. Ugyanakkor van olyan megoldas, ami (eleg)
hasonlo
> koddal elerhetove teszi mindket tipusu regisztert, es az altalad leirtak
> alapjan jo esellyel ugyanazt a kodot eredmenyezi, mint a speci
szintaxis
> hasznalata.
>
> > > annak, hogy bit-mezoket se hasznalok a HW leirasara (a masik,
hogy annak
> a
> > > kiosztasa is a fordito belso ugye, es nem biztos, hogy olyan
sorrendben
> > > fogja lerakni oket, ahogy en szeretnem).
> >
> > Nem egeszen. Szerinted mire talaltak ki? Biztos hogy olyan
sorrendben
> fogja
> > lerakni, mert dokumentalva van.
>
> A bit-mezoket adat-tomoritesre (optimalis memoria-kihasznalasra) es
nem HW
> regiszterek SW leirasara talatak ki. Tudtommal a szabvany nem
rogziti a
> bitmezok kiosztasi sorrendjet (MSB first, LSB first, pl.). Ha jol tudom,
> csak annyit ir le, hogy nem szabad addig uj int-et nyitni, amig a
> megelozoben van hely. De talan meg ez is legalis:
>
> struct SickBitField {
> int Field1: 31;
> int Field2: 31;
> int Field3: 1;
> int Field4: 1;
> }
>
> es ebbol a fordito ezt csinalja:
>
> DWORD1: Field1 es Field3
> DWORD2: Field2 es Field4
>
> A konkret pelda, ahol ez elo jott (egy news-group-on): az ARM procik
tudnak
> mind MSB mind LSB first modban mukodni. A kerdes az volt, hogy
valtozik-e a
> bitmezok kiosztasa ha a forditot atkapcsolod LSB-first modrol MSB-
first-re.
> A konszenzus az lett, hogy ha ez szamit, akkor hibas a forraskod.
Leven a
> szabvany nem definialja, az a program, ami epit a kiosztas
sorrendjere,
> ervenytelen.
>
> > Mikrokontrollerre teljesen mas programozasi logikat kell alkalmazni
mint
> > PC-re.
>
> Ebben nincs vita.
>
> > A PC-n a nagy progik miatt fontosabb lett a kod attekinthetosege,
> > masok altali ertelmezhetosege, a feladathoz legkozelebb allo
> megfogalmazasa,
> > es ma mar _tobbnyire_ nem szamit az eroforras igeny.
>
> Ezzel viszont nem ertek egyet. Minden programnal fontos az
attekinthetoseg,
> de ez nem lenne szabad, hogy a hatekonysag rovasara menjen.
> Attekinthetoseget lehet novelni jo valtozo es fuggveny-
elnevezesekkel, szep
> tabulalassal, jo dokumentacioval, nagyon sok mindennel, ami nem
szabad, hogy
> a hatekonysagot befolyasolja. De ez messzire vezet, ebbe ne
menjunk bele...
>
> > Ellenben mikrokontrolleren, ahol szukos a ROM hely, a RAM hely is, a
> > sebesseg is, maskepp kell optimalizalni.
>
> Ez igaz, de hol van ennek koze az attekinthetoseghez? Mas
algoritmust
> hasznalsz, mashogy osztod el a funkciokat, stb.
>
> > Ki kell hasznalni mindent amit
> > lehet, ami specifikus a processzorra. Pl. egy pointer muvelet PIC-en
igen
> > hulye atlathatatlan kodot tud eloidezni az architektura hulye
megoldasai
> > miatt (kulon RAM/ROM tar, kulon cimzesi modokkal).
>
> Egy altalanos pointer muvelet, lehet. De ha a fordito nem ismer fel egy
> konstans-pointert es nem general jo kodot a vele torteno
muveletekre, akkor
> vacak a fordito.
>
> > Ellenben a fenti BIT
> > deklaracio tok egyertelmu, es tudod hogy a PIC-nek van bit-
orientalt
> > utasitasa -> teljesen trivialis kodot fog generalni.
>
> Megintcsak: miert kell ehhez speci tipus? Raadasul meg a leirasban is
benne
> van, hogy az utasitasnak lehetnek fura mellekhatasai, ezert 'esszel'
kell
> alkalmazni. Pont errol beszelek: a magasszintu nyelvben nem irod le
> egyertelmuen a forditonak, hogy mit szeretnel (a nem specifikalt bit-
ek
> kezeleset illetoen) azaz a fordito (ez esetben CPU) belatasara bizod a
> dolgot. Ha viszont elorinad pontosan a teendoket, akkor a fordito is
> pontosan tudna, hogy mikor *legalis* a speci CPU utasitas
hasznalata, es
> mikor nem.
>
> > Vagy, pl. ha kell egy szam 0.0-10.0 kozott, akkor float tipussal tok
> > kenyelmesen megoldhato, jo nagy kodot fog generalni. Erdemes
elgondolkodni
> > hogy inkabb byte-ot hasznalsz 0-100 kozott, es majd ha lesz
szerepe a
> > tizedespontnak (kijelzes, egyeb szamitasok), akkor integer
muveletekkel
> > megoldhato. Joval gyorsabb.
>
> Persze, de hogy jon ez ide? Amugy meg, most te is az en szekeremet
tolod:
> nem bizod ra a forditora, hogy a float-jaidat fix-pontos tort-kent
> ertelmezze. Kezzel szepen leirod, hogy mit szeretnel, de azt elvarod a
> forditotol, hogy amit specifikaltal, azt optimalisan valositsa meg. Es itt
> sem az a megoldas, hogy a fordito bevezet meg egy uj tipust, hanem
az, hogy
> felismeri es optimalisan valositja meg az altalad eloirt muveleteket.
>
> > Ja, meg egy fontos dolog: PIC-en nincs ertelme sebessegre
optimalizalni.
> > Kodmeretre kell, minel rovidebb a kod, annal gyorsabb, mivel szinte
minden
> > PIC utasitas 1 ciklus alatt vegrehajtodik.
>
> Nagyon sok esetben nem erdemes sebessegre optimalizalni.
Pontosabban, a
> sebessegre optimalizalas nem sokban kulonbozik a kod-meretre valo
> optimalizalastol. Egy-ket olyan dolog van, amit nem csinalnak meg
meretre
> optimalizalas eseten, es par optimalizalast maskent hangolnak, de
alapvetoen
> ugyanaz a ketto. BTW: egy P-VI-esen is gyorsabb tud lenni a kisebb
kod, mert
> kevesebb cache-miss-t okoz, pl. Nem csak kis mikrokontrollerekre
igaz, amit
> irsz.
>
> Udv,
> Tantos Andras
>
>
>
>
More information about the Elektro
mailing list