Khai báo biến với @ in C


11

Tôi đang đọc một số mã C và tình cờ thấy tuyên bố này trong chương trình:

unsigned char serv_ctr @0x0002;

Ai đó có thể chỉ cho tôi tài liệu hoặc giải thích "@ 0x0002" dùng để làm gì trong trình biên dịch Mplab XC8 v1.35 C không?


14
Tôi đoán rằng đó là một phần mở rộng trình biên dịch để đặt biến tại một địa chỉ cụ thể.
Eugene Sh.

2
câu hỏi có thể có lợi cho thẻ #mplab sau đó, vì hóa ra đây là đặc trưng của Mplab.
sylvainulg

Chỉ để có được nó: Đây có phải là chủ đề trên trang web này? Tôi nghĩ rằng cái này thuộc về SO. Hoặc là ổn để yêu cầu lập trình điều khiển vi mô ở đây. Điều này sẽ làm cho nó một chút không rõ ràng nơi câu hỏi này nên được.
Tạm biệt SE

6
@KamiKaze Tôi có thể hỏi chủ đề gì ở đây? liệt kê "việc viết phần sụn cho các ứng dụng kim loại trần hoặc RTOS" theo chủ đề và "Phần mềm lập trình cho PC" là chủ đề ngoài chủ đề. Vì đây có vẻ là về lập trình hệ thống nhúng, nên nó sẽ xuất hiện trong nháy mắt để được vào chủ đề. Rằng nó cũng có thể là chủ đề trên Stack Overflow không tự nó làm cho nó lạc đề ở đây.
một CVn

@KamiKaze cảm ơn bạn đã hỏi, tôi cũng có câu hỏi tương tự (Tôi không phải là người dùng thường xuyên của SE này)
GPPK

Câu trả lời:


20

Điều này là để xác định một địa chỉ tuyệt đối để đặt biến tại.
Từ hướng dẫn sử dụng trình biên dịch XC8 trang 27, phần 2.5.2 Địa chỉ tuyệt đối :

Các biến và hàm có thể được đặt tại một địa chỉ tuyệt đối bằng cách sử dụng __at()cấu trúc
......
2.5.2.2 KHÁC BIỆT
Các trình biên dịch 8 bit đã sử dụng ký hiệu @ để chỉ định một địa chỉ tuyệt đối


6

@là một phần mở rộng không chuẩn chung cho ngôn ngữ C cho phép bạn khai báo một biến tại một địa chỉ cụ thể. Nó có thể được sử dụng cho các thanh ghi phần cứng được ánh xạ bộ nhớ, vv Trong trường hợp đó, biến cũng phải được khai báo volatile, vì vậy ví dụ của bạn không chính xác.

Các trình biên dịch khác sử dụng một cái gì đó giống __attribute__(section...hoặc #pragma ..., tất cả đều không chuẩn C.

Lý do hợp lý duy nhất (nếu có) tại sao các chuỗi công cụ làm điều này, là để cho phép đăng ký gỡ lỗi trên các trình gỡ lỗi tào lao. Cú pháp không chuẩn sẽ đảm bảo rằng thanh ghi trở thành một phần của đầu ra liên kết và thông tin gỡ lỗi. Đến lượt nó cho phép bạn xem đăng ký trong trình gỡ lỗi crappy giống như bạn có thể xem bất kỳ biến nào khác.

Nếu bạn có một trình sửa lỗi tốt, nó sẽ có hỗ trợ và nhận thức về MCU cụ thể của bạn. Sau đó, bạn không cần crap phi tiêu chuẩn trong mã C, nhưng bạn có thể viết C tiêu chuẩn di động, thuần túy thay thế:

#define serv_ctr ( *(volatile uint8_t*)0x0002u )

1
Mặc dù trình biên dịch được yêu cầu chấp nhận biểu mẫu sau, việc triển khai được phép ánh xạ số đến địa chỉ theo bất kỳ cách nào chúng thấy phù hợp. Hơn nữa, hầu hết các trình biên dịch tôi từng thấy sử dụng các @nền tảng đích ký hiệu có nhiều không gian bộ nhớ hoặc các vấn đề khác để hầu hết mọi thứ được khai báo sử dụng @ký hiệu sẽ hoạt động khác với mọi thứ có thể được thực hiện mà không cần tiện ích mở rộng.
supercat

1

Một phần mở rộng ngắn:

Điều này không còn hoạt động kể từ xc8 2.0 trở lên. Bây giờ bạn phải viết:

unsigned char serv_ctr __at(0x0002);

để đặt một biến ( serv_ctr) tại một địa chỉ tuyệt đối ( 0x0002).

Với XC8 2.0, có thể biên dịch mã cũ của bạn bằng @cú pháp nếu bạn đặt cài đặt trình biên dịch để sử dụng định dạng "C90". Cài đặt trông như thế này, nó nằm trong "Tùy chọn toàn cầu XC8" và được gọi là "Tiêu chuẩn C".


Nhiều trình biên dịch hệ thống nhúng khác cũng hỗ trợ @cú pháp, không chỉ Mplab.
Lundin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.