- Messaggi: 22
- Ringraziamenti ricevuti 6
Allineamento di una struttura
- Pascolo
- Autore della discussione
- Giovane Utente
-
Less
Di più
7 Anni 1 Mese fa #1
da Pascolo
Allineamento di una struttura è stato creato da Pascolo
Salve ragazzi,
ho iniziato ad utilizzare un PIC24 e faccio fatica a capire il concetto di allineamento dei dati in una struttura.
La mia struttura la utilizzo per metterci dei parametri che poi memorizzo su una EEPROM esterna. I dati sono un mix di 8, 16, 32bit.
Pensavo di risolvere tutto con "__attribute__ ((packed))" ma non è proprio così.
Ho aggiunto delle variabili di riempimento, sembra funzionare, ma dal forum di Microchip mi dicono che non ho ben chiaro il concetto di allineamento.
Qualcuno mi può aiutare?
Grazie
Ivan
ho iniziato ad utilizzare un PIC24 e faccio fatica a capire il concetto di allineamento dei dati in una struttura.
La mia struttura la utilizzo per metterci dei parametri che poi memorizzo su una EEPROM esterna. I dati sono un mix di 8, 16, 32bit.
Pensavo di risolvere tutto con "__attribute__ ((packed))" ma non è proprio così.
Ho aggiunto delle variabili di riempimento, sembra funzionare, ma dal forum di Microchip mi dicono che non ho ben chiaro il concetto di allineamento.
Qualcuno mi può aiutare?
Grazie
Ivan
Si prega Accesso o Crea un account a partecipare alla conversazione.
7 Anni 1 Mese fa #2
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Allineamento di una struttura
Salve Ivan,
puoi postare il link che hai postato sul Forum Microchip?
Onestamente non sono un fanatico delle funzioni definite dal compilatore, visto che il tuo codice diventa non portabile e non sai cosa faccia il compilatore (a meno di vedere il codice assembly).
Saluti,
Mauro
puoi postare il link che hai postato sul Forum Microchip?
Onestamente non sono un fanatico delle funzioni definite dal compilatore, visto che il tuo codice diventa non portabile e non sai cosa faccia il compilatore (a meno di vedere il codice assembly).
Saluti,
Mauro
Si prega Accesso o Crea un account a partecipare alla conversazione.
- Pascolo
- Autore della discussione
- Giovane Utente
-
Less
Di più
- Messaggi: 22
- Ringraziamenti ricevuti 6
7 Anni 1 Mese fa #3
da Pascolo
Risposta da Pascolo al topic Allineamento di una struttura
Si prega Accesso o Crea un account a partecipare alla conversazione.
7 Anni 1 Mese fa #4
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Allineamento di una struttura
Ok, capisco il punto.
Quando ordinando le variabili in maniera diversa le cose funzionano, direi che non è la soluzione giusta, visto che lasci al compilatore il compito di farti funzionare il programma. Se dovessero cambiare qualche cosa alla prossima versione del compilatore, magari devi ordinare i dati in maniera diversa.
In ogni modo la problematica sta semplicemente nel fatto che la memoria viene letta a 16 bit (2 byte) per cui se la tua struttura formalmente richiede 5 byte viene organizzata in maniera da rientrare sempre in multipli di 16. Il compilatore come hai visto a seconda di come organizza il tutto potrebbe o meno dare il valore che ti aspetti (quando usi sizeof).
Per memorizzare la struttura in EEPROM puoi accedere le singole variabili e salvare i dati di cui hai bisogno.
In questo modo tu hai il controllo sui byte e non il compilatore. Il tuo programma funzionerà poi sui PIC24 o altro.
Se fai affidamento al compilatore e alle funzioni inline sei legato al compilatore e alla versione dello stesso.
Parafrasando...l'allineamento
Se un pacchetto di caramelle ha 10 caramelle, ma ne vuoi 15, devi comprare 2 pacchetti.
Se conti poi le caramelle che hai intasca non ne hai 15 come pensavi, ma 20.
Saluti,
Mauro
Quando ordinando le variabili in maniera diversa le cose funzionano, direi che non è la soluzione giusta, visto che lasci al compilatore il compito di farti funzionare il programma. Se dovessero cambiare qualche cosa alla prossima versione del compilatore, magari devi ordinare i dati in maniera diversa.
In ogni modo la problematica sta semplicemente nel fatto che la memoria viene letta a 16 bit (2 byte) per cui se la tua struttura formalmente richiede 5 byte viene organizzata in maniera da rientrare sempre in multipli di 16. Il compilatore come hai visto a seconda di come organizza il tutto potrebbe o meno dare il valore che ti aspetti (quando usi sizeof).
Per memorizzare la struttura in EEPROM puoi accedere le singole variabili e salvare i dati di cui hai bisogno.
In questo modo tu hai il controllo sui byte e non il compilatore. Il tuo programma funzionerà poi sui PIC24 o altro.
Se fai affidamento al compilatore e alle funzioni inline sei legato al compilatore e alla versione dello stesso.
Parafrasando...l'allineamento
Se un pacchetto di caramelle ha 10 caramelle, ma ne vuoi 15, devi comprare 2 pacchetti.
Se conti poi le caramelle che hai intasca non ne hai 15 come pensavi, ma 20.
Saluti,
Mauro
I seguenti utenti hanno detto grazie : Pascolo
Si prega Accesso o Crea un account a partecipare alla conversazione.
- Cosimix
-
- Elit Utente
-
Less
Di più
- Messaggi: 198
- Ringraziamenti ricevuti 26
7 Anni 1 Mese fa #5
da Cosimix
Risposta da Cosimix al topic Allineamento di una struttura
Buonasera a tutti.
Incuriosito, ho dato una lettura al link del forum Microchip. Non ho capito una cosa riguardante il consiglio dato da un paio di utenti. Una volta "impacchettata" la struttura creata, che senso ha spostare le variabili più grandi in testa? Relativamente al discorso delle posizioni dispari, anche la variabile da 1 byte posizionata come nel seguente esempio (doubt_3) dovrebbe essere affetta dallo stesso problema:
Forse mi sfugge qualcosa.. Appena avrò un PIC a 16 bit a disposizione farò delle prove.
Saluti,
Cosimo
Incuriosito, ho dato una lettura al link del forum Microchip. Non ho capito una cosa riguardante il consiglio dato da un paio di utenti. Una volta "impacchettata" la struttura creata, che senso ha spostare le variabili più grandi in testa? Relativamente al discorso delle posizioni dispari, anche la variabile da 1 byte posizionata come nel seguente esempio (doubt_3) dovrebbe essere affetta dallo stesso problema:
Code:
struct __attribute__((packed)) my_doubts {
uint16_t doubt_1;
uint8_t doubt_2;
uint8_t doubt_3;
uint8_t doubt_4;
};
Forse mi sfugge qualcosa.. Appena avrò un PIC a 16 bit a disposizione farò delle prove.
Saluti,
Cosimo
Si prega Accesso o Crea un account a partecipare alla conversazione.
Moderatori: Mauro Laurenti, Matteo Garia
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.
Forum - Ultimi messaggi
-
- Watchdog
- da FABRIZIO
-
- Timer0 e interrupt
- da marcoilgrande
-
- Strana anomalia LT lib module_EEPROM
- da marcoilgrande
-
- Nuova versione Kicad 9
- da Mauro Laurenti
-
- MODULO GSM SIM900A
- da embedded