Was ist "nicht signierter Char in der Nähe"?


12

Ich habe ein Datenblatt gelesen und die Variable als definiert gefunden unsigned char near Sample_X. Was ist das und wie unterscheidet sich das unsigned char Sample_X?


3
Ermöglicht der Compiler möglicherweise die Verwendung kleiner relativer Offsets?
Neil_UK

6
Aufgrund von Teilerfahrungen mit x86 unter DOS würde ich dies mit einem Zeigertyp und in einer 16-Bit-Umgebung erwarten. Doch was das OP zitiert sieht nicht aus wie ein Zeiger und der Datenblatt-Link würde einige MCU implizieren. Suchen Sie in den folgenden beiden Links nach dem Schlüsselwort "near": microchip.com/forums/m549709.aspx barrgroup.com/Embedded-Systems/How-To/Efficient-C-Code
vom

3
Es sollte beachtet werden, dass dies eine Compilererweiterung ist, nicht Standard C
PlasmaHH 16.04.18

Es könnte sich um CCM handeln. In Anbetracht dessen, dass Code hauptsächlich für eine MCU bestimmt ist, kann es ein indirekter Vorschlag für einen Linker sein, der vom Compiler unterstützt wird, um ihn auf CCM (Core Coupled Memory) zu platzieren, sofern verfügbar.
Ayhan

1
Das Schlüsselwort FYI nearist ein Beispiel für einen Speicherklassenspezifizierer . Sie sagt dem Compiler etwas darüber, wie oder wo der Speicher für die Variable zugewiesen werden soll. (Weitere Informationen finden Sie in der Antwort von filo weiter unten near.)
Solomon Slow

Antworten:


20

Die hier angegebene MCU ist eine Freescale MC9C08-Serie , die eine leicht verbesserte Version ihrer HC08-Architektur verwendet. Dies ist ein 8-Bit-Kern, der (wie viele andere) kürzere Anweisungen und einen schnelleren Zugriff auf "Null-Seiten" -Adressen als andere hat. Nullseitenadressen haben nur eine Länge von 8 Bit anstelle von 16 Bit, sodass Anweisungen, die auf sie verweisen , 2 Byte anstelle von 3 Byte lang sein können und als Ergebnis 1 Zyklus weniger benötigen, um ausgeführt zu werden.

Das Schlüsselwort "near" weist den Compiler an, die Variable, wenn möglich, auf "zero page" zu setzen, um eine bessere Leistung zu erzielen. Compiler, die speziell für die eingebettete Entwicklung geschrieben wurden, wie dieser , implementieren normalerweise solche Erweiterungen für die Sprache (hier als "C Support for Zero Page" bezeichnet).


Diese Antwort gefällt mir, aber haben Sie eine Quelle für Ihre Informationen?
Clonkex

1
Ich habe die Antwort bearbeitet, um mehr Details und Referenzen bereitzustellen. Tatsächlich stammt es aus der neueren HCS08-Architektur von Freescale, diese ist jedoch mit den älteren HC08- und HC05-Architekturen codekompatibel. Die (inzwischen positiv veralteten) Architekturen 6800 und 6502 sind ebenfalls eng miteinander verwandt.
Chromatix

Schön, viel besser!
Clonkex

Die Verwendung ist also dem registerSchlüsselwort sehr ähnlich (für Fälle, in denen Sie wirklich sicher sind, dass hier eine Optimierung erforderlich ist), aber etwas weniger extrem?
vsz

Mehr oder weniger. Der Unterschied beruht hauptsächlich auf der Tatsache, dass 8-Bit-CPUs normalerweise keine Registerbank an sich, nur einen einzelnen Akkumulator und ein paar Indexregister haben. Es ist jedoch auch analog zur Verwendung von "Near" - und "Far" -Pointern auf x86, da sich die Größe der Adresse und die Dauer eines Zugriffs unterscheiden.
Chromatix

15

Abhängig von der CPU-Architektur kann es unterschiedliche Anweisungen für den Zugriff auf Daten unter verschiedenen Adressen geben. Hier ist ein Beispiel von Keil für einen ihrer Compiler.

Der Near-Zugriff hat eine bestimmte Speicherbeschränkung, daher können Sie dem Compiler Hinweise geben, um einige häufig verwendete Variablen in einem Bereich zu platzieren, auf den mit kürzeren Anweisungen zugegriffen werden kann (offensichtlich ist die Beschreibung des Zugriffs auf einen 32-Bit-Adressraum größer als die 16-Bit-Adresse) Raum). Dies kann zu kleinerem / schnellerem Code führen.



5
@ AndrewMorton: Diese Frage bezieht sich auf farund verweist nearauf die weitgehend veraltete 8086-Architektur. Dieselben Schlüsselwörter werden auf verwandten, aber unterschiedlichen Arten auf 8-Bit-Mikrocontrollern verwendet.
Supercat

@supercat Die Frage stellt sich nur allgemein, obwohl sich die Antworten auf die alte Architektur konzentrieren. Jemand, der sich auskennt, sollte darauf eine Antwort schreiben, in der erklärt wird, wie sie für 8-Bit-Mikrocontroller verwendet werden.
curiousdannii

@curiousdannii: Der fragliche Code wurde für ein 8-Bit-Mikro geschrieben.
Supercat
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.