accacca Inserito: 6 aprile 2010 Segnala Share Inserito: 6 aprile 2010 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ù stupideHo fatto questa semplice cosatypedef 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 More sharing options...
kappa47 Inserita: 7 aprile 2010 Segnala Share Inserita: 7 aprile 2010 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 More sharing options...
accacca Inserita: 7 aprile 2010 Autore Segnala Share Inserita: 7 aprile 2010 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 progressitanto 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 funzionatypedef 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 More sharing options...
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora