2009-12-16 17 views
6

'Hizalanmış (16)' özniteliğini kullanarak bir işlevi 16 baytlık sınırla bayt hizalamaya çalışıyorum. Yaptığım şu: void __attribute__((aligned(16))) function() { }C İşlev hizalaması GCC'de

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

Ama (gcc foo.c; kullanılan hayır Makefile veya bağlayıcı komut dosyaları) derleme yaparken, aşağıdaki hatayı alıyorum:

foo.c : 99: hata: hizalama 'işlev' için belirtilmemiş olabilir '

Aynı zamanda 4,8,32 vb. Ile hizalamayı denedim ancak hata aynı kalıyor. Bir powerpc tabanlı işlemci için bir Interrupt Service Rutinini hizalamak için buna ihtiyacım var. Bunu yapmanın doğru yolu nedir?

+0

Bunu neden istiyorsun? –

+10

OP, son cümlede neden bunu yapmaları gerektiğini tam olarak açıkladı. – caf

+3

Fonksiyonları hizalamak için başka bir kötülük kullanımı, fonksiyon-işaretçi değişkenlerinin düşük bitlerine ek verileri depolamaktır. –

cevap

8

Neden derleme sırasında -falign işlevlerini = 16 gcc'ye aktarmıyorsunuz?

+2

Bu çok kolay değil mi? –

+3

Evet Bunu yapabilirim, ancak tüm işlevleri 16bayt olarak ayarlayabiliyordum, ancak 16 bayt hizalamak için yalnızca ISR'ye ihtiyacım var. Ama başka bir seçenek yoksa, aynı şeyi yapmak zorunda kalacağım. – Sukanto

+0

GCC> = 4.3 kullanmıyorsanız, işte bu yoldur. – Gonzalo

2

Muhtemelen bu özelliği desteklemeyen eski bir gcc sürümünü kullanıyorsunuzdur. Sağladığınız dokümantasyon bağlantısı, gcc'nin "mevcut gelişimi" içindir. Çeşitli yayınlara bakıldığında, özellik sadece gcc 4.3 ve ötesi dokümantasyonunda görünür.

+0

Sanırım bu mümkün. Derleyicim gcc 4.0.0. – Sukanto

7

bunu gibi #pragma direktifleri kullanmayı deneyin, this GCC question tarihinde cevabım olabilir uyarlanması: #pragma push_options ve pop_options makro optimize Pragma en etkisinin kapsamını kontrol etmek için kullanılır

#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 

. Bu makrolarla ilgili daha fazla ayrıntı GCC docs'da bulunabilir.


Alternatif olarak, eğer isterseniz GCC en attribute syntax, sen böyle bir şey yapmak mümkün olmalıdır:

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