Frage

Ich stelle fest, dass weit ist Compiler spezifisch, aber meine Erwartung ist, dass die Platzierung des weit Spezifizierer sollte Sinn diejenigen, die wirklich Zeiger zu verstehen.

Also, ich habe zwei Anwendungen, die den Prozessor des gesamten Speicherraum teilen.

App A braucht Funktion foo aufzurufen, die in App B vorhanden ist.

Ich kenne den Speicherort der Funktion foo.

Also das sollte funktionieren, in app A:

typedef int (* __far MYFP)(int input);

void somefunc(void)
{
   int returnvalue;
   MYFP foo;

   foo = (MYFP) 0xFFFFFA;

   returnvalue = foo(39);
}
  • Ist die __far an der richtigen Stelle in der typedef?
  • Muss ich hinzufügen __far zur (MYFP) abgegeben?
  • legt nahe, einige Informationen, die der Aufruf von foo nicht zu dereferenziert braucht, was ist Ihre Erfahrung?
  • Was sonst noch über das sieht falsch, oder könnte ich versuchen, dies zu tun?

  • Gibt es einen besseren Weg, dies zu tun?

Edit:

Dies ist auf einem Embedded-Gerät (Freescale S12XEQ Gerät) mit Codewarrior. Es ist ein 16-Bit-Gerät mit 24-Bit-Speicherbereich, also ja, es ist segmentiert / überhöhte.

-Adam

War es hilfreich?

Lösung

Ist das __far an der richtigen Stelle in der typedef?

[Bearbeiten, als Antwort auf ChrisN Kommentar - Dank]

Dies ist eine Compiler-abhängige Funktion, da sie nicht Teil des ANSI C. Nach dem Compiler Handbuch << a href = "ist http://www.freescale.com/files/soft_dev_tools/doc/ref_manual/CW_Compiler_HC12_RM .pdf“rel = "noreferrer"> http: // www.freescale.com/files/soft_dev_tools/doc/ref_manual/CW_Compiler_HC12_RM.pdf >, Kapitel 8, haben Sie es richtig platziert. In anderen Compilern, müssen Sie die Reihenfolge umkehren. Dies sollte ziemlich einfach sein, herauszufinden, obwohl, da genau eine der beiden Optionen mit einem bestimmten Compiler kompiliert werden.

Muss ich hinzufügen __far zur (MYFP) abgegeben?

Nein, es ist Teil des Typs.

legen nahe, einige Informationen, die der Aufruf von foo nicht zu dereferenziert braucht, was ist Ihre Erfahrung?

Funktionszeiger können optional in C. Die folgenden Zeilen dereferenziert werden beide gültig, genau dasselbe zu tun:

foo = (MYFP)0xFFFFFA;
returnvalue = foo(39);  // 1
returnvalue = (*foo)(39);  // 2

Was sonst noch über das sieht falsch, oder könnte ich versuchen, dies zu tun?

Sie haben es genau richtig gemacht.

Andere Tipps

Das __far Schlüsselwort, zumindest in der MS Welt verwendet wurde, als Binaries erstellen, die segmentierten Speicher verwendet. Sie müssen 8086-Speichersystem verstehen, das zu verstehen. Die 8086, den Speicher in Segmente unterteilten, war jedes Segment 64K lang, so dass jede Adresse in einem Segment 16 Bit benötigt. Adressen kamen in zwei Formen vor: nah und fern. Eine in der Nähe von 16 Bit-Adresse war, und war ein in das aktuelle Segment versetzt, von CS, DS, ES, SS auf der Anweisung abhängig, war ein 32 Bit weit und bestand aus einem Segment und einen Offset. Im 8086 war die absolute Adresse 16 * + Segment-Offset, einen adressierbaren Bereich von 1 MB ergibt.

Wenn Sie nicht einen segmentierten Speicher-System, und es sieht aus wie Sie sind nicht, dann werden alle Adressen die gleiche Anzahl von Bits haben, so dass die Nah- / Fern-Unterscheidung nicht notwendig ist, was bedeutet, dass das Schlüsselwort wahrscheinlich vom Compiler ignoriert wird .

Dies ist ein Code-Snippet, das aus einem Projekt arbeitet arbeite ich an. Es ist Paradigm C ++, so verwendet es eine Version von Borland. Die CPU verwendet es ist ein 8086-Klon, so segmentiert 20-Bit-Speicher.

void softSerial0SR(unsigned16);
void (__far *softHandler)(unsigned16);

I initialisieren softHandler auf 0 ohne Beanstandung.

Dann

softHandler = softSerial0SR;

in Setup-Code.

es zu nennen, rufen Sie einfach softHandler wie eine normale Funktion.

Beachten Sie, dass dieser Code leicht für Sie aus dem eigentlichen Code gezwickt ich habe.

die beiden Programme, die von den gleichen Compiler / Optionen gebaut wurden, so dass sie verwenden die gleiche OBI?

Zustimmung der Code sieht gut aus - in diesem Fall ich eine Zerlegung des Codes erzeugt bekommen würde, und herauszufinden, ob es richtig herauskommt. Es gibt nur 10 Anweisungen an die sein sollte -. Und dann werden Sie sicher wissen, ob es funktioniert

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top