2017-01-24 2 views
3

Ich entwickle eine eingebettete Software für mein benutzerdefiniertes Board (LPC1788). Mein Ziel ist es, Fähigkeiten und Erfahrungen in Bezug auf C-Programmierung für eingebettete Systeme zu verbessern.LPC1788 - Bootloader und shared library

Ich habe einen USB-Bootloader implementiert, der die Benutzeranwendung startet, falls sie existiert. Ansonsten wird es verwendet, um die Anwendung einfach über USB zu laden. Mein USB-Bootloader verwendet eine statische Bibliothek board.a und auch die Benutzeranwendung.

Gibt es einen Trick, wie board.a referenziert wird, die in die binäre von der Bootloader von der Benutzeranwendung verbunden wurde?

Mit anderen Worten, ich möchte Flash-Speicherplatz zu optimieren, indem Sie den Code board.a nur einmal eingeben.

NB: Ich benutze LPCXpresso (NXP MCU Tools/GNU Builder) Machen es Arm-ohne-EABI-gcc (GNU ARM Embedded Toolchain)

+2

Ich glaube nicht, dass es eine einfache Möglichkeit gibt, es zu tun, aber angenommen, dass Sie in Zukunft die Bibliothek board.a verbessern werden, so dass auch die userApp verbessert wird. Sie können die neue App mit der verbesserten Bibliothek hochladen, ohne den Bootloader zu berühren. Das ist die normale Arbeitsweise - ich meine: Du flashst den Bootloader nur einmal und die App einmal oder mehrmals. Ich denke, dass das Teilen der Bibliothek keine gute Idee ist. – linuxfan

+0

Ja, Sie haben einen Grund, board.a zu aktualisieren, um den Bootloader zu aktualisieren (nicht normales Arbeiten). Ich wollte nur den Platz optimieren. Danke :) – Abderrezak

+0

In der Theorie sehe ich keinen Grund, warum das nicht funktionieren würde. Aber es ist abhängig von Ihrer Toolchain (Compiler/Linker), also bearbeiten Sie Ihre Frage und fügen Sie Details dazu hinzu. – user694733

Antwort

2

Genau wie mit Shared Libraries auf einem Betriebssystem aufrufen. Ihr Systemdesign kann so sein, dass, wenn der Bootloader zu der Anwendung verzweigt, er beispielsweise eines der Register (beispielsweise r0) verwenden könnte, um die Adresse der "gemeinsam genutzten" Bibliothek zu enthalten, oder einen Zeiger auf ein Array von Zeigern enthalten könnte Das sind die Adressen für die einzelnen Funktionen in board.a, die Sie freigeben möchten. Funktionen sind nichts anderes als Adressen aus einer Linking/Using-Perspektive, es kommt also darauf an, Funktionszeiger in der Anwendung mit den bereits vorhandenen Funktionen im Adressraum in Übereinstimmung zu bringen (Flash nehme ich an). Dies ist alles, was gemeinsam genutzte Bibliotheken haben, da sie nur Bibliotheken und Stubs haben, damit sie für Ihre Anwendungen, die auf diesen Betriebssystemen laufen, unsichtbar sind.

+0

ein anderer Weg wäre, den Linker zu verwenden, um den gemeinsamen Code zu zwingen, an der gleichen Stelle zu landen, wenn er sowohl vom Bootloader als auch von der Anwendung verlinkt wird. Ein Linker-Skript-Eintrag, der besagt, dass dieser Code beispielsweise im Flash auf offset/address 0x2000 steht, aber der Bootloader ignoriert Adressen in diesem Bereich, wenn das Programm herunterlädt (vorausgesetzt, Sie verwenden intel hex oder motorola srecord formats oder vielleicht elf oder andere) , auf diese Weise gibt es keine andere Arbeit als nur eine oder zwei Zeilen für das Linker-Skript (möglicherweise muss ein Objekt anstelle der Bibliothek arbeiten). –

+0

Vielen Dank für Ihre Antwort. Es ist jetzt klarer für mich. Bitte lassen Sie mich wissen, wie Link-Bibliothek auf die gleiche Adresse zu erzwingen. Können Sie mir sagen, wie ich mein Wissen bezüglich Embedded-Entwicklung (HAL, C, Linker, Design, RTOS ...) verbessern kann? – Abderrezak

Verwandte Themen