mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Unterschiedliche Funktionssignatur für main() realisieren


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Walter T. (nicolas)


Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen,

je nach Zielplattform benötigt meine main()-Funktion eine 
unterschiedliche Signatur. Bei einem Target kehrt sie zurueck, bei einem 
anderen nie. Bislang habe ich das so gelöst:
#if DOXYGEN
    /* Fuer Doxygen darf der Funktionsname nicht als Makro definiert sein */

#elif defined( STM32F10x ) || defined( STM32F4XX )
    /* Zielplattform (Debug, Release, Modultests) */
    #define MAINFUN() main(void)

#elif defined( MOCKUP_SDL )
    /* Mockup */
    #define MAINFUN()  SDL_main(int argc, char *argv[])

#elif PC_UNITTEST
    /* Fuer Modultests auf dem PC existiert eine andere main() in UnityTestRunner.c */
    #define MAINFUN()  neverstart(void)

#else
    #error "unknown platform"

#endif

/** Main-Funktion fuer Zielplattform und PC-Mockup
 *
 * Die Main-Funktion benoetigt je nach Ziemplattform eine unterschiedliche Signatur. Sie
 * kehrt bei manchen Plattformen zurueck, bei manchen nie. */
int MAINFUN()
{
    #if defined( STM32F4XX ) || defined( STM32F10x )

        /* Timer und Interrupt-Prioritaeten einstellen */
        /* SysTick-IRQ deaktivieren.
        /* NVIC/ISRs konfigurieren */
        /* Zyklenzaehler fuer Profiling aktivieren */
        hierStehtQuelltext();

    #elif MOCKUP_SDL

        (void) argc;
        (void) argv;
        mocksdl_timer_init();

    #elif PC_UNITTEST

    #else
        #error "Undefined Target"

    #endif

    /* Plattform-unabhaengige Initialsierungen */
    ...

    /* Hauptschleife */
    while( 1 )
    {
        /* Was eine Hauptschleife eben so macht */
        ...

        /* Auf dem PC wird die Hauptschleife auch beendet */
        #ifdef MOCKUP_SDL
            /* Emulation beenden */
            if( ui_getAction() )
            {
                break;
            }
        #endif
    }


    #ifdef MOCKUP_SDL
        mocksdl_timer_deinit();
        return 0;
    #endif
}

Diese Lösung hat mir noch nie gefallen, ist aber so gewachsen. Die 
praktischen Nachteile liegen vor allem darin, dass externe Werkzeuge, 
die auf dem Quelltext arbeiten (Doxygen und der CDT Standalone Debugger) 
die main()-Funktionen nicht erkennen können.

Jetzt will ich es richtig machen.

Aber wie macht man es sinnvoller?
static inline __attribute__((always_inline)) void realMain(void);


#if defined( STM32F10x ) || defined( STM32F4XX )
    /* Zielplattform (Debug, Release, Modultests) */
    __attribute__((noreturn)) main(void)
    {
        realMain();
    }

#elif defined( MOCKUP_SDL )
    /* Mockup */
    int SDL_main(int argc, char *argv[])
    {
        (void) argc;
        (void) argv;
        mocksdl_timer_init();
        realMain();
        mocksdl_timer_deinit();
        return 0;
   }

   ... usw.

#endif

Eine Deklaration "static inline __attribute__((always_inline))" ist ja 
auch nicht unbedingt dazu geeignet, Debugging zu erleichern.

Wie geht es besser?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.