2017-06-02 5 views
0

Ich werde eine einfache Bibliothek (A-Datei) in IAR Workbench für STM8 erstellen. In dieser Bibliothek möchte ich sowohl Hardware-SPI als auch Software-SPI für Benutzer zur Auswahl implementieren.IAR Build-Bibliothek mit anderen #define

In meinem library.c, schrieb ich:

#include "library.h" 

void LibraryInit() 
{ 
#ifdef HARDWARE_SPI 
    funcToInitHardwareSPI(); 
#else 
    funcToInitSoftwareSPI(); 
#endif 
} 

Und in meinem library.h, schrieb ich:

#ifndef __LIB_H 
#define __LIB_H 

#define HARDWARE_SPI 

void LibraryInit(); 

#endif 

Dann denke ich, wenn der Benutzer #define HARDWARE_SPI im Projektziel definieren, die Bibliothek wird Hardware-SPI-Teil ausführen. Wenn nicht, sollte Software-SPI verwendet werden.

Aber nachdem ich das Projekt erstellt und library.a und library.h in das Testprojekt aufgenommen habe, wobei library.h keine #define HARDWARE_SPI hat, geht die Routine noch in den Hardware-SPI-Teil über. Wie kann ich die library.a bauen, die Benutzer die Funktion wählen lassen kann, indem er #define in die Header-Datei schreibt?

+0

Nicht verwandt mit Ihrer Frage, aber verwenden Sie keine Symbole mit zwei führenden Unterstrichen oder einem führenden Unterstrich, gefolgt von einem Großbuchstaben. Diese Symbole sind in allen Bereichen für den Compiler und die Standardbibliothek reserviert. –

+0

@Someprogrammerdude Hast du! Danke, dass du mir etwas Grundlegendes beigebracht hast! – SoWaiSam

Antwort

0

Die Datei .a wird erstellt, bevor ein Benutzer sich für einen harten oder weichen Spi entscheidet, also können Sie nicht. Sie müssen beide Codepläne erstellen. Gibt es ein Problem mit der Bereitstellung der Bibliothek als Quelle?

In Anbetracht der Tatsache, dass Sie ein 8-Bit-MCU verwenden, nehme ich an, dass Sie nicht mit großen Abstraktionen mit Funktionszeigern herumhantieren wollen, daher muss die Auswahl Ihres Code-Pfades in Ihrem Header erfolgen. Wenn Ihr Compiler C99 unterstützt, können Sie die Funktionen platzieren, die zwischen den Implementierungen inline in der Kopfzeile wechseln:

/* library.h */ 

#pragma once 
void funcToInitHardwareSPI(); 
void funcToInitSoftwareSPI(); 

inline void LibraryInit() 
{ 
#ifdef HARDWARE_SPI 
    funcToInitHardwareSPI(); 
#else 
    void funcToInitSoftwareSPI(); 
#endif 
} 

beide codepaths Betrachtet werden Ihrer Bibliothek jetzt hinzugefügt, können Sie es mit jeder Funktion in einem separaten kompilieren wollen Abschnitt, und entfernen Sie dann alle nicht verwendeten Abschnitte während der Verknüpfung.

+0

Danke für die Antwort. Der Compiler unterstützt c99, also werde ich es versuchen. Wollen Sie nur eins sicherstellen: diese Codes sind in .h geschrieben? oder ich kann immer noch 'inline void LibraryInit();' in .h als Dekoration und Definition in .c einfügen? Ich kenne mich mit diesen Präprozessorbefehlen nicht aus, bin mir also nicht sicher, wie ich sie programmieren soll. Ich möchte es verstecken, weil die Einstellung zu kompliziert ist und ich nicht möchte, dass Leute es zu sehr ändern, führen zu großer Debug-Zeit. – SoWaiSam

+0

@SoWaiSam yep, das ist in der Kopfzeile. Die Funktion, die den Aufruf während der Kompilierungszeit an die richtige Implementierung weiterleitet, muss sich im Header befinden. Ich glaube auch nicht, dass es eine schlechte Sache ist, deinen Code sichtbar zu haben. Selbst die großen Betriebssysteme für Embedded-Geräte werden als reine Quelle zur Verfügung gestellt (obwohl sie möglicherweise keine freie Software sind), so dass alles in einem einzigen Schritt kompiliert und optimiert werden kann. – Lanting

+0

Alternativ können Sie zwei '.a'-Dateien mit den gleichen Signaturen bereitstellen und den Benutzer mit dem Link verknüpfen, den er benötigt. – Lanting