Was muss ich wissen, wenn ich eine Bibliothek für das Arduino erstelle?

8

Mir fällt ein, dass ich über mein aktuelles Problem hinaus fragen sollte: "Was sollte ich wissen, wenn ich eine Bibliothek für das Arduino erstelle?"

Erstens, was ich tue:

Ich verwende Eclipse als Editor und schreibe Code in C ++. Ich habe eine einfache Arduino-Anwendung geschrieben, die meine Header-Datei enthält, und arbeite an Fehlern.

Erstes Problem: Wie mache ich ein "Build Clean"? Ich sehe Fehler, die ich behoben habe, fast so, als ob die Header-Datei zwischengespeichert wäre. (Ja, wahrscheinlich mache ich etwas Dummes [ Bearbeiten : Ich war], aber ich möchte immer noch wissen, wie man die Bibliothek bereinigt, und weiß nicht, wo sich die Objektdateien befinden).

Zweitens: Welche Konventionen sollte ich beachten? Ich habe das Arduino nicht so oft benutzt, wie ich möchte, und es fühlt sich so gut an, in C ++ zu programmieren, aber ich weiß, dass die Absicht der Bibliotheken darin besteht, die Dinge für die Benutzer schön und einfach zu halten. Gibt es Konventionen für Funktionsnamen? Konstanten erstellen (es sieht so aus, als ob der globale Namespace mit #defines verschmutzt ist)? Und so weiter.

Gibt es noch etwas, das ich wissen sollte?

Ich sollte erwähnen, dass ich mir das Arduino Library Tutorial angesehen habe , das gut ist, aber nicht sehr weit geht. Ich habe mir auch einige der Bibliotheken angesehen, die auf meinem System installiert sind.

Clinton Blackmore
quelle
1
Haben Sie die Arduino IDE ausprobiert und aufgegeben? Ich weiß, dass Arduino-IDE angesichts des allgemeinen Funktionsumfangs der Programmiererproduktivität von Eclipse-as-IDE verblasst. Wenn Sie in dieser Situation Arduino-IDE noch nicht ausprobiert haben, möchten Sie dies möglicherweise tun. Ich finde es zwar träge, aber explizite Neukompilierungen funktionieren genau so, wie sie sollten.
icarus74

Antworten:

3

Ich werde einen Stich machen. Ich habe keinen Code für Arduino geschrieben, aber ich habe viel C- und C ++ - Programmierung durchgeführt. Es wäre hilfreich, wenn ich Ihre Fehler tatsächlich sehen würde, aber trotzdem.

Die Hauptsache, an die Sie sich bei der Verwendung von C ++ mit C-Code immer erinnern müssen, ist, dass Ihr C ++ - Code Funktionen benötigt, die mit "extern" C "deklariert sind, wenn C-Code mit dem C ++ - Code verknüpft werden soll. Das "externe" C "teilt dem C ++ - Compiler mit, dass ich verknüpfbaren Code für C-Dateien erstelle oder Code aus C-Dateien verwende. Daher sollten alle Ihre Funktionen im Bibliotheks-API-Header mit einer Funktion in der Quelldatei korrelieren, die als "extern" C "void dosomething ()" definiert ist. Wenn Sie versuchen, Klassen in C ++ zu verwenden, denken Sie daran, dass C-Code sie nicht aufrufen kann. Sie müssen Funktionen (extern "C") erstellen, um auf das Objekt zugreifen zu können. Wenn Ihr C-Code mit einem C ++ - Compiler kompiliert wurde, machen Sie sich keine Sorgen um "extern" C ".

Wenn Sie C-Code in Ihrem C ++ - Code aufrufen möchten, müssen Sie den C-Header mit einem Konstrukt wie dem folgenden umschließen:

#ifdef ___cplusplus
extern "C" {
#endif

///all my C function declarations... yada yada

#ifdef __cplusplus
}  //end extern "C"
#endif

Wenn Sie in C ++ arbeiten, verwenden Sie nicht viel #defines, es sei denn, Sie erstellen Flags zur Kompilierungszeit wie "DEBUG" oder "VERSION2", um spezielle Codesätze zu erstellen. Verwenden Sie andernfalls "const int / char / float" für Nummerndefinitionen zur sicheren Typprüfung. Die Compiler sind normalerweise intelligent genug, um diese zu optimieren, sodass sie im ROM- / Code-Bereich landen (hängt jedoch davon ab). Erstellen Sie auch keine MACROS, sondern verwenden Sie Inline-Funktionen. Befolgen Sie beim Programmieren nicht immer die Konvention, wenn dies dumm ist, z. B. die Verwendung vieler Makros und Zahlendefinitionen in C ++. Das Gleiche gilt für die C99-Version von C, sie hat Dinge wie Inline-Funktionen und Konstanten aus C ++ hinzugefügt. Die Branche erkennt, wie viel fehlerhafter und schwer zu wartender Code durch übermäßige Verwendung der Präprozessorsprache entsteht.

Eclipse speichert normalerweise die obj-Dateien in einem Verzeichnis unter Ihrem Projekt. Wenn Sie einen "Debug" -Erstellung durchführen, befindet sich dieser unter dem Ordner "Debug" unter Ihrem Projektordner. Wenn Sie einen "Release" -Build ausführen, schauen Sie unter "Release" usw. nach. Normalerweise funktioniert ein sauberer Build in Eclipse nur für mich, sodass ich nicht weiß, was mit Ihrem Setup falsch läuft. Ich denke, stellen Sie sicher, dass Sie keine vorkompilierten Header erstellen.

Jay Atkinson
quelle