Apa itu 'unsigned char near'?

12

Saya membaca lembar data dan saya menemukan variabel didefinisikan sebagai unsigned char near Sample_X. Apa ini, dan bagaimana perbedaannya unsigned char Sample_X?

oposisi
sumber
3
mungkin memungkinkan kompiler untuk menggunakan offset relatif kecil?
Neil_UK
6
Berdasarkan pengalaman sebagian dengan x86 di DOS, saya akan mengharapkan ini dengan beberapa tipe pointer dan dalam lingkungan 16bit. Namun apa yang dikutip OP tidak terlihat seperti pointer dan tautan lembar data akan menyiratkan beberapa MCU. Cari kata kunci "dekat" di dua tautan berikut: microchip.com/forums/m549709.aspx barrgroup.com/Embedded-Systems/How-To/Efficient-C-Code
frr
3
Perlu dicatat bahwa ini adalah ekstensi kompiler, bukan standar C
PlasmaHH
Mungkin tentang CCM. Mempertimbangkan bahwa kode ini terutama ditargetkan untuk MCU, mungkin merupakan saran tidak langsung untuk linker dengan dukungan kompiler untuk menempatkannya di CCM (core coupled memory) jika tersedia.
Ayhan
1
FYI, kata kunci,, nearadalah contoh dari specifier kelas penyimpanan . Ini memberitahu kompiler sesuatu tentang bagaimana atau di mana penyimpanan untuk variabel harus dialokasikan. (Lihat jawaban filo, di bawah, untuk informasi lebih lanjut near).
Solomon Slow

Jawaban:

20

MCU yang ditentukan di sini adalah seri Freescale MC9C08 , yang menggunakan versi arsitektur HC08 yang sedikit ditingkatkan. Ini adalah inti 8-bit, yang (seperti banyak lainnya) memiliki instruksi lebih pendek dan akses lebih cepat ke alamat "halaman nol" daripada yang lain. Alamat halaman nol hanya panjangnya 8 bit, bukan 16 bit, jadi instruksi yang mereferensikannya bisa 2 byte, bukan 3, dan hasilnya 1 siklus lebih sedikit untuk dieksekusi .

Kata kunci "dekat" memerintahkan kompiler untuk meletakkan variabel dalam "halaman nol" jika memungkinkan, untuk kinerja yang lebih baik. Kompiler yang secara khusus ditulis untuk pengembangan yang disematkan, seperti ini , biasanya mengimplementasikan ekstensi tersebut ke bahasa (di sini digambarkan sebagai "Dukungan C untuk Zero Page")

Chromatix
sumber
Saya suka jawaban ini, tetapi apakah Anda memiliki sumber untuk informasi Anda?
Clonkex
1
Saya mengedit jawaban untuk memberikan lebih banyak detail dan referensi. Sebenarnya ini berasal dari arsitektur HCS08 Freescale yang lebih baru, tetapi ini kompatibel dengan kode dengan arsitektur HC08 dan HC05 yang lebih lama. Arsitektur (sekarang sangat kuno) 6800 dan 6502 juga terkait erat.
Chromatix
Bagus, jauh lebih baik!
Clonkex
Jadi, penggunaannya sangat mirip dengan registerkata kunci (untuk kasus di mana Anda benar-benar yakin bahwa ini adalah di mana Anda perlu optimasi), tetapi sedikit kurang ekstrim?
vsz
Lebih atau kurang. Perbedaannya terutama disebabkan oleh fakta bahwa CPU 8-bit biasanya tidak memiliki bank register, hanya satu akumulator dan beberapa register indeks. Tapi itu juga analog dengan penggunaan pointer "dekat" vs "jauh" pada x86, karena ada perbedaan dalam ukuran alamat dan berapa lama waktu yang dibutuhkan untuk menyelesaikan akses.
Chromatix
15

Tergantung pada arsitektur CPU, mungkin ada instruksi berbeda untuk mengakses data di alamat yang berbeda. Berikut adalah contoh dari Keil untuk salah satu kompiler mereka.

Akses dekat memiliki batas memori tertentu, jadi Anda dapat memberikan petunjuk kepada kompiler untuk menempatkan beberapa variabel yang sering digunakan di area yang dapat diakses dengan instruksi yang lebih pendek (jelas menggambarkan akses ke ruang alamat 32-bit lebih besar dari alamat 16-bit ruang). Ini dapat diterjemahkan menjadi kode yang lebih kecil / lebih cepat.

filo
sumber
7
Ada informasi lebih lanjut dalam Apa perbedaan antara pointer jauh dan pointer dekat?
Andrew Morton
5
@AndrewMorton: Pertanyaan itu berhubungan dengan fardan menunjuk nearpada arsitektur 8086 yang sebagian besar sudah usang. Kata kunci yang sama digunakan dalam mode yang terkait tetapi berbeda pada mikrokontroler 8-bit.
supercat
@supercat Pertanyaannya hanya bertanya secara umum, meskipun jawabannya fokus pada arsitektur lama. Seseorang yang berpengetahuan harus menulis jawaban di atasnya menjelaskan bagaimana mereka digunakan untuk mikrokontroler 8bit.
curiousdannii
@curiousdannii: Kode yang dimaksud ditulis untuk mikro 8-bit.
supercat