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?
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?
Câu trả lời:
Đ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
@
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 )
@
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.
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".
@
cú pháp, không chỉ Mplab.