C -- struct kerdes
Andras Tantos
andras_tantos at yahoo.com
Wed Nov 17 18:50:53 CET 2004
> Amit irtal kodot, ott a kis Hardware arhitekturaju kontrolereknel
> gondvan, mert a MAS A RAM es mas FLASH/ROM pointer szerkezetileg
> es meretileg is, a lenti definicio RAM-ra mutat!
>
> Ha feltarthatlak, lenne meg egy kerdesem, hogyan tudom
> automatikusan generalni forditasi idoben egy structura tombnek
> kulonbozo pontjaihoz azonosito pointer vagy valami hasonlot
> A kulonbozo hozzaferesi pontokat szeretnem automatikusan generalni.
>
> Elvileg mondjuk igy:
> const ITEM Item1=...........
> const ITEM Item2=...........
> const ITEM Item3=...........
> const ITEM Item4=...........
> const ITEM Item5=...........
>
> const struct ITEM *pITEM
>
> idaig mindent eltudok kepzelni, es liniearis tarolas eseten pointerrel
> tudom kezelni, de Mi garantalja szamomra a linearis tarolas, a MS
> Studio teljesen szamomra veletlenszeruen tarolta. A korrekt megoldas
> egy strukturakra mutato pointer tomb lenne, de jelentosen lassitana a
> kontrollert es ez elpocsekolt memoriarot meg meg sem emlitettem.
>
Lehet, hogy meg mindig nem ertem, de mi is ezzel a baj?
#include <stdio.h>
#ifdef _MSC_VER
#define __flash
#endif
typedef struct {
unsigned char a;
unsigned char b;
unsigned int d;
} ITEM;
__flash const ITEM Items[3] = {
{ 'a', 'A', 1 },
{ 'b', 'B', 2 },
{ 'c', 'B', 3 }
};
const ITEM __flash *pITEM;
const ITEM __flash * const pITEM2 = Items+2;
int main() {
pITEM = Items;
printf("First element: %c %c %d, mid elemenet: %c %c %d, last element: %c
%c %d\n",
pITEM->a,
pITEM->b,
pITEM->d,
Items[1].a,
Items[1].b,
Items[1].d,
pITEM2->a,
pITEM2->b,
pITEM2->d
);
}
Ez szepen fordul Visual C++ alatt, es erzesre a microkontrollereden se
szabadna, hogy gondot okozzon (eltekintve a printf-tol, ami valoszinuleg nem
letezik, de ez egyebkent is csak a hasznalatot mutatja). Elvben a fordito a
tombot be kellene rakja ROM-ba, sot talan meg pITEM2-t is beteszi. De ehhez
lehet, hogy igy kell deklaralni:
const ITEM __flash * const __flash pITEM2 = Items+2;
De nem igazan ertem, hogy miert kellene konstans pointer egy konstans
adathoz. Miert nem fersz hozza ugy, ahogy a kozepso elemhez teszem a fenti
programban? Vagy ez valami speci dolog a mikrokontrolleredben?
Meg egy-ket megjegyzes:
- A strukturad merete mas lesz a ket platformon: A 8-bites mikron, gondolom
3, PC-n alapbol 8. Ha bekapcsolod a data-packing-et (/Zp) akkor 6.
- Leven nem architektura-fuggetlen tipusokat hasznalsz, d merte a mikron 8
bit, a PC-n 32-bit lesz.
- A hasznalt kulcsszavak kozul a const csak a legujabb C szabvanyban van
benne (C99 azt hiszem) ugyhogy lehet, hogy jobban jarsz, ha a programodat
C++-kent forditod. Persze, csak ha tudod.
- A linearis tarolsaban ne bizzal! Plane, ha hasznalsz optimalizalast. A C
(vagy C++) szabvany semmifele kikotest nem tartalmaz, arra nezvest, hogy
hogy kell az adatszegmensen (vagy epp a heapen vagy a stack-en) az adatokat
elrendezni. Minden olyan kod, amelyik viselkedese ettol fugg, ervenytelen.
Lehet, hogy egyik, vagy masik forditoval mukodik, meg az is lehet, hogy a
legtobbel igen, de bizonyos esetekben a dolog nem fog mukodni, es nagyon
nehezen megtalalhato hibakhoz vezet. Csak egy erdekesseg: a Microsoft-nak
(talan masoknak is) van egy olyan technologiaja (Basic-Block Tools-nak
hivjak) ami a leforditott binaris kodot szetkapja apro darabokra, es ujra
osszerakja olyan sorrendben, ahogy az a leggyorsabban fut. Tobbek kozott pl.
az adat-blokkokat is atrendezni, hogy azok a legkedvezobben helyezkedjenek
el a kod szamara. (nehany reszlet itt: http://research.microsoft.com/bit/)
More information about the Elektro
mailing list