'Char unsign gần' là gì?


12

Tôi đọc một biểu dữ liệu và tôi tìm thấy biến được định nghĩa là unsigned char near Sample_X. Đây là cái gì, và nó khác với unsigned char Sample_Xcái gì?


3
có lẽ cho phép trình biên dịch sử dụng offset nhỏ tương đối?
Neil_UK

6
Dựa trên một phần kinh nghiệm với x86 trong DOS, tôi sẽ mong đợi điều này với một số loại con trỏ và trong môi trường 16 bit. Tuy nhiên, những gì OP trích dẫn không giống như một con trỏ và liên kết biểu dữ liệu sẽ ngụ ý một số MCU. Tìm kiếm từ khóa "gần" trong hai liên kết sau: microchip.com/forums/m549709.aspx barrgroup.com/Embedded-Systems/How-To/E enough
frr

3
Cần lưu ý rằng đây là tiện ích mở rộng trình biên dịch, không phải tiêu chuẩn C
PlasmaHH

Nó có thể là về CCM. Xem xét rằng mã chủ yếu được nhắm mục tiêu cho MCU, nó có thể là một gợi ý gián tiếp cho trình liên kết bởi sự hỗ trợ của trình biên dịch để đặt nó trên CCM (bộ nhớ ghép lõi) nếu có.
Ayhan

1
FYI, từ khóa, nearlà một ví dụ về công cụ xác định lớp lưu trữ . Nó báo cho trình biên dịch một cái gì đó về cách hoặc nơi lưu trữ cho biến nên được phân bổ. (Xem câu trả lời của filo, bên dưới, để biết thêm về near).
Solomon chậm

Câu trả lời:


20

MCU được chỉ định ở đây là sê-ri MC9C08 của Freescale , sử dụng phiên bản nâng cao hơn một chút về kiến ​​trúc HC08 của họ. Đây là lõi 8 bit, (giống như nhiều loại khác) có hướng dẫn ngắn hơn và truy cập nhanh hơn vào địa chỉ "trang không" so với các địa chỉ khác. Địa chỉ trang không chỉ dài 8 bit thay vì 16 bit, do đó, các hướng dẫn tham chiếu chúng có thể là 2 byte thay vì 3 và mất ít hơn 1 chu kỳ để thực hiện .

Từ khóa "gần" hướng dẫn trình biên dịch đặt biến vào "trang không" nếu có thể, để có hiệu suất tốt hơn. Trình biên dịch được viết riêng cho phát triển nhúng, chẳng hạn như trình biên dịch này , thường triển khai các phần mở rộng như vậy cho ngôn ngữ (ở đây được mô tả là "Hỗ trợ C cho Trang không").


Tôi thích câu trả lời này, nhưng bạn có nguồn thông tin nào không?
Clonkex

1
Tôi chỉnh sửa câu trả lời để cung cấp thêm chi tiết và tài liệu tham khảo. Trên thực tế, đó là từ kiến ​​trúc HCS08 mới hơn của Freescale, nhưng đây là tương thích mã với các kiến ​​trúc HC08 và HC05 cũ hơn. Các kiến ​​trúc 6800 và 6502 (hiện tại rất tích cực) cũng có liên quan chặt chẽ với nhau.
Chromatix

Đẹp, tốt hơn nhiều!
Clonkex

Vì vậy, cách sử dụng của nó rất giống với registertừ khóa (đối với trường hợp bạn thực sự chắc chắn rằng đây là nơi bạn cần tối ưu hóa), nhưng hơi ít cực đoan?
vsz

Nhiều hơn hoặc ít hơn. Sự khác biệt chủ yếu là do các CPU 8 bit thường không có ngân hàng đăng ký mỗi se, chỉ có một bộ tích lũy duy nhất và một vài thanh ghi chỉ mục. Nhưng nó cũng tương tự như việc sử dụng các con trỏ "gần" so với "xa" trên x86, trong đó có sự khác biệt về kích thước của địa chỉ và thời gian để hoàn thành quyền truy cập.
Chromatix

15

Tùy thuộc vào kiến ​​trúc CPU, có thể có các hướng dẫn khác nhau để truy cập dữ liệu tại các địa chỉ khác nhau. Dưới đây là một ví dụ từ Keil cho một trong những trình biên dịch của họ.

Quyền truy cập gần có giới hạn bộ nhớ nhất định, do đó bạn có thể đưa ra gợi ý cho trình biên dịch để đặt một số biến thường được sử dụng trong một khu vực có thể truy cập bằng các hướng dẫn ngắn hơn (mô tả rõ ràng quyền truy cập vào không gian địa chỉ 32 bit lớn hơn địa chỉ 16 bit không gian). Điều này có thể dịch sang mã nhỏ hơn / nhanh hơn.



5
@AndrewMorton: Câu hỏi đó liên quan đến farneargợi ý về kiến ​​trúc 8086 đã lỗi thời. Các từ khóa tương tự được sử dụng theo kiểu liên quan nhưng khác nhau trên các vi điều khiển 8 bit.
supercat

@supercat Câu hỏi chỉ hỏi chung, mặc dù câu trả lời tập trung vào kiến ​​trúc cũ. Ai đó có kiến ​​thức nên viết câu trả lời trên đó giải thích cách chúng được sử dụng cho vi điều khiển 8 bit.
tò mò

@cquildannii: Mã trong câu hỏi được viết cho micro 8 bit.
supercat
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.