structure portage 8bits en 32 bits [Forums - Astuces]
structure portage 8bits en 32 bits [Forums - Astuces]
Pseudo Pass se souvenir de moi     Créer un compte
ARTICLES et TELECHARGEMENTS ~ FORUMS ~ LIENS  
 
             
 
Recherche
 
   
 

Parcourir ce sujet :   1 Utilisateur(s) anonymes





structure portage 8bits en 32 bits
Accro
Inscrit:
28/09/2005 11:53
De In Space
Messages: 156
Hors Ligne
Astuce du jour : lors d'un portage d'un projet 8bits sur 32 bits ( flexis coldfire V1 )
penser à mettre ceci avant votre structure afin d'éviter les alignements et gagner en taille

#pragma options align=packed


puis votre structure et enfin ceci :

#pragma options align=reset


explication source wikipedia


Posté le : 13/10/2013 12:36
“Tomber est permis ; se relever est ordonné.” proverbe russe
Transférer la contribution vers d'autres applications Transférer


Re: structure portage 8bits en 32 bits
Pilier de la communauté
Inscrit:
23/10/2005 11:40
De Aix les Bains (73)
Messages: 1906
Hors Ligne
Merci pour cette astuce ce la m'a bien aidé

Au détail prés que sous CW10.6 le pragma n'est pas reconnu, ci dessous celui a utiliser (avec GCC de manière générale si j'ai bien compris)
truct {
        
unsigned short titi ;         
        
unsigned long toto2 
        
unsigned short titi2 ;         
        
unsigned long toto3 
        
unsigned short titi3 ;         
        
unsigned long toto4 
        
unsigned short titi4 ;         
        
unsigned long toto ;                                     
  } 
Strct;
devrait avoir une taille de 24 mais le compilateur prend 32 octets

avec les pragmasCitation :
#pragma pack(push, 1)
truct {
unsigned short titi ;
unsigned long toto2 ;
unsigned short titi2 ;
unsigned long toto3 ;
unsigned short titi3 ;
unsigned long toto4 ;
unsigned short titi4 ;
unsigned long toto ;
} Strct;
#pragma pack(pop)
le compilo met bien la structure sur 24 octets

Le monsieur qui a inventé l'alignement a t-il été enfermé depuis ? quelle idée !!!

Posté le : 08/08/2015 16:07
Mieux vaut marcher dans la bonne direction que courir dans la mauvaise
Transférer la contribution vers d'autres applications Transférer


Re: structure portage 8bits en 32 bits
Pilier de la communauté
Inscrit:
23/10/2005 11:40
De Aix les Bains (73)
Messages: 1906
Hors Ligne
Je viens d'appliquer ça à toutes mes structures pour gagner en place mais je me retrouve avec un code généré plus gros.

Pourquoi le compilateur doit générer plus de code quand on le laisse pas aligner comme il veut ?
Le compilo est juste moins optimisé dans ce cas ou le déroulement du code est moins "facile" et nécessite donc plus de code ?

Merci pour les explications de ce qui ce cache derrière cet "alignement"

Posté le : 08/08/2015 22:31
Mieux vaut marcher dans la bonne direction que courir dans la mauvaise
Transférer la contribution vers d'autres applications Transférer


Re: structure portage 8bits en 32 bits
Pilier de la communauté
Inscrit:
27/09/2005 18:07
De Metz
Messages: 1335
Hors Ligne
Citation :
Merci pour les explications de ce qui ce cache derrière cet "alignement"
Prenons un processeur traitant des données de 32 bits, une structure ayant 3 champs: champ1: 16 bits, champ2: 32 bits et champ3: 16 bits.

Si on aligne les champs, la structure fera 96 bits en tout et il faudra 3 accès mémoire pour lire tous les champs
Si on n'aligne pas, la structure fera 64 bits, il faudra un accès pour lire le champ1, 2 accès pour le champ2 car il est à cheval sur 2 adresses contiguës et 1 accès pour le champ3. De plus il faudra reconstituer le champ2 à partir des 2 lectures, d'où le code plus long.

A+

Posté le : 09/08/2015 00:25
Transférer la contribution vers d'autres applications Transférer


Re: structure portage 8bits en 32 bits
Pilier de la communauté
Inscrit:
23/10/2005 11:40
De Aix les Bains (73)
Messages: 1906
Hors Ligne
Bonjour

CQFD, merci Jacques !

C'est vraiment un aspect complexe que cet alignement.
Hier soir j'ai testé un alignement sur une autre structure et là paf, code plus petit !
Là je suppose que c'était parce que la structure servait à saisir plein de constante , les constantes doivent je suppose prendre nettement moins de place en flash, malgré plus de code pour y accéder.

A y réfléchir je me demande si l'alignement ne peut pas expliquer pourquoi à mes débuts en C le compilo faisait tourner 20% plus vite un code tout simple que je croyais pourtant archi optimisé en assembleur...

Merci

Posté le : 09/08/2015 08:22
Mieux vaut marcher dans la bonne direction que courir dans la mauvaise
Transférer la contribution vers d'autres applications Transférer


Re: structure portage 8bits en 32 bits
Pilier de la communauté
Inscrit:
23/10/2005 11:40
De Aix les Bains (73)
Messages: 1906
Hors Ligne
Je viens de poster un bout de code sur un autre sujet et je rebomdi sur ce sujet de l'alignement avec

La fonction a ce prototype
int MODBUSmaster_Fct4_traitement(void *PositionParametreint NbOctetParParametreint Endianness,  unsigned char u8NbParametreALire)


Dans la mesure où je ne compte pas un jour mettre mon code dans un µc 8bit, j'ai tout intérêt à déclarer mes fonctions sur Kinetis ainsi
int mafct(int param1int param2int param3)

plutot que
unsigned char mafct (unsigned char param1unsigned char param2unsigned char param3)


Dans le premier cas ce sera plus rapide et moins gourmand en mémoire, rien qu'à cause de la manipulation des variables, non ?
ou alors ça fait partie des choses optimisées par le compilateur et au final ça change rien ?

merci


Posté le : 10/08/2015 16:10
Mieux vaut marcher dans la bonne direction que courir dans la mauvaise
Transférer la contribution vers d'autres applications Transférer


Re: structure portage 8bits en 32 bits
Pilier de la communauté
Inscrit:
27/09/2005 18:07
De Metz
Messages: 1335
Hors Ligne
Je pense que pour le passage des paramètres, c'est différent (quoiqu'il faudrait vérifier) car ceux-ci sont passés dans la pile. Or ça m'étonnerait qu'un push ou qu'un pop puisse ne manipuler qu'un seul octet. L'alignement doit être de facto du coup.

Posté le : 10/08/2015 17:17
Transférer la contribution vers d'autres applications Transférer


Re: structure portage 8bits en 32 bits
Pilier de la communauté
Inscrit:
23/10/2005 11:40
De Aix les Bains (73)
Messages: 1906
Hors Ligne
donc en supposant que ça ne peut pas manipuler qu'un octet ca aurait pour conséquence que
1) ça ne prend(rait) pas plus de temps
2) que ça prend(rait) la même place dans la pile (et qu'un simple unsigned char prend donc beaucoup de RAM)

A creuser, je me mets ça sur la toodolist pour quand je serai plus à l'aise avec tout ca.

Merci

Posté le : 10/08/2015 17:25
Mieux vaut marcher dans la bonne direction que courir dans la mauvaise
Transférer la contribution vers d'autres applications Transférer


Re: structure portage 8bits en 32 bits
Accro
Inscrit:
28/09/2005 11:53
De In Space
Messages: 156
Hors Ligne
Bonsoir,

les µC 8 bits (S08) on un stack pointer et un program counter de 16 bits, si le retour d'une fonction ou un paramètre se fait sur 32 bits, le code sera plus gros effectivement pour le traitement par rapport à un µC 32bits qui a les registres adéquates.






Posté le : 11/08/2015 00:10
“Tomber est permis ; se relever est ordonné.” proverbe russe
Transférer la contribution vers d'autres applications Transférer



 Haut   Précédent   Suivant



Vous pouvez voir les sujets.
Vous ne pouvez pas débuter de nouveaux sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.

[Recherche avancée]


Powered by XOOPS© The XOOPS Project
Contacter les administrateurs

structure portage 8bits en 32 bits [Forums - Astuces]