2009-12-16 9 views
6

Ich versuche, eine Funktion auf 16-Byte-Grenze mit dem 'aligned (16)' -Attribut auszurichten. Ich habe folgendes: void __attribute__((aligned(16))) function() { }C Funktionsausrichtung in GCC

(Quelle: http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html)

Aber wenn ich (gcc foo.c, keine Makefiles oder Linker-Skripte verwendet) kompilieren, bekomme ich folgende Fehlermeldung:

Foo.c : 99: Fehler: Ausrichtung kann nicht für 'Funktion'

Ich versuchte Ausrichten auf 4,8,32 usw., aber der Fehler bleibt gleich. Ich brauche dies, um eine Interrupt-Service-Routine für einen PowerPC-basierten Prozessor auszurichten. Was ist der richtige Weg?

+0

Warum wollen Sie dies tun wollen? –

+10

Das OP hat im vorletzten Satz genau erklärt, warum sie dies tun müssen. – caf

+3

Eine andere erfreulich böse Verwendung zum Ausrichten von Funktionen ist das Speichern zusätzlicher Daten in den niedrigen Bits von Funktionszeigervariablen ... –

Antwort

8

Warum übergeben Sie nicht einfach -falign-functions = 16 an gcc beim Kompilieren?

+2

Das ist zu einfach, oder? –

+3

Ja, ich kann das tun, aber das würde alle Funktionen auf 16byte ausrichten, während ich nur die ISR brauche, um 16 Byte auszurichten. Aber, wenn es keine andere Möglichkeit gibt, muss ich dasselbe tun. – Sukanto

+0

Wenn Sie GCC> = 4.3 nicht verwenden, ist dies der richtige Weg. – Gonzalo

2

Sie verwenden wahrscheinlich eine ältere Version von gcc, die dieses Attribut nicht unterstützt. Der Dokumentationslink, den Sie zur Verfügung gestellt haben, ist für die "aktuelle Entwicklung" von gcc. Beim Durchsehen der verschiedenen Versionen erscheint das Attribut nur in der Dokumentation für gcc 4.3 und darüber hinaus.

+0

Ich denke, das ist möglich. Mein Compiler ist gcc 4.0.0. – Sukanto

7

Anpassung von meiner Antwort auf this GCC question, Sie könnten versuchen, Pragma-Direktiven, etwa so:

#pragma GCC push_options 
    #pragma GCC optimize ("align-functions=16") 

    //add 5 to each element of the int array. 
    void add5(int a[20]) { 
     int i = 19; 
     for(; i > 0; i--) { 
      a[i] += 5; 
     } 
    } 

    #pragma GCC pop_options 

Die #pragma push_options und pop_options Makros zu steuern, werden verwendet, um den Umfang der Wirkung des optimize Pragma. Weitere Details zu diesen Makros finden Sie in der GCC docs.


Alternativ, wenn Sie GCC attribute syntax bevorzugen, sollten Sie in der Lage sein, etwas zu tun:

//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; 
     } 
    }