Vai al contenuto
PLC Forum


Gcc E Dimensione Variabili Enum


Messaggi consigliati

Inserito:

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.


Inserita:

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.

Inserita:

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

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...