Che cos'è "char unsigned vicino"?


12

Ho letto una scheda tecnica e ho trovato la variabile definita come unsigned char near Sample_X. Cos'è questo e in cosa differisce unsigned char Sample_X?


3
forse permette al compilatore di usare piccoli offset relativi?
Neil_UK

6
Basandomi sull'esperienza parziale con x86 in DOS, me lo aspetterei con qualche tipo di puntatore e in un ambiente a 16 bit. Tuttavia ciò che l'OP citato non sembra un puntatore e il collegamento del foglio dati implicherebbe un certo MCU. Cercare la parola chiave "vicino" nei seguenti due link: microchip.com/forums/m549709.aspx barrgroup.com/Embedded-Systems/How-To/Efficient-C-Code
FRR

3
Va notato che si tratta di estensioni del compilatore, non standard C
PlasmaHH

Potrebbe trattarsi di CCM. Considerando che il codice è principalmente destinato a un MCU, può essere un suggerimento indiretto al linker tramite il supporto del compilatore per posizionarlo su CCM (memoria accoppiata core) se disponibile.
Ayhan,

1
FYI, la parola chiave, nearè un esempio di un identificatore della classe di archiviazione . Indica al compilatore qualcosa su come o dove allocare la memoria per la variabile. (Vedi la risposta di filo, sotto, per maggiori informazioni near).
Solomon Slow

Risposte:


20

L'MCU qui specificato è una serie MC9C08 di Freescale , che utilizza una versione leggermente migliorata della loro architettura HC08. Questo è un core a 8 bit, che (come molti di questi) ha istruzioni più brevi e un accesso più rapido agli indirizzi "zero page" rispetto ad altri. Gli indirizzi a pagina zero sono lunghi solo 8 bit anziché 16 bit, quindi le istruzioni che fanno riferimento a essi possono essere 2 byte anziché 3, e di conseguenza richiedono 1 ciclo in meno per l'esecuzione .

La parola chiave "near" indica al compilatore di inserire la variabile in "pagina zero", se possibile, per prestazioni migliori. I compilatori scritti appositamente per lo sviluppo incorporato, come questo , di solito implementano tali estensioni al linguaggio (qui descritto come "Supporto C per pagina zero").


Mi piace questa risposta, ma hai una fonte per le tue informazioni?
Clonkex,

1
Ho modificato la risposta per fornire maggiori dettagli e riferimenti. In realtà, proviene dalla più recente architettura HCS08 di Freescale, ma questo è compatibile con il codice con le precedenti architetture HC08 e HC05. Anche le architetture (ora positivamente antiche) 6800 e 6502 sono strettamente correlate.
Chromatix,

Bello, molto meglio!
Clonkex,

Quindi, il suo utilizzo è molto simile alla registerparola chiave (per i casi in cui sei davvero sicuro che questo è dove hai bisogno di ottimizzazione), ma leggermente meno estremo?
vsz

Più o meno. La differenza è dovuta principalmente al fatto che le CPU a 8 bit in genere non hanno un banco di registri di per sé, solo un singolo accumulatore e un paio di registri di indice. Ma è anche analogo all'uso di puntatori "vicino" rispetto a "lontano" su x86, in quanto esiste una differenza nella dimensione dell'indirizzo e nel tempo impiegato per completare un accesso.
Chromatix,

15

A seconda dell'architettura della CPU potrebbero esserci diverse istruzioni per accedere ai dati a un indirizzo diverso. Ecco un esempio di Keil per uno dei loro compilatori.

L'accesso vicino ha un certo limite di memoria, quindi è possibile fornire suggerimenti al compilatore per posizionare alcune variabili utilizzate di frequente in un'area accessibile da istruzioni più brevi (ovviamente la descrizione dell'accesso a uno spazio di indirizzi a 32 bit è maggiore dell'indirizzo a 16 bit spazio). Questo può tradurre in codice più piccolo / più veloce.



5
@AndrewMorton: questa domanda riguarda fare indica nearl'architettura 8086 in gran parte obsoleta. Le stesse parole chiave sono utilizzate in modo correlato ma diverso nei microcontrollori a 8 bit.
supercat

@supercat La domanda si pone in genere, anche se le risposte si concentrano sulla vecchia architettura. Qualcuno competente dovrebbe scrivere una risposta spiegando come vengono utilizzati per i microcontrollori a 8 bit.
curiousdannii,

@curiousdannii: il codice in questione è stato scritto per un micro a 8 bit.
supercat,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.