Build-Umgebung einrichten

Quelle auf GitHub ansehen

OpenThread verwendet in der Build-Toolchain CMake, um die kostenlose und offene Entwicklung zu fördern. Derzeit ist diese Toolchain erforderlich, um OpenThread auf eine neue Hardwareplattform zu portieren.

Andere Build-Toolchains werden möglicherweise in Zukunft unterstützt, sind jedoch nicht Teil dieses Leitfadens für die Portierung.

Neues Repository erstellen

Im ersten Schritt richten Sie ein neues Zuhause für Ihre Hardwareplattform ein. In diesem Leitfaden erstellen wir ein neues Repository mit dem Namen ot-efr32, das die Plattformabstraktionsebene, das SDK der Hardwareplattform und einige nützliche Skripts enthält.

In diesem Beispiel haben wir das Repository SiliconLabs/ot-efr32 auf GitHub erstellt und 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 die Konsistenz mit vorhandenen Plattform-Repositories in der GitHub-Organisation von OpenThread zu wahren, 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 Repository openthread als Untermodul
script Skripts zum Erstellen, Testen, Linting
src Implementierung der Plattformabstraktionsschicht
third_party Standort für alle Drittanbieterquellen

Untergeordnete Module hinzufügen

Als Nächstes fügen Sie openthread und alle anderen erforderlichen Repositories als Untermodule 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 in third_party eine Basisversion des Silicon Labs Gecko SDK als Submodul 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

Für einige häufige Aufgaben empfiehlt es sich, einige Skripts im Ordner script zu erstellen. Dazu können Skripts für Aufgaben wie Bootstrapping, Erstellen, Ausführen eines Code-Linters und ein Testskript für GitHub-CI-Prüfungen gehören.

Im Folgenden finden Sie einige Beispiele für Skripts, die für die meisten vorhandenen Plattform-Repositories Standard sind.

bootstrap

Mit diesem Skript sollten alle für Ihre Hardwareplattform erforderlichen Tools und Pakete installiert werden. Es sollte auch das Bootstrap-Skript von openthread ausführen, damit der Nutzer alles hat, was zum Erstellen des OpenThread-Stacks erforderlich ist.

Ein entsprechendes Beispiel finden Sie im Bootstrap-Skript in ot-efr32.

build

Mit dem Build-Skript CMake sollten Nutzer den OpenThread-Stack für deine Plattform erstellen können. Wenn Ihr Repository Beispielanwendungen definiert, sollte dieses Skript auch diese erstellen. Dieses Skript sollte die grundlegenden Systemkonfigurationsoptionen enthalten, einschließlich aller plattformspezifischen Makrodefinitionen.

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

test

Ein Testskript kann für Nutzer hilfreich sein, um Änderungen anhand der von Ihnen definierten Tests zu testen. Das kann so einfach sein wie das Ausführen von Sanity-Check-Builds oder so kompliziert wie das Starten einer Unit-Test-Suite.

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

Im Testskript in ot-efr32 finden Sie ein Beispiel.

make-pretty

Damit die Stile einheitlich bleiben, sollte das Skript Code, Skripts und Markdown-Dateien formatieren.

Sie können dieses Skript selbst definieren, aber es ist am einfachsten, das Skript make-pretty zu verwenden, das vorhandene Plattform-Repositories verwenden. Das Skript ruft die Stilskripts von openthread auf und sorgt für einen einheitlichen Stil in allen OpenThread-Repositories.

Skriptkonfiguration für Verknüpfung

Im Skript GNU-Verknüpfung wird beschrieben, 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 und die Eingabeadresse bestimmt. Das plattformspezifische Skript für die Verknüpfung wird häufig mit dem BSP der Plattform bereitgestellt.

Konfigurieren Sie das ld-Tool so, dass es mit target_link_libraries im plattformspezifischen CMake-Ziel in src/CMakeLists.txt auf das plattformspezifische Verknüpfungsskript 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
)

Startcode für Toolchain

Häufig wird der Toolchain-Startcode zusammen mit dem BSP der Plattform bereitgestellt. Dieser Code:

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

Der Startcode (C- oder Assembly-Quellcode) muss in der Bibliothek openthread-platform-name Ihrer Plattform enthalten sein. Andernfalls können einige Schlüsselvariablen im Verknüpfungsskript nicht richtig in Anführungszeichen gesetzt werden:

  • src/CMakeLists.txt

Beispiel: startup-gcc.c in ot-cc2538src/CMakeLists.txt

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