2013-04-11 39 views
25

Tôi tìm thấy tập tin tiêu đề này cho vi điều khiển PIC bằng tên của pic1250.h và tôi không thể nhận được hang của một số cú pháp được sử dụng trong nó.@ đăng nhập C biến khai báo

Các nguồn cho các tập tin là:

/* 
* Header file for the Microchip 
* PIC 12c508 chip 
* PIC 12c509 chip 
* Baseline Microcontrollers 
*/ 

static volatile unsigned char RTCC @ 0x01; 
static volatile unsigned char TMR0 @ 0x01; 
static volatile unsigned char PCL @ 0x02; 
static volatile unsigned char STATUS @ 0x03; 
static   unsigned char FSR @ 0x04; 
static volatile unsigned char OSCCAL @ 0x05; 
static volatile unsigned char GPIO @ 0x06; 

static   unsigned char control OPTION @ 0x00; 
static volatile unsigned char control TRIS @ 0x06; 

/* STATUS bits */ 
static bit GPWUF @ (unsigned)&STATUS*8+7; 
static bit PA0 @ (unsigned)&STATUS*8+5; 
static bit TO @ (unsigned)&STATUS*8+4; 
static bit PD @ (unsigned)&STATUS*8+3; 
static bit ZERO @ (unsigned)&STATUS*8+2; 
static bit DC @ (unsigned)&STATUS*8+1; 
static bit CARRY @ (unsigned)&STATUS*8+0; 

/* OPTION bits */ 
#define  GPWU (1<<7) 
#define  GPPU (1<<6) 
#define  T0CS (1<<5) 
#define  T0SE (1<<4) 
#define  PSA (1<<3) 
#define  PS2 (1<<2) 
#define  PS1 (1<<1) 
#define  PS0 (1<<0) 

/* OSCCAL bits */ 
static bit CAL7 @ (unsigned)&OSCCAL*8+7; 
static bit CAL6 @ (unsigned)&OSCCAL*8+6; 
static bit CAL5 @ (unsigned)&OSCCAL*8+5; 
static bit CAL4 @ (unsigned)&OSCCAL*8+4; 

/* GPIO bits */ 
static bit GP5 @ (unsigned)&GPIO*8+5; 
static bit GP4 @ (unsigned)&GPIO*8+4; 
static bit GP3 @ (unsigned)&GPIO*8+3; 
static bit GP2 @ (unsigned)&GPIO*8+2; 
static bit GP1 @ (unsigned)&GPIO*8+1; 
static bit GP0 @ (unsigned)&GPIO*8+0; 

#define CONFIG_ADDR 0xFFF 
#define FOSC0  0x01 
#define FOSC1  0x02 
#define WDTE  0x04 
#define CP  0x08 
#define MCLRE  0x0F 

Tôi không thể hiểu được toàn bộ modifer-datatype @ khai-một cái gì đó. Ai đó có thể giúp tôi không? Tôi chỉ là một newbie ở đây.

+0

Bạn đang sử dụng trình biên dịch nào? – FatalError

+13

Nó không phải là tiêu chuẩn C. '@' không phải là một phần của bộ ký tự thực hiện (nó chưa được thêm vào ASCII khi C được tạo ra). –

+1

Đây là một cái gì đó giống như gán bí danh cho địa chỉ bộ nhớ. –

Trả lời

37

Đó là phần mở rộng của trình biên dịch.

Từ PIC MPLAB XC8 biên dịch tài liệu (tôi nhấn mạnh):

5.5.4 Biến Absolute

Hầu hết các biến có thể được đặt tại một địa chỉ tuyệt đối bằng cách làm theo lời tuyên bố của mình với địa chỉ xây dựng @ , trong đó địa chỉ là vị trí trong bộ nhớ nơi biến số được định vị. Một biến như vậy được gọi là một biến tuyệt đối.

5.5.4.1 BIẾN ABSOLUTE TRÊN DỮ LIỆU BỘ NHỚ

biến Absolute chủ yếu dành cho đương địa chỉ của một định danh C với một chức năng đăng ký đặc biệt, nhưng có thể được sử dụng để đặt các biến thông thường tại một địa chỉ tuyệt đối trong bộ nhớ dữ liệu.

Ví dụ:

ổn unsigned char Portvar @ 0x06;

sẽ khai báo biến có tên Portvar nằm ở 06h trong bộ nhớ dữ liệu. Trình biên dịch sẽ dự trữ dung lượng lưu trữ cho đối tượng này (nếu địa chỉ rơi vào RAM có mục đích chung) và sẽ tương đương số nhận dạng của biến đó với địa chỉ đó.

Lưu ý rằng MPLAB XC8 không phải là trình biên dịch duy nhất có cùng cấu trúc @ để đặt đối tượng vào vị trí bộ nhớ cụ thể.

Trình biên dịch nổi tiếng khác là Freescale CodeWarrior (ít nhất là cho HCS08).

Một số khác là trình biên dịch IAR C (ít nhất là cho MSP430 và AVR).

+0

+ cho những nỗ lực của bạn để mang lại câu trả lời hay này –

+0

Được rồi, –

22

Đó là phần mở rộng trong trình biên dịch PIC, để đặt một biến tại vị trí bộ nhớ cụ thể. Không có trình biên dịch nào khác mà tôi biết có phần mở rộng đó.

+0

cách hữu ích khi đặt biến ở bộ nhớ cụ thể, bạn có thể giải thích thêm chút nữa. Nó không giống như ngôn ngữ cấp thấp? –

+11

Khi làm việc trực tiếp với phần cứng, đặc biệt là vi điều khiển hoặc công cụ nhúng, việc đưa mọi thứ tại địa chỉ cụ thể có thể * rất * hữu ích. Hệ thống có thể đọc hoặc ghi vào một địa chỉ cụ thể (trong trường hợp này, các bit trạng thái đó có thể đến từ một số đầu vào phần cứng). – ssube

+1

@GrijeshChauhan Xem xét chặt chẽ cách thức các CPU được tổ chức. Một số người trong số họ có đăng ký đặc biệt tại các vị trí bộ nhớ được xác định trước. Có, đăng ký trong không gian địa chỉ bộ nhớ.Những gì bạn thấy trong câu hỏi phản ánh điều đó. –

9

Đó là phần mở rộng ngôn ngữ C được trình biên dịch PIC hỗ trợ cho phép gán biến cho các địa chỉ RAM cụ thể.

exemples:

char a @ 0x25; /* place A at address 0x25 */ 
bit b @ 0x25.3; /* place B at the third bit of address 0x25 */ 

Có ba sử dụng cho việc này:

  • Trong hệ thống nhúng bạn thường có rất ít bộ nhớ và cần phải đóng gói một số biến trong byte tương tự.Cú pháp này làm cho nó dễ dàng hơn, mặc dù tiêu chuẩn bit field cũng sẽ hoạt động.
  • Lý do khác là sổ đăng ký PIC được ánh xạ tới RAM, để bạn có thể truy cập chúng như bất kỳ vị trí bộ nhớ nào khác. Với cú pháp này, bạn có thể định nghĩa các từ đồng nghĩa cho các bit mà bạn quan tâm và sử dụng chúng như các biến thông thường.
  • Đặt biến của riêng bạn (bất kể kích thước) tại một vị trí cụ thể. Điều này đôi khi hữu ích.

Hãy nhớ rằng lập trình nhúng là tất cả về kiểm soát toàn bộ phần cứng.

+0

+ & welcome, một câu trả lời hay khác .. bạn có thể thêm một số liên kết tham chiếu cho tôi –

+0

Thực tế không ly, tôi đã hoàn toàn tự hỏi tại sao tiêu đề không sử dụng các trường bit thay vì cú pháp mà tôi hầu như không nhận thức được! –

+1

@AviGabhawala: Bởi vì trong trường hợp này, các biến được thực hiện để chồng chéo với các thanh ghi được ánh xạ bộ nhớ (chúng ở đầu bộ nhớ). Vì vậy, khả năng thiết lập một vị trí cụ thể là điều cần thiết. Với bitfields bạn không thể làm điều đó. –

6

Ngoài những gì đã được nói, xin lưu ý rằng toán tử phi tiêu chuẩn @ là một tính năng không cần thiết. Bạn có thể đạt được một cách chính xác các hành vi tương tự với tiêu chuẩn C:

#define RTCC (*(volatile uint8_t*)0x0001u) 

Kể từ khi các biến trong trường hợp này là thanh ghi phần cứng, bạn không cần phải lo lắng về việc phân bổ, họ đã hiện diện trong phần cứng. Nếu bạn muốn cấp phát một biến tại một địa chỉ tùy chỉnh, sẽ có một tệp liên kết của một số loại để sửa lỗi đó (vì toán tử @ chỉ giải quyết phân bổ cụ thể cho các biến, không phải cho mã).

Lý do chính tại sao nhiều trình biên dịch được nhúng có một số toán tử không chuẩn như @ là do chúng không thể nghĩ ra ngoài hộp khi thiết kế trình gỡ lỗi. Họ mong đợi một số loại biến có mặt trong tệp đối tượng được cấp cho trình gỡ rối, nhưng nếu bạn sử dụng #define, không có "đối tượng thông tin gỡ lỗi" được cấp phát.

Nếu trình gỡ lỗi xem mã nguồn thay vào đó, hoặc tốt hơn, đã có nhận thức MCU tích hợp, thì mã không chuẩn sẽ không cần thiết. Các công cụ chất lượng cao từ các công ty chỉ tập trung vào các trình gỡ rối luôn đi kèm với sự hỗ trợ tích hợp để xem bản đồ đăng ký.