Configurer l'environnement de compilation

Afficher la source sur GitHub

Pour promouvoir le développement gratuit et ouvert, OpenThread utilise CMake dans la chaîne d'outils de compilation. Actuellement, cette chaîne d'outils est requise pour le transfert d'OpenThread vers une nouvelle plate-forme matérielle.

Il se peut que d'autres chaînes d'outils de compilation soient compatibles à l'avenir, mais qu'elles n'entrent pas dans le cadre de ce guide de transfert.

Créer un dépôt

La première étape consiste à configurer une nouvelle maison pour votre plate-forme matérielle. Dans ce guide, nous allons créer un dépôt nommé ot-efr32 contenant la couche d'abstraction de la plate-forme, le SDK de la plate-forme matérielle et quelques scripts utiles.

Dans cet exemple, nous avons créé le dépôt SiliconLabs/ot-efr32 sur GitHub et l'avons cloné dans ~/repos/ot-efr32.

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

Structure du dépôt

Pour assurer la cohérence avec les dépôts de plate-forme existants dans l'organisation GitHub d'OpenThread, vous pouvez structurer votre dépôt comme suit:

tree -F -L 1 --dirsfirst
.
├── examples/
├── openthread/
├── script/
├── src/
├── third_party/
├── CMakeLists.txt
├── LICENSE
└── README.md
Dossier Description
examples Exemples d'applications facultatifs
openthread Le dépôt openthread en tant que sous-module
script Scripts pour la création, le test et l'analyse lint
src Mise en œuvre de la couche d'abstraction de la plate-forme
third_party Emplacement des sources tierces

Ajouter des sous-modules

L'étape suivante consiste à ajouter openthread et tout autre dépôt requis en tant que sous-modules.

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.

Pour cet exemple, nous allons ajouter une version simplifiée du SDK Gecko de Silicon Labs en tant que sous-module dans third_party.

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.

Scripts

Pour faciliter les tâches courantes, vous pouvez créer des scripts dans le dossier script. Cela peut inclure des scripts pour des tâches telles que l'amorçage, la création, l'exécution d'un code lint et un script de test pour les vérifications GitHub CI.

Vous trouverez ci-dessous quelques exemples de scripts standards pour la plupart des dépôts de plate-forme existants.

bootstrap

Ce script doit installer tous les outils et packages requis par votre plate-forme matérielle. Il doit également exécuter le script d'amorçage de openthread pour s'assurer que l'utilisateur dispose de tous les éléments nécessaires pour créer la pile OpenThread.

Consultez le script d'amorçage dans ot-efr32 pour voir un exemple.

build

Le script de compilation CMake doit permettre aux utilisateurs de créer la pile OpenThread pour votre plate-forme. Si votre dépôt définit des exemples d'applications, ce script doit également les créer. Ce script doit contenir les options de configuration système de base, y compris les définitions de macros spécifiques à la plate-forme.

Consultez le script de compilation dans ot-efr32 pour voir un exemple.

test

Les scripts de test peuvent être utiles pour tester les modifications à l'aide des tests que vous avez définis. Cela peut être aussi simple que d'exécuter des builds de vérification d'intégrité ou aussi compliqué que de lancer une suite de tests unitaires.

Dans ot-efr32, le script exécute simplement le script build pour chaque carte compatible de chacune des plates-formes efr32.

Consultez le script de test dans ot-efr32 pour voir un exemple.

make-pretty

Pour assurer la cohérence du style, ce script doit formater le code, les scripts et les fichiers Markdown.

Vous pouvez définir ce script vous-même, mais il est plus simple d'utiliser le script make-pretty utilisé par les dépôts de la plate-forme existante. Le script appelle les scripts de style openthread et assure un style cohérent dans tous les dépôts OpenThread.

Configuration du script Linker

Le script GNU Linker explique comment mapper toutes les sections des fichiers d'entrée (fichiers "object" .o générés par la collection GNU Compiler (GCC)) à la sortie finale. (par exemple, .elf). Elle détermine également l'emplacement de stockage de chaque segment d'un programme exécutable, ainsi que l'adresse d'entrée. Le script Linker spécifique à la plate-forme est souvent fourni avec le BSP de la plate-forme.

Configurez l'outil ld pour qu'il pointe vers le script Linker spécifique à la plate-forme à l'aide de target_link_libraries sur la cible CMake de la plate-forme dans src/CMakeLists.txt:

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
)

Code de démarrage de la chaîne d'outils

Le code de démarrage de la chaîne d'outils est souvent fourni avec le BSP de la plate-forme. Ce code comprend généralement les éléments suivants:

  1. Implémente la fonction d'entrée (Reset_Handler) du programme exécutable
  2. Définit la table vectorielle interrompue
  3. Initialisation du tas de mémoire et de la pile
  4. Copie la section .data de la mémoire non volatile dans la mémoire RAM
  5. Accéder à la fonction principale de l'application pour exécuter la logique d'application

Le code de démarrage (C ou code de source d'assemblage) doit être inclus dans la bibliothèque openthread-platform-name de votre plate-forme, sans quoi certaines variables clés utilisées dans le script Linker ne peuvent pas être placées correctement:

  • src/CMakeLists.txt

Exemple: startup-gcc.c dans ot-cc2538 - src/CMakeLists.txt

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