2010-03-05 57 views
10

Làm cách nào để gán một địa chỉ bộ nhớ cụ thể cho con trỏ?Con trỏ đến một địa chỉ cố định cụ thể

Đăng ký chức năng đặc biệt trong bộ vi điều khiển như AVR m128 có địa chỉ cố định, AVR GCC định nghĩa SFR trong tệp tiêu đề io.h, nhưng tôi muốn tự xử lý nó.

Trả lời

28

Chắc chắn, không sao cả. Bạn chỉ có thể gán trực tiếp cho một biến:

volatile unsigned int *myPointer = (volatile unsigned int *)0x12345678; 

Những gì tôi thường làm là khai báo một bộ nhớ ánh xạ I/O vĩ mô:

#define mmio32(x) (*(volatile unsigned long *)(x)) 

Và sau đó xác định đăng ký của tôi trong một tập tin tiêu đề:

#define SFR_BASE (0xCF800000) 
#define SFR_1  (SFR_BASE + 0x0004) 
#define SFR_2  (SFR_BASE + 0x0010) 

Và sau đó sử dụng chúng:

unsigned long registerValue = mmio32(SFR_1); // read 
mmio32(SFR2) = 0x85748312;     // write 
+2

tôi w đã sử dụng một con trỏ void chung, trừ khi dữ liệu tại vị trí đó là một int không dấu. –

+1

Bạn nên khai báo các địa chỉ I/O được ánh xạ bộ nhớ dưới dạng 'biến động '. –

+0

@Sean, anh ấy muốn truy cập bộ nhớ được ánh xạ. Bạn không thể dereference một con trỏ 'void', những gì sử dụng sẽ được? –

Các vấn đề liên quan