Verwenden des Atmel-Software-Frameworks

http://www.atmel.com/tools/avrsoftwareframework.aspx?tab=overview

In meiner Firma gibt es ein Projekt, das von dieser Bibliothek abhängig ist. Es wird jedoch verwendet, indem einige .c- und .h-Dateien in das Projekt kopiert und ihre Namen zum Makefile hinzugefügt werden.

Ich würde erwarten, dass der richtige Weg zur Verwendung einer Bibliothek eines Drittanbieters lautet

  • Holen Sie sich entweder die bereits kompilierte statische Bibliothek plus öffentliche Header
  • oder erhalten Sie ein eigenständiges Projekt, um das oben Genannte zu erstellen, und dann Benutzerprojekte, die von der erstellten Bibliothek und nicht von ihren Quellen abhängen.

Es ist mir jedoch nicht gelungen, eine Lösung zu finden. Der Download, den ich oben in der Frage verlinkt habe, ist 1,25 GB groß und besteht aus verschiedenen Quellen und Makefiles.

Mein Ziel ist SAM4S und das Board ist vollständig benutzerdefiniert.

BEARBEITEN:

Zur Verdeutlichung hier meine Gründe, warum ich denke, dass meine beiden obigen Punkte der sauberste Weg sind, eine statische Bibliothek eines Drittanbieters zu integrieren.

  • Versionskontrolle - Holen Sie sich die neuen Versionen der Bibliothek sauber.
  • Trennung - die Bibliothek ist logischerweise kein Teil des Kernprojekts, sie sollte beispielsweise nicht vom externen Projekt abhängen (sonst - Spagetti-Code).
  • Read-only – verfallen Sie niemals der Versuchung, den Code von Drittanbietern zu ändern. Dadurch werden 1. Fehler eingeführt, da Ihnen im Allgemeinen das Verständnis der Bibliotheksautoren fehlt, und 2. das Aktualisieren auf neuere Versionen der Bibliothek verhindert.
Ich kenne die Lizenz nicht aus dem Kopf, aber im Allgemeinen ist das Kopieren und Einfügen von Quellen eine absolut vernünftige Möglichkeit, eine Bibliothek zu integrieren.

Antworten (2)

Ich denke, die Frage ist, warum eine Bibliothek eines Drittanbieters als Quellcode bereitgestellt wird und nicht eine vorkompilierte Objektdatei, die als Blackbox behandelt werden soll.

Berücksichtigen Sie die Compileroptionen, die sich darauf auswirken, wie Code erstellt wird, der Bibliotheksfunktionen aufruft und Rückgaben von Bibliotheksfunktionen verarbeitet. Gibt es Compileroptionen, die sich beispielsweise auf Folgendes auswirken:

  • Konventionen für die Übergabe von Argumenten (sind Argumente, die auf dem Stapel oder in Registern oder einer Kombination übergeben werden)
  • Endianess (einige ARM-Kerne sind entweder als Big- oder Little-Endian konfigurierbar ... bei SAM4S bin ich mir nicht sicher)

Wenn nicht auf beiden Seiten der Schnittstelle die gleichen Optionen verwendet werden, schlägt das Programm fehl.

Bedenken Sie auch, dass der Quellcode von Atmel auf mehreren Plattformen verwendet wird, darunter nicht nur eine Vielzahl von Mikrocontrollern mit ARM-Kernen, sondern auch deren AVR-Produktlinie. Wie viele verschiedene Versionen von vorkompilierten statischen Bibliotheken müssten existieren, um die Kombinationen von Compileroptionen und Mikrocontrollerzielen abzudecken? Die Anzahl der Objektdateien, die erforderlich wäre, um alle diese Permutationen abzudecken, wäre einfach unüberschaubar.

Ich muss zugeben, dass mir ein wenig unklar ist, wie das Auschecken einer vorkompilierten Objektdatei aus einem Versionskontrollsystem "sauberer" ist als das Auschecken von Quelldateien. Wenn das Auschecken nur einer vorkompilierten Objektdatei im Gegensatz zum Auschecken mehrerer Quelldateien das Problem ist, sollten Sie die Dateien so organisieren, dass sich die Bibliotheksquelldateien in einem eigenen, gut benannten Unterverzeichnis befinden. Dies reduziert nicht die Anzahl der Dateien, kann aber beim sauberen/organisatorischen Aspekt helfen.

Hier ist ein Beispiel für einen möglichen Grund:

Der Code muss ein paar vom Entwickler zugewiesene Hardware-Pins setzen. Wenn die Bibliothek als Quellcodes angegeben ist, kann der Entwickler die Hardware-Pins #definieren und dann könnte der Code in der Bibliothek sein

PORT_CONSTANT.OUT = (1 << PIN0_CONSTANT) | (1 << PIN1_KONSTANTE) ;

Die Referenzen sind Konstanten und die Zeile könnte zu einer Prozessoranweisung kompiliert werden.

Wenn die Bibliothek als Objektdateien angegeben wird, müsste der Code innerhalb der Bibliothek so etwas wie sein

port_variable.OUT = (1 << pin0_variable) | (1 << pin1_variable) ;

Die Referenzen werden aus Variablen abgerufen und die Zeile müsste aus einigen Prozessoranweisungen innerhalb der Bibliothek bestehen.