Vai al contenuto
PLC Forum


Gcc E Dimensione Variabili Enum


accacca

Messaggi consigliati

Sono passato dal mondo dell'infinitamente piccolo 8bit a quello dell'infinitamente grande ARM 32bit e mi trovo in difficoltà anche con le cose più stupide

Ho fatto questa semplice cosa

typedef enum

{

bla

bla

bla

} T_ENUM_VAR_A ;

typedef enum

{

bla

bla

bla

} T_ENUM_VAR_B ;

typedef struct

{

T_ENUM_VAR_A var_A ;

T_ENUM_VAR_B var_B ;

} T_STRUCT_VAR;

nel mio mondo la struttura è di 2byte nel mondo gcc/arm diventa di 8byte (due variabili allineate a 4byte. Poco male ram mi avanza però la struttura viene applicata all'area di memoria che contiene un messaggio seriale ricevuto da un micro 8bit che trasmette un messaggio di soli 2 byte e quindi perdo il corretto allineamento delle variabili. Come posso modificare l'allineamento della struttura in gcc ?

Io ho provato con __attribute__((packed)) oppure __attribute__ ((allign(1))) senza successo.

Link al commento
Condividi su altri siti


Ciao accacca.

Ho avuto anch'io lo stesso problema con un PIC32.

Probabilmente hai già controllato se hai opzioni di compilazione del tipo "-fshort -enum"...

Io pensavo di aver risolto con questa opzione di compilazione ma non ha funzionato o forse non l'ho usata correttamente.

Ho risolto il problema con la "union"; ti riporto il mio esempio:

typedef union {

WORD word_err; // accedo come word

struct {

BYTE byte_low_err;

BYTE byte_high_err;

} byte_err; // accedo come byte

struct {

BOOL bit_0 : 1;

BOOL bit_1 : 1;

BOOL bit_1 : 1;

BOOL bit_1 : 1;

BOOL bit_1 : 1;

BOOL bit_1 : 1;

BOOL bit_1 : 1;

BOOL bit_1 : 1;

BOOL bit_1 : 1;

BOOL bit_1 : 1;

BOOL bit_1 : 1;

BOOL bit_1 : 1;

BOOL bit_1 : 1;

BOOL bit_1 : 1;

BOOL bit_1 : 1;

BOOL bit_1 : 1;

} bit_err; // accedo come bit

} MY_Error;

In questo modo puoi accedere alla stessa locazione con tipo di variabile diverso.

Link al commento
Condividi su altri siti

ciao grazie per le info il mio problema però è diverso io voglio avere una struttura con una dimensione ben definita senza bytes di allineamento ecc..

ho fatto dei progressi

tanto per cominciare ho inserito un

#pragma pack(1) che allinea la struttura al byte senza aggiungerre byte alla fine

Poi mi hanno suggerito questa soluzione che funziona

typedef struct

{

T_ENUM_VAR_A var_A:8 ;

T_ENUM_VAR_B var_B:16 ;

} T_STRUCT_VAR;

con queste definizioni la sizeof(T_STRUCT_VAR) in questo caso restituisce 3

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...