Khai Báo Biến trong MPLAB C30
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 |
int x __attribute__ ((aligned (A))), A phải là mũ của 2, tại sao không phải là bội của.
mấy cái này thật khó hiểu. |
Đại khái theo tớ hiểu là như thế này:
int x __attribute__ ((aligned (16))) nó sẽ cấp phát một vùng nhớ 16byte trong bộ nhớ cho biến toàn cục kiểu int. Người ta làm như thế là để truy cập các câu lệnh DSP ấy mà. |
cảm ơn, lời giải đáp của bạn. Còn Các bạn khác thì sao, có thể giúp tôi được không
|
Trích:
VD: Bạn khai báo Code:
char a; Code:
int *wptr = (int*)str; Trong trường hợp này bạn phải khai báo Code:
char a; 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{ Code:
struct __attribute__ ((packed)){ |
Ồ, cảm ơn bạn nhiều lắm. thật tình mình đọc nhiều tài liệu rồi mà cũng không hiểu nhiều cho lắm. Mình chỉ hiểu là biến kiểu WORD thì phải có địa chỉ bắt đầu là chẵn(canh lề đúng). Hôm nay nhờ có bạn mà mình lại biết thêm. Vô cũng cảm ơn bạn, để mình coi tài liệu kĩ lại, rồi hỏi bạn cho xong cái quái quỷ này.
|
À trong tài liệu MPLAB_C_Compiler_dsPIC có nói:
Note: The device architecture requires that words be aligned on even byte boundaries, so care must be taken when using the packed attribute to avoid run-time addressing errors. vậy khai báo như sau sẽ vô nghĩa vì addressing error struct foo { char a; int x[2] __attribute__ ((packed)); }; vậy thì dùng packed Attribute chi cho mệt |
vd:
#define _XBSS(N) __attribute__((space(xmemory), aligned(N))). có gì khác nhau giữa 2 khai báo sau không: a-int xbuf[16] _XBSS(32) ; b-int xbuf[16] _XBSS(2) ; Xin bạn giải thích dùm. |
Trích:
Trích:
|
cảm ơn bạn nhiều lắm
|
Trích:
a-unsigned int f[4] __attribute__((aligned(8))); b-unsigned int ff[4] __attribute__((aligned(2))); Tôi không thấy sự khác biệt giữa 2 cách khai báo trên a- tôi thấy mảng f được phân bố trong bộ nhớ như sau: f: ở địa chỉ 2746 f+1: ở địa chỉ 2748 f+2: ở địa chỉ 2750 f+3: ở địa chỉ 2752 b- và mảng ff được phân bố trong bộ nhớ như sau: ff: ở địa chỉ 2856 ff+1: ở địa chỉ 2858 ff+2: ở địa chỉ 2860 ff+3: ở địa chỉ 2862 Mong Bạn giải thích dùm. |
2 Attachment(s)
source code của bạn như thế nào?
bạn xem 2 file đính kèm, chú ý mảng dummy được khai báo 2 lần với 2 kích thước khác nhau để cố tình thay đổi vị trí của mảng f. Nhưng trong cả 2 lần địa chỉ mảng f ko thay đổi, luôn nằm ở vị trí 0xD10, chia hết cho 8. |
Cảm ơn nhiều, mình đang xem
|
Tức quá Modem bị trục trặc!
À, mình thực hiện lại rồi thấy như sau: Nếu f[4] và ff[4] được khai báo toàn cục thì ok. Còn nếu f[4] và ff[4] khai báo trong hàm main() thì bị trục trặc vd: void main(){ unsigned int f[4] __attribute__((aligned(1024))); unsigned int ff[4] __attribute__((aligned(4096))); } Sao kì vậy |
Về nguyên tắc, attribute align là chỉ thị cho trình liên kết để sắp xếp biến. Trong khi biến cục bộ được được tạo ra khi chạy (run-time) và nằm trong stack chứ ko phải khi liên kết (link-time) do đó bạn ko thể yêu cầu linker làm cái việc mà nó ko thể làm được.
[updated] Sticky để mọi người quan tâm có thể đọc. |
Modem lại trục trặc.
Rất cảm ơn bạn. Thật tuyệt vời !!!!. |
Múi giờ GMT. Hiện tại là 09:49 PM. |
Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam