Forum: Mikrocontroller und Digitale Elektronik Makro für #if #else #endif


von Hugo P. (portisch)


Lesenswert?

Hallo!

Meine C-Kenntnisse stehen nun am Ende ;)

Ich habe in meinem Projekt V-USB.
Das braucht in meiner main.c diese Funktionen um ohne Fehler zu 
kompilieren:
1
uchar usbFunctionRead(uchar *data, uchar len)
2
{
3
}
4
uchar usbFunctionWrite(uchar *data, uchar len)
5
{
6
}
7
usbMsgLen_t usbFunctionSetup(uchar data[8])
8
{
9
}

Nun will ich einen Kompilerswitch machen um V-USB auszuschließen.

Also ca so:
1
#if USB == 1
2
uchar usbFunctionRead(uchar *data, uchar len)
3
{
4
}
5
uchar usbFunctionWrite(uchar *data, uchar len)
6
{
7
}
8
usbMsgLen_t usbFunctionSetup(uchar data[8])
9
{
10
}
11
#endif

Nun meldet mir AVR Studio natürlich Fehler, da V-USB trotzdem erzeugt 
wird einen Fehler weil er die Funktionen nicht finden kann.

Beim IRMP Source habe ich sowas gesehen dass dann einfach ein Makro 
erzeugt wird:
1
#if IRMP_LOGGING == 1
2
static void
3
irmp_log (uint8_t val)
4
{
5
}
6
#else
7
#define irmp_log(val)
8
#endif

Wie muss ich das mit den Funktionen für V-USB umsetzen - ich schaffe es 
einfach nicht...

von Stefan (Gast)


Lesenswert?

Im Header :

if defined (VUSB)
 #define USBSETUP(d)    usbFunctionSetup(d)
 #define USBREAD(d,n)   usbFunctionRead(d,n)
 #define USBWRITE(d,n)  usbFunctionWrite(d,n)
#else
 #define USBSETUP(d)
 #define USBREAD(d,n)
 #define USBWRITE(d,n)
#endif


Und im USBXXX im Programm benutzen.

Stefan

von Stefan (Gast)


Lesenswert?

Edit:
Und USBXXX im Programm benutzen.
Stefan

von Hugo P. (portisch)


Angehängte Dateien:

Lesenswert?

Danke!

Aber ich bekomme es leider immer noch nicht hin :(

Ich habe einmal ein Dummy AVR Studio 5.1 Projekt angehängt.
Kann mir das jemand so umbauen damit es mit USB == 0 auch geht!?

Schaffe es einfach nicht.

Danke!

von Stefan E. (sternst)


Lesenswert?

Wenn du erreichen willst, dass es trotz Weglassen der Funktionen ohne 
Fehler gebaut wird, dann musst du dafür sorgen, dass auch der V-USB Code 
in dem Fall nicht übersetzt und gelinkt wird.
Mit USB == 0 muss auch der V-USB Code ausgeblendet werden.

von Hugo P. (portisch)


Lesenswert?

Daran habe ich auch schon gedacht.
Habe aber keine Möglichkeit gefunden um im AVR Studio den Code 
"dynamisch" im Linker auszuschließen...

von Hugo P. (portisch)


Lesenswert?

Hat keiner eine lösung für mich?

Derzeit habe ich hier ein Projekt, wo bei einem Master V-USB benutzt 
wird und beim Slave nicht.

Über einen Compiler Switch schalte ich zwischen Master und Slave um.
Beim Master müssen die usbdrv Datein im Projekt sein, da er sonst die 
Funktionen wie usb_init usw nicht findet.

Im Slave muss ich sie rausnehmen da es ansonsten zu den oben genannten 
Fehler kommt. Mit der Zeit ist das etwas umständlich und ich frage mich 
ob das mit AVR Studio v5.1 nicht irgendwie Automatisierbar ist!?

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Hugo Portisch schrieb:
> Hat keiner eine lösung für mich?
Die Lösung wurde doch shcon genannt! Du mußt das mit dem define schon 
durchziehen oder soweit modularisieren, das einfach zwei executables 
rauskommen eines für client und eines für server...

von Andreas D. (rackandboneman)


Lesenswert?

Evtl lassen sich die Quellen(!) von dem USB-Stack auch direkt per 
#include reinziehen? Dann werden sie auch von den restlichen 
Präprozessorgeschichten erfasst....

von Hugo P. (portisch)


Lesenswert?

Läubi .. schrieb:
> Hugo Portisch schrieb:
>>> Hat keiner eine lösung für mich?
>>  Die Lösung wurde doch shcon genannt! Du mußt das mit dem define schon
>>  durchziehen oder soweit modularisieren, das einfach zwei executables
>>  rauskommen eines für client und eines für server...

Ich habe schon einige Sachen mit dem #define probiert, schagffe es aber 
nicht.

Das kann ich ja so nicht 1:1 verwenden, oder?
#define USBSETUP(d)    usbFunctionSetup(d)

Gerade wie das mit dem Rückgabe der Funktionen funktionieren soll 
verstehe ich nicht.

von Achim M. (minifloat)


Lesenswert?

Hugo Portisch schrieb:
> Gerade wie das mit dem Rückgabe der Funktionen funktionieren soll
> verstehe ich nicht.

Dann mach halt in dem Zweig, wo es kein USB geben soll, die Defines zu 
einer Statischen 0 oder einem anderen ungefährlichen Rückgabewert.
1
#if USB == AN
2
#define USB_FUNKTION_DIE_WAS_ZURUECK_GIBT(d)   fzurueck(d)
3
#else
4
#define USB_FUNKTION_DIE_WAS_ZURUECK_GIBT(d)   0
5
#endif
mfg mf

von Peter D. (peda)


Lesenswert?

Hugo Portisch schrieb:
> Derzeit habe ich hier ein Projekt, wo bei einem Master V-USB benutzt
> wird und beim Slave nicht.

Warum machst Du nicht einfach 2 Projekte auf?
Das USB wird doch bestimmt nicht der einzige Unterschied zwischen den 2 
Programmen sein.
Die gemeinsamen Teile kann man ja trotzdem in einem gemeinsamen 
Verzeichnis erstellen.

Wenn man mit Gewalt 2 Projekte zu einem vermischt, leidet die 
Übersichtlichkeit und steigt die Fehleranfälligkeit.


Peter

von Hugo P. (portisch)


Lesenswert?

Peter Dannegger schrieb:
> Warum machst Du nicht einfach 2 Projekte auf?
>
> Das USB wird doch bestimmt nicht der einzige Unterschied zwischen den 2
> Programmen sein.
> Die gemeinsamen Teile kann man ja trotzdem in einem gemeinsamen
> Verzeichnis erstellen.
>
>
> Wenn man mit Gewalt 2 Projekte zu einem vermischt, leidet die
> Übersichtlichkeit und steigt die Fehleranfälligkeit.

Ich glaube das wird auch die Endlösung werden...

Wenn ich dann jedoch auch einen Slave mit USB haben will brauche ich 
schon 3 Projekte :(

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.