View Single Post
Old 23-06-2010, 09:58 AM   #5
bien_van_khat
...Damned...
 
bien_van_khat's Avatar
 
Tham gia ngày: Apr 2006
Nơi Cư Ngụ: Hồ Chí Minh
Bài gửi: 522
:
Trích:
Nguyên văn bởi lybao_huy View Post
Hiện tại mình cũng không hiểu có gì khác nhau giữa các cách khai báo biến sau:

a/ int x __attribute__ ((aligned (8))) ; và int x;

b/ int x __attribute__ ((aligned )) ; và int x;

c/ int x __attribute__ ((packed)); và int x;

mong bạn giải thích dùm
1 - aligned để sắp xếp biến được khai báo tại vị trí có địa chỉ là bội của 1 giá trị nhất định. Còn tại sao giá trị đó phải là lũy thừa của 2 thì mình ko rõ.
VD: Bạn khai báo
Code:
char a;
char str[128];
Biến a có địa chỉ = 0, str trỏ tới địa chỉ = 1. str là byte-aligned. Kiến trúc của dsPIC ko cho phép truy xuất WORD theo byte-aligned. Tức là nếu bạn thực hiện biểu thức:
Code:
int *wptr = (int*)str;
(*wptr)++;
sẽ xảy ra trap address error.
Trong trường hợp này bạn phải khai báo
Code:
char a;
char str[128] __attribute__ ((aligned(2))) ;
Bây giờ con trỏ str sẽ trỏ tới địa chỉ là 2 thay vì 1. Các aligned cao hơn chỉ dành cho các hàm DSP.

2 - packed ngược lại với aligned để giảm align tới mức thấp nhất có thể. Thường dùng với struct
VD:
Code:
struct{
	char a;
	int i;
}s;
địa chỉ của field a = 0, và địa chỉ của field i = 2 vì biến i cần word-aligned. Và sizeof(s) = 4. Tuy nhiên nếu bạn khai báo
Code:
struct __attribute__ ((packed)){
	char a;
	int i;
}s;
Khi đó địa chỉ của field i = 1. và sizeof(s) = 3. Nhưng bây giờ ko thể truy xuất biến i theo word vì nó misaligned.
__________________
- Xin đọc trước khi post bài

Xin đặt code trong thẻ [ code ] [ /code ]
bien_van_khat vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn