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