J'essaie d'octet-aligner une fonction de 16 octets à l'aide de l'attribut 'aligné (16)'. J'ai fait ce qui suit: (source: http://gcc.gnu.org/onlineCs/gccc /Function-attributes.html ) p>
mais quand je compile (gcc foo.c; aucun script de fabrication de maquillage ou de liaison utilisé), je reçois l'erreur suivante: p>
FOO.c: 99: Erreur: l'alignement peut ne pas être spécifié pour 'Fonction' P>
J'ai essayé d'aligner jusqu'à 4,8,32, etc., mais l'erreur reste la même.
J'en ai besoin pour aligner une routine de service d'interruption pour un processeur basé sur PowerPC. Quelle est la bonne façon de le faire? P> void __attribute __ ((aligné (16))) fonction () {} code> p>
3 Réponses :
Pourquoi ne laissez-vous pas simplement passer les
Oui, je peux faire cela, mais cela alignerait toutes les fonctions à 16Bytes, alors que je n'ai besoin que de l'ISR pour obtenir 16 octets alignés. Mais, s'il n'y a pas d'autre option, je devrai faire la même chose.
Si vous n'utilisez pas GCC> = 4.3, c'est la voie à suivre.
@Sukanto, faites-le puis placez la fonction dans un fichier C séparé.
Vous utilisez probablement une ancienne version de GCC qui ne prend pas en charge cet attribut. Le lien de documentation que vous avez fourni est destiné au "développement actuel" de GCC. En examinant les différentes sorties, l'attribut n'apparaît que dans la documentation de GCC 4.3 et au-delà. P>
Je suppose que c'est possible. Mon compilateur est GCC 4.0.0.
S'adapter de ma réponse sur cette question GCC A >, vous pouvez essayer d'utiliser des directives alternativez, si vous préférez GCC'S Syntaxe d'attribut strong>, vous devriez pouvoir faire quelque chose comme: p> #pragma push_options code> et
POP_OPTIONS CODE > Les macros sont utilisés pour contrôler la portée de l'effet code> optimiser code> pragma. Plus de détails sur ces macros peuvent être trouvés dans GCC DOCS . P>
p> //add 5 to each element of the int array.
__attribute__((optimize("align-functions=16")))
void add5(int a[20]) {
int i = 19;
for(; i > 0; i--) {
a[i] += 5;
}
}
L'OP a expliqué exactement pourquoi ils doivent le faire, dans la deuxième phrase.
Une autre utilisation délicieusement pervers pour les fonctions d'alignement consiste à stocker des données supplémentaires dans les bits faibles de variables de pointeur de fonction ...
@R .., mal. Tout comme conservant dans l'octet élevé des adresses 32 bits sur les processeurs 680ec30 ou 68 000. Très mal en effet.