Forum: Compiler & IDEs _open() Funktion überschreiben


von Johannes S. (Gast)


Lesenswert?

Hallo,
für eine TFT Simulation möchte ich Teile der mbed lib auf dem PC laufen 
lassen. Das klappt schon einigermassen gut, der Grafikteil funktioniert, 
aber mit dem retargetting komme ich nicht klar.
Dazu wird eine Funktion
1
extern "C" FILEHANDLE PREFIX(_open)(const char* name, int openmode) {
definiert die Ausgaben umlenkt wenn eine Datei angelegt wird die mit ":" 
anfängt. Für den µC mit GCC übersetzt funktioniert das, auf der PC Seite 
mit dem VC wird diese Funktion nicht aufgerufen. Das PREFIX Makro lässt 
den Namen wie er ist.
Wie bringe ich den VC dazu die _open Funktion zu benutzen?

von Jim M. (turboj)


Lesenswert?

Was genau willst Du machen? Ausgabeumleitung funktioniert unter 
richtigen Betriebssysteman anders, beispielsweise mit freopen() und 
einer Pipe oder Datei.

Die Umleitung via _open() ist AFAIK spezifisch für newlib - VisualC 
verwendet aber eine ganz andere C-Library.

von Johannes S. (Gast)


Angehängte Dateien:

Lesenswert?

Danke,
es geht mir um die Emulation einer Lib (AdafruitGFX und mbed) auf dem PC 
im VisualStudio. Konkreter hatte icch die Idee schonmal hier 
Beitrag "Re: Universelles Diagramobjekt erstellen" vorgestellt (in dem 
Thread findet der TO das aber OT, da also bitte nicht mehr drauf 
antworten).

Der Grafikteil von Adadruit funktioniert wenn ein SetPixel() im Treiber 
definiert wird, das ist also relativ einfach umzusetzen und funktioniert 
auch schon.
In mbed ist die Grafikklasse von mbed::Stream abgeleitet und stellt 
damit putc und printf für die formattierte Textausgabe zur Verfügung. 
Das ist etwas tricky mit dem Überschreiben der _open/_close/_read/_write 
Funktionen gelöst und funktioniert damit low level. Beim gcc lassen 
diese Funktionen sich einfach durch Neudefinition überschreiben (als 
weak deklariert?), der MSVC meckert beim Linken das diese Symbole schon 
vorhanden sind (normal). Dafür habe ich keine Lösung gefunden, es ist 
vielleicht auch nicht gut weil ein Windows Programm ja wer was durch 
open() alles öffnet.
Als Workaround habe ich jezt einfach das printf() im Grafiktreiber 
implementiert und das funktioniert, dann halt nur für printf aber darum 
ging es mir ja.
Kompliziert? Vielleicht, aber ich finde so Emulationen gut und man kann 
so bequemer eine Gui oder Menüs am PC entwickeln.

von Walter T. (nicolas)


Lesenswert?

Auf welcher Basis (Grafik-Biblionthek) hast Du das entwickelt?

Ich hatte mich für ein ähnliches Problem (LCD- und Tasten-Emulation) 
damals für SDL entschieden. Bei mir lag der Schwerpunkt beim Testen am 
PC (sprich: User Interface von Bekannten ohne Hardware testen lassen) 
und fürs Erstellen von Screenshots für die Gebrauchsanweisung.

von Johannes S. (Gast)


Lesenswert?

diese hier:
https://github.com/adafruit/TFTLCD-Library

https://github.com/adafruit/Adafruit-GFX-Library
davon hatte ich allerdings noch eine ältere Version sehe ich gerade, das 
werde ich noch nochmal aufräumen müssen. Aber das Prinzip ist gleich.

Die Libs sind für Arduino, lassen sich aber einfach für mbed 
umschreiben. Beim Arduino ist die Grafik von 'Print' abgeleiteet, einem 
sparsameren printf(). Aber auch das lässt sich dann einfach im Emu 
benutzen.

Nachtrag:
SDL läuft aber nicht auf dem µC? Ich war ja faul und habe einfach den µC 
Code genommen und auf dem PC übersetzt. Ansonsten muss man zwei Libs 
pflegen und synchron halten damit die den gleichen Output erzeugen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.