2017-12-12 118 views
9

Tôi đang làm việc với một số mã ban đầu được viết cho IAR và chuyển đổi nó thành biên dịch bằng trình biên dịch GCC.Sử dụng biểu tượng @ trong lập trình c?

Tuy nhiên, tôi bị kẹt với một dòng cụ thể vì tôi không hiểu cú pháp hoặc những gì đang diễn ra.

__root const uint32_t part_number @ ".part_number" = 701052; 

__root tôi đã phát hiện ra để biến được đưa vào mã cuối cùng ngay cả khi không có gì thực sự tham chiếu đến nó. const nghĩa là nó sẽ không thay đổi và được giữ trong ROM thay vì RAM.

Đây là phần @ ".part_number" mà tôi không theo dõi. Lỗi cụ thể mà tôi nhận được là "đi lạc" @ trong chương trình ".

Tôi hiểu rằng @ không phải là một phần của tiêu chuẩn C, nhưng tôi chưa có bất kỳ may mắn nào tìm thấy bất kỳ điều gì giải thích cú pháp này tôi thấy.

Nếu bất kỳ ai có thể giải thích, tôi thực sự sẽ đánh giá cao điều đó.

Cảm ơn

+1

Tôi nghi ngờ đó là hướng dẫn cho trình liên kết đặt biến đó vào phần thực thi có tên tương ứng. Tương đương gcc sẽ là thuộc tính 'section' (' const uint32_t part_number __attribute__ ((phần (".part_number")) = 701052; '). –

+2

Không có câu trả lời đầy đủ vì tôi không chắc chắn, nhưng" .part_number "cho tôi biết nó có thể nói cho người liên kết biết phần nào để lưu trữ biến/giá trị trong – Frank

+0

Thử [câu trả lời này] (https://stackoverflow.com/questions/24114365/does-at-symbol-and-dollar-sign-has -any-special-meaning-in-c-or-c) Câu trả lời thứ 3 gợi ý rằng đó là phần mở rộng của trình biên dịch không chuẩn để chỉ định địa chỉ vật lý – Psi

Trả lời

6

Từ this KB entry có vẻ như nó là cú pháp để hướng dẫn các mối liên kết để đặt các biến vào một phần cụ thể.

Nếu bạn thay vì đặt các đối tượng vào một phân khúc có tên là:

__no_init struct setup located_configuration @ "SETUP"; 

Cú pháp gcc tương đương là thông qua các thuộc tính section.

const uint32_t part_number __attribute__ ((section (".part_number")) = 701052; 
+0

Cảm ơn Matteo! – MidnightRover

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