PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > dsPIC - Bộ điều khiển tín hiệu số 16-bit

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

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

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 06-06-2010, 02:05 PM   #1
lybao_huy
Đệ 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
lybao_huy vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-06-2010, 04:21 PM   #2
lybao_huy
Đệ 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.
lybao_huy vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-06-2010, 01:04 AM   #3
truongtam2008
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à.
truongtam2008 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-06-2010, 10:24 PM   #4
lybao_huy
Đệ 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
lybao_huy vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
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
Old 23-06-2010, 09:14 PM   #6
lybao_huy
Đệ 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.
lybao_huy vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 23-06-2010, 09:30 PM   #7
lybao_huy
Đệ 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
lybao_huy vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 23-06-2010, 09:50 PM   #8
lybao_huy
Đệ 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.
lybao_huy vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 24-06-2010, 01:09 PM   #9
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
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) ;
xbuf sẽ được cấp phát để trỏ tới 1 trong các địa chỉ 0, 32, 64, 96.....
Trích:
b-int xbuf[16] _XBSS(2) ;
xbuf sẽ được cấp phát để trỏ tới 1 trong các địa chỉ 0, 2, 4, 6, 8....
__________________
- 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
Old 01-07-2010, 11:03 PM   #10
lybao_huy
Đệ tử 5 túi
 
Tham gia ngày: Jan 2008
Bài gửi: 97
:
Trích:
Nguyên văn bởi bien_van_khat View Post
xbuf sẽ được cấp phát để trỏ tới 1 trong các địa chỉ 0, 32, 64, 96.....

xbuf sẽ được cấp phát để trỏ tới 1 trong các địa chỉ 0, 2, 4, 6, 8....
Tôi có khai báo như sau:
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.
lybao_huy vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 25-06-2010, 12:59 AM   #11
lybao_huy
Đệ tử 5 túi
 
Tham gia ngày: Jan 2008
Bài gửi: 97
:
cảm ơn bạn nhiều lắm
lybao_huy vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-07-2010, 10:14 AM   #12
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
:
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.
Hình Kèm Theo
File Type: png Capture.PNG (30.8 KB, 21 lần tải)
File Type: png Capture1.PNG (28.9 KB, 13 lần tải)
__________________
- 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
Old 02-07-2010, 10:20 AM   #13
lybao_huy
Đệ tử 5 túi
 
Tham gia ngày: Jan 2008
Bài gửi: 97
:
Cảm ơn nhiều, mình đang xem
lybao_huy vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-07-2010, 12:01 PM   #14
lybao_huy
Đệ 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
lybao_huy vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-07-2010, 12:26 PM   #15
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
:
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.
__________________
- 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
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 12:21 AM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam