Build-Umgebung einrichten

Quellcode auf GitHub ansehen

Um die kostenlose und offene Entwicklung zu fördern, verwendet OpenThread CMake in der Build-Toolchain. Derzeit ist diese Toolchain für die Portierung von OpenThread auf eine neue Hardwareplattform erforderlich.

Andere Build-Toolchains werden möglicherweise in Zukunft unterstützt, fallen aber nicht in den Geltungsbereich dieses Portierungsleitfadens.

Neues Repository erstellen

Der erste Schritt besteht darin, ein neues Zuhause für Ihre Hardwareplattform einzurichten. In diesem Leitfaden erstellen wir ein neues Repository mit dem Namen ot-efr32, das die Plattformabstraktionsschicht, das SDK der Hardwareplattform und einige nützliche Scripts enthält.

In diesem Beispiel haben wir das Repository SiliconLabs/ot-efr32 auf GitHub erstellt und es in ~/repos/ot-efr32 geklont.

mkdir -p ~/repos
cd ~/repos
git clone git@github.com:SiliconLabs/ot-efr32.git
Cloning into 'ot-efr32'...
remote: Enumerating objects: 99, done.
remote: Counting objects: 100% (99/99), done.
remote: Compressing objects: 100% (60/60), done.
remote: Total 333 (delta 65), reused 39 (delta 39), pack-reused 234
Receiving objects: 100% (333/333), 170.78 KiB | 5.69 MiB/s, done.
Resolving deltas: 100% (194/194), done.
git status
On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean

Repository-Struktur

Um für Konsistenz mit vorhandenen Plattform-Repositories in der OpenThread-GitHub-Organisation zu sorgen, sollten Sie Ihr Repository so strukturieren:

tree -F -L 1 --dirsfirst
.
├── examples/
├── openthread/
├── script/
├── src/
├── third_party/
├── CMakeLists.txt
├── LICENSE
└── README.md
Ordner Beschreibung
examples Optional: Beispielanwendungen
openthread Das openthread-Repository als Submodul
script Scripts zum Erstellen, Testen und Linieren
src Implementierung der Plattformabstraktionsschicht
third_party Speicherort für Drittanbieterquellen

Submodule hinzufügen

Im nächsten Schritt fügen Sie openthread und alle anderen erforderlichen Repos als Submodule hinzu.

git submodule add git@github.com:openthread/openthread.git
Cloning into '/home/user/repos/ot-efr32/openthread'...
remote: Enumerating objects: 78281, done.
remote: Counting objects: 100% (1056/1056), done.
remote: Compressing objects: 100% (488/488), done.
remote: Total 78281 (delta 639), reused 864 (delta 556), pack-reused 77225
Receiving objects: 100% (78281/78281), 76.62 MiB | 35.24 MiB/s, done.
Resolving deltas: 100% (61292/61292), done.

In diesem Beispiel fügen wir eine Lite-Version des Silicon Labs Gecko SDK als Submodul in third_party hinzu.

cd third_party
git submodule add git@github.com:SiliconLabs/sdk_support.git
Cloning into '/home/user/repos/ot-efr32/third_party/sdk_support'...
remote: Enumerating objects: 32867, done.
remote: Counting objects: 100% (8181/8181), done.
remote: Compressing objects: 100% (3098/3098), done.
remote: Total 32867 (delta 4945), reused 7469 (delta 4732), pack-reused 24686
Receiving objects: 100% (32867/32867), 128.83 MiB | 30.91 MiB/s, done.
Resolving deltas: 100% (19797/19797), done.

Skripts

Um häufige Aufgaben zu vereinfachen, können Sie im Ordner script einige Scripts erstellen. Dazu gehören möglicherweise Scripts für Aufgaben wie Bootstrapping, Build, Ausführen eines Code-Linters und ein Testscript für GitHub-CI-Prüfungen.

Im Folgenden finden Sie einige Beispiele für Scripts, die für die meisten vorhandenen Plattform-Repositories standardmäßig sind.

bootstrap

Mit diesem Script sollten alle Tools und Pakete installiert werden, die für Ihre Hardwareplattform erforderlich sind. Außerdem sollte das Bootstrap-Script von openthread ausgeführt werden, damit der Nutzer alles hat, was zum Erstellen des OpenThread-Stacks erforderlich ist.

Ein Beispiel finden Sie im Bootstrap-Script in ot-efr32.

build

Mit dem CMake-Build-Script sollten Nutzer den OpenThread-Stack für Ihre Plattform erstellen können. Wenn Ihr Repository Beispielanwendungen definiert, sollten diese mit diesem Script ebenfalls erstellt werden. Dieses Script sollte die grundlegenden Systemkonfigurationsoptionen enthalten, einschließlich aller plattformspezifischen Makrodefinitionen.

Ein Beispiel finden Sie im Build-Script in ot-efr32.

test

Ein Testscript kann für Nutzer nützlich sein, um Änderungen mithilfe der von Ihnen definierten Tests zu testen. Das kann so einfach wie das Ausführen von Builds zur Fehlerbehebung oder so kompliziert wie das Starten einer Unit-Test-Suite sein.

In ot-efr32 führt das Script einfach das build-Script für jedes unterstützte Board auf jeder der efr32-Plattformen aus.

Ein Beispiel finden Sie im Testscript in ot-efr32.

make-pretty

Um ein einheitliches Styling beizubehalten, sollte dieses Script Code, Scripts und Markdown-Dateien formatieren.

Sie können dieses Script selbst definieren. Am einfachsten ist es jedoch, das Script make-pretty zu verwenden, das in vorhandenen Plattform-Repositories verwendet wird. Das Script ruft die Stilscripts von openthread auf und trägt dazu bei, einen einheitlichen Stil in allen OpenThread-Repositories zu gewährleisten.

Konfiguration des Linker-Scripts

Das GNU Linker-Script beschreibt, wie alle Abschnitte in den Eingabedateien (.o-Objektdateien, die von der GNU Compiler Collection (GCC) generiert wurden) der endgültigen Ausgabedatei (z. B. .elf) zugeordnet werden. Außerdem wird der Speicherort jedes Segments eines ausführbaren Programms sowie die Einstiegsadresse bestimmt. Das plattformspezifische Linker-Script wird oft mit der BSP der Plattform bereitgestellt.

Konfigurieren Sie das ld-Tool so, dass es mithilfe von target_link_libraries auf das plattformspezifische Linker-Script in Ihrem src/CMakeLists.txt-CMake-Ziel verweist:

set(LD_FILE "${CMAKE_CURRENT_SOURCE_DIR}/efr32mg12.ld")

target_link_libraries(openthread-efr32mg12
    PRIVATE
        ot-config
    PUBLIC
        -T${LD_FILE}
        -Wl,--gc-sections -Wl,-Map=$.map
)

Toolchain-Startcode

Der Toolchain-Startcode wird häufig zusammen mit dem BSP der Plattform bereitgestellt. Dieser Code hat in der Regel folgende Eigenschaften:

  1. Implementiert die Einstiegsfunktion (Reset_Handler) des ausführbaren Programms
  2. Definiert die Interrupt-Vektortabelle
  3. Initialisiert den Heap und den Stack
  4. Kopiert den Abschnitt .data aus dem nichtflüchtigen Speicher in den RAM
  5. Springt zur Hauptfunktion der Anwendung, um die Anwendungslogik auszuführen

Der Startcode (C- oder Assembly-Quellcode) muss in der openthread-platform-name-Bibliothek Ihrer Plattform enthalten sein. Andernfalls können einige wichtige Variablen, die im Linker-Script verwendet werden, nicht korrekt zitiert werden:

  • src/CMakeLists.txt

Beispiel: startup-gcc.c in ot-cc2538 – src/CMakeLists.txt

add_library(openthread-cc2538
    alarm.c
...
    startup-gcc.c
...
    system.c
    logging.c
    uart.c
    $
)