Co to jest „unsigned char near”?

12

Przeczytałem arkusz danych i znalazłem zmienną zdefiniowaną jako unsigned char near Sample_X. Co to jest i czym to się różni unsigned char Sample_X?

oppo
źródło
3
może pozwala kompilatorowi na stosowanie małych przesunięć względnych?
Neil_UK
6
Opierając się na częściowym doświadczeniu z x86 w DOS, oczekiwałbym tego z pewnym typem wskaźnika i w środowisku 16-bitowym. Jednak to, co cytowany OP nie wygląda jak wskaźnik, a łącze do arkusza danych sugerowałoby MCU. Szukaj dla słowa kluczowego „koło” w dwóch poniższych linków: microchip.com/forums/m549709.aspx barrgroup.com/Embedded-Systems/How-To/Efficient-C-Code
FRR
3
Należy zauważyć, że jest to rozszerzenie kompilatora, a nie standardowe C
PlasmaHH 16.04.18
1
FYI, słowo kluczowe, nearjest przykładem specyfikatora klasy pamięci . Mówi kompilatorowi coś o tym, w jaki sposób lub gdzie należy przypisać pamięć dla zmiennej. (Zobacz odpowiedź filo poniżej, aby uzyskać więcej informacji near).
Solomon Slow
1
Czy to naprawdę temat na ten temat?
user541686,

Odpowiedzi:

20

Podany tutaj MCU to seria Freescale MC9C08 , która wykorzystuje nieco ulepszoną wersję swojej architektury HC08. Jest to 8-bitowy rdzeń, który (jak wiele takich) ma krótsze instrukcje i szybszy dostęp do adresów „zerowej strony” niż inne. Adresy strony zerowej mają tylko 8 bitów zamiast 16 bitów, więc instrukcje odnoszące się do nich mogą mieć 2 bajty zamiast 3 i w rezultacie wykonanie 1 cyklu krócej .

Słowo kluczowe „near” instruuje kompilator, aby w miarę możliwości umieścił zmienną w „zero page”, aby uzyskać lepszą wydajność. Kompilatory napisane specjalnie dla programowania wbudowanego, takie jak ten , zwykle implementują takie rozszerzenia języka (tutaj opisane jako „Obsługa C strony zerowej”).

Chromatix
źródło
Podoba mi się ta odpowiedź, ale czy masz źródło informacji?
Clonkex,
1
Zredagowałem odpowiedź, aby podać więcej szczegółów i odniesień. W rzeczywistości pochodzi z nowszej architektury Freescale HCS08, ale jest to zgodne z kodem starsze architektury HC08 i HC05. Architektury (obecnie pozytywnie starożytne) 6800 i 6502 są również ściśle powiązane.
Chromatix
Fajnie, znacznie lepiej!
Clonkex,
Jego użycie jest bardzo podobne do registersłowa kluczowego (w przypadkach, gdy naprawdę masz pewność, że właśnie tam potrzebujesz optymalizacji), ale nieco mniej ekstremalne?
vsz
Mniej więcej. Różnica wynika głównie z faktu, że 8-bitowe procesory zazwyczaj nie mają banku rejestrów jako takiego, tylko jeden akumulator i kilka rejestrów indeksowych. Ale jest to również analogiczne do użycia wskaźników „blisko” i „daleko” na x86, ponieważ istnieje różnica w wielkości adresu i czasie potrzebnym do uzyskania dostępu.
Chromatix
15

W zależności od architektury procesora mogą istnieć różne instrukcje dostępu do danych pod innym adresem. Oto przykład z Keil dla jednego z ich kompilatorów.

Dostęp bliski ma pewien limit pamięci, więc możesz dać kompilatorowi wskazówki, aby umieścił niektóre często używane zmienne w obszarze, do którego są dostępne krótsze instrukcje (oczywiście opisanie dostępu do 32-bitowej przestrzeni adresowej jest większe niż adres 16-bitowy przestrzeń). To może przełożyć się na mniejszy / szybszy kod.

filo
źródło
5
@AndrewMorton: To pytanie dotyczy fari nearwskazuje na w dużej mierze przestarzałą architekturę 8086. Te same słowa kluczowe są używane w pokrewny, ale różny sposób na 8-bitowych mikrokontrolerach.
supercat
@ superupat Pytanie ogólnie zadaje pytanie, chociaż odpowiedzi koncentrują się na starej architekturze. Osoba posiadająca wiedzę powinna napisać na niej odpowiedź wyjaśniającą, w jaki sposób są one wykorzystywane w mikrokontrolerach 8-bitowych.
curiousdannii
@curiousdannii: Kod ten został napisany dla 8-bitowej mikro.
supercat