Configurer l'environnement de compilation

Afficher le code source sur GitHub

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

D'autres chaînes d'outils de compilation pourront être compatibles à l'avenir, mais 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, vous allez créer un dépôt nommé ot-efr32, qui contient 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 maintenir la cohérence avec les dépôts de plate-forme existants dans l'organisation GitHub 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 le linting
src Implémentation 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 tous les autres dépôts 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.

Dans cet exemple, nous allons ajouter une version allégé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. Il peut s'agir de scripts pour des tâches telles que l'amorçage, la création, l'exécution d'un lint de code 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 plates-formes 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 à une plate-forme.

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

test

Un script de test peut être utile aux utilisateurs pour tester des modifications à l'aide des tests que vous avez définis. Il peut s'agir d'une tâche aussi simple que la vérification de l'intégrité ou aussi compliquée que le lancement d'une suite de tests unitaires.

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

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

make-pretty

Pour conserver un style cohérent, ce script doit mettre en forme le code, les scripts et les fichiers Markdown.

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

Configuration du script Linker

Le script GNU Linker décrit comment mapper toutes les sections des fichiers d'entrée (fichiers "objets" .o .o générés par la collection du compilateur GNU (GCC)) au fichier de sortie final (par exemple, .elf). Il détermine également l'emplacement de stockage de chaque segment d'un programme exécutable, ainsi que l'adresse d'entrée. Le script d'association spécifique à une plate-forme est souvent fourni avec le profil BSP de la plate-forme.

Configurez l'outil ld pour qu'il pointe vers le script linker spécifique à la plate-forme en utilisant 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 chaîne d'outils

Le code de démarrage de la chaîne d'outils est souvent fourni avec la page "Récapitulatif de facturation". En règle générale, ce code:

  1. Met en œuvre la fonction d'entrée (Reset_Handler) du programme exécutable
  2. Définit la table vectorielle continue
  3. Initialiser le segment de mémoire et 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 source de l'assemblage) doit être inclus dans la bibliothèque openthread-platform-name de votre plate-forme, sinon certaines variables clés utilisées dans le script Linker ne peuvent pas être entre guillemets 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
    $
)