Tipus de dades

El llenguatge C, que és el que fem servir majoritàriament quan programem sistemes encastats, és un llenguatge tipat estàtic. Això vol dir que a cada variable cal definir-la abans de fer-la servir i explicitar quin tipus te.

Els tipus de dades de C tenen un petit problema, i és que no estan fixats per l’standard. Això vol dir que, per exemple, una variable de tipus int pot ser de 8, 16, 32 o 64 bits depen de la màquina on estiguem treballant.

Com que això pot donar-nos força problemes segons l’aplicació en que estiguem treballant, en sistemes encastats procurem sempre treballar amb uns tipus de dades que explicitin el tipus de dades.

El fitxer stdint.h defineix tot un seguit de tipus d’aquesta mena, veiem-los:

  • int8_t / uint8_t : tipus enter de 8 bits (signed / unsigned)
  • int16_t / uint16_t : tipus enter de 16 bits (signed / unsigned)
  • int32_t / uint32_t : tipus enter de 32 bits (signed / unsigned)
  • int64_t / uint64_t : tipus enter de 64 bits (signed / unsigned)

Aquests tipus sempre son de l’amplada de bits que indiquen, independentment de com sigui la màquina on estiguem treballant.

Per tant, sempre farem servir tipus de dades d’aquesta mena quan l’amplada de la dada sigui important.

Cal tenir en compte que l’ampla de bits nativa de la màquina serà la que ens donarà millor rendiment en cas de molts càlculs. En el codi d’exemple primer es printen les amplades (en bytes) de diferents tipus de dades. Tot seguit es printen les amplades dels punters a diferents tipus. Tots els punters son de 4 bytes. Per què? Doncs perquè han de poder guardar qualsevol adreça de memòria, i per accedir a la memòria calen 32 bits (parlem del cas del Cortex).

L’exemple segueix amb uns tests senzills per veure què passa si operen molts cops amb diferents tipus de dades. Primer amb el tipus natiu de la màquina (32 bits), després amb 8 bits i per últim amb un tipus float.  Fixeu-vos que el tipus natiu és el que més ràpid va.

Per mesurar el temps fem servir un Timer com a l’exemple SpeedTest_2. El Timer s’engega just abans de començar un test i s’atura just quan acaba. Després es converteix el nombre de ticks que ha comptat el Timer a temps com ja vàrem fer a l’exemple SpeedTest_2.

Passant paràmetres grans a funcions

A continuació amb els Tests 4 i 5 es mira el temps que es tarda en passar un array com a paràmetre per valor o per referència a una funció. Com veiem, passar l’array per valor és molt costós, ja que es copien tots els valors a dins la funció, mentre que passant-lo per referència només es passa un punter a l’inici de l’array.

Aquest pas per referència cal tenir-lo molt en compte quan estiguem treballant amb estructures, ja que és fàcil que no hi pensem i estiguem fent treballar de més al nostre sistema.

Sobre l’estructura del codi i de fitxers

En aquest exemple veureu que el codi al main no te gaire cosa i que hi ha dos fitxers .c addicionals (amb els seus corresponents .h):

  • Al fitxer BSP.c hi ha la inicialització per poder fer servir el printf (ja ho vem fer servir a l’exemple corresponent)
  • Al fitxer Tests.c hi ha el codi per cada un dels tests que es fan.

Fixeu-vos que el fitxer Tests.h només hi posem les declaracions de les funcions que es poden fer servir per altres mòduls. Per tant, les funcions internes Test4b i Test5b no es declaren al fitxer .h.

De fet, per fer-ho tot més correcte, les dues funcions Test4b i Test5b s’haurien d’haver declarat aixi:

static int Test4b(struct example param)...
static int Test5b(struct example *param)...

Usant static fa que la funció declarada així  tingui visibilitat només en el mòdul que la defineix i, per tant, no és visible a d’altres mòduls. Això pot, en alguns casos i compiladors, generar codi més òptim, donat que les funcions que poden cridar les funcions definides com static es coneixent d’avantmà (només poden estar al mateix mòdul), els salts a aquestes funcions poden ser de tipus short jump enlloc de long jumps (més lents)

Deixa un comentari

Fill in your details below or click an icon to log in:

WordPress.com Logo

Esteu comentant fent servir el compte WordPress.com. Log Out /  Canvia )

Google photo

Esteu comentant fent servir el compte Google. Log Out /  Canvia )

Twitter picture

Esteu comentant fent servir el compte Twitter. Log Out /  Canvia )

Facebook photo

Esteu comentant fent servir el compte Facebook. Log Out /  Canvia )

S'està connectant a %s

Aquest lloc utilitza Akismet per reduir els comentaris brossa. Apreneu com es processen les dades dels comentaris.