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?


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”).


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.



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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.