|
Tài trợ cho PIC Vietnam |
dsPIC - Bộ điều khiển tín hiệu số 16-bit Theo dự kiến của Microchip, vào khoảng năm 2011 dsPIC sẽ có doanh số lớn hơn PIC |
|
Ðiều Chỉnh | Xếp Bài |
06-06-2010, 02:05 PM | #1 |
Đệ tử 5 túi
Tham gia ngày: Jan 2008
Bài gửi: 97
: |
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 |
07-06-2010, 04:21 PM | #2 |
Đệ tử 5 túi
Tham gia ngày: Jan 2008
Bài gửi: 97
: |
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. |
22-06-2010, 01:04 AM | #3 |
Nhập môn đệ tử
Tham gia ngày: May 2009
Bài gửi: 4
: |
Đạ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à. |
22-06-2010, 10:24 PM | #4 |
Đệ tử 5 túi
Tham gia ngày: Jan 2008
Bài gửi: 97
: |
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
|
23-06-2010, 09:58 AM | #5 | |
...Damned...
Tham gia ngày: Apr 2006
Nơi Cư Ngụ: Hồ Chí Minh
Bài gửi: 522
: |
Trích:
VD: Bạn khai báo Code:
char a; char str[128]; Code:
int *wptr = (int*)str; (*wptr)++; Trong trường hợp này bạn phải khai báo Code:
char a; char str[128] __attribute__ ((aligned(2))) ; 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; Code:
struct __attribute__ ((packed)){ char a; int i; }s; |
|
23-06-2010, 09:14 PM | #6 |
Đệ tử 5 túi
Tham gia ngày: Jan 2008
Bài gửi: 97
: |
Ồ, 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.
|
23-06-2010, 09:30 PM | #7 |
Đệ tử 5 túi
Tham gia ngày: Jan 2008
Bài gửi: 97
: |
À 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 |
23-06-2010, 09:50 PM | #8 |
Đệ tử 5 túi
Tham gia ngày: Jan 2008
Bài gửi: 97
: |
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. |
24-06-2010, 01:09 PM | #9 | ||
...Damned...
Tham gia ngày: Apr 2006
Nơi Cư Ngụ: Hồ Chí Minh
Bài gửi: 522
: |
Trích:
Trích:
|
||
25-06-2010, 12:59 AM | #10 |
Đệ tử 5 túi
Tham gia ngày: Jan 2008
Bài gửi: 97
: |
cảm ơn bạn nhiều lắm
|
01-07-2010, 11:03 PM | #11 | |
Đệ tử 5 túi
Tham gia ngày: Jan 2008
Bài gửi: 97
: |
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. |
|
02-07-2010, 10:14 AM | #12 |
...Damned...
Tham gia ngày: Apr 2006
Nơi Cư Ngụ: Hồ Chí Minh
Bài gửi: 522
: |
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. |
02-07-2010, 10:20 AM | #13 |
Đệ tử 5 túi
Tham gia ngày: Jan 2008
Bài gửi: 97
: |
Cảm ơn nhiều, mình đang xem
|
02-07-2010, 12:01 PM | #14 |
Đệ tử 5 túi
Tham gia ngày: Jan 2008
Bài gửi: 97
: |
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 |
02-07-2010, 12:26 PM | #15 |
...Damned...
Tham gia ngày: Apr 2006
Nơi Cư Ngụ: Hồ Chí Minh
Bài gửi: 522
: |
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. |
|
|