2009-12-16 39 views
6

Tôi đang cố gắng sắp xếp byte một hàm thành ranh giới 16 byte bằng cách sử dụng thuộc tính 'căn chỉnh (16)'. Tôi đã làm như sau: void __attribute__((aligned(16))) function() { }C Căn chỉnh chức năng trong GCC

(Nguồn: http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html)

Nhưng khi tôi biên dịch (foo.c gcc, không makefiles hoặc kịch bản mối liên kết được sử dụng), tôi nhận được lỗi sau:

FOO.c : 99: lỗi: liên kết có thể không được chỉ định cho 'chức năng'

Tôi đã cố gắng căn chỉnh đến 4,8,32, v.v. nhưng lỗi vẫn giữ nguyên. Tôi cần điều này để căn chỉnh một gián đoạn dịch vụ thường xuyên cho một bộ xử lý dựa trên powerpc. Cách làm đúng là gì?

+0

Tại sao bạn muốn làm điều này? –

+10

OP đã giải thích chính xác lý do tại sao họ cần phải làm điều này, trong câu thứ hai. – caf

+3

Một cách sử dụng thú vị khác để sắp xếp các chức năng là lưu trữ dữ liệu bổ sung trong các bit thấp của các biến con trỏ hàm ... –

Trả lời

8

Tại sao bạn không vượt qua -falign-functions = 16 tới gcc khi biên dịch?

+2

Đó là quá dễ dàng, phải không? –

+3

Có, tôi có thể làm điều đó, nhưng điều đó sẽ sắp xếp tất cả các chức năng đến 16byte, trong khi tôi chỉ cần ISR để có được 16 byte liên kết. Nhưng, nếu không có lựa chọn nào khác, tôi sẽ phải làm như vậy. – Sukanto

+0

Nếu bạn không sử dụng GCC> = 4.3, đây là cách để thực hiện. – Gonzalo

2

Có thể bạn đang sử dụng phiên bản gcc cũ hơn không hỗ trợ thuộc tính đó. Liên kết tài liệu bạn cung cấp là dành cho "phát triển hiện tại" của gcc. Nhìn qua các bản phát hành khác nhau, thuộc tính chỉ xuất hiện trong tài liệu cho gcc 4.3 trở lên.

+0

Tôi đoán điều đó là có thể. Trình biên dịch của tôi là gcc 4.0.0. – Sukanto

7

Thích ứng từ câu trả lời của tôi trên this GCC question, bạn có thể thử sử dụng chỉ thị #pragma, như vậy:

#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 

Các #pragma push_optionspop_options macro được sử dụng để kiểm soát phạm vi hiệu lực optimize pragma của. Bạn có thể tìm thêm chi tiết về các macro này trong số GCC docs.


Cách khác, nếu bạn thích GCC của attribute syntax, bạn sẽ có thể làm điều gì đó như:

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