Configura l'ambiente di build

Visualizza sorgente su GitHub

Per promuovere lo sviluppo gratuito e aperto, OpenThread utilizza CMake nella catena degli strumenti di build. Al momento, questa toolchain è necessaria per trasferire OpenThread a una nuova piattaforma hardware.

Altre toolchain di build potrebbero essere supportate in futuro, ma non rientrano nell'ambito di questa guida al trasferimento.

Crea un nuovo repository

Il primo passaggio consiste nel configurare una nuova home page per la piattaforma hardware. In questa guida creeremo un nuovo repository denominato ot-efr32, contenente il livello di astrazione della piattaforma, l'SDK della piattaforma hardware e alcuni script utili.

In questo esempio, abbiamo creato il repository SiliconLab/ot-efr32 su GitHub e lo abbiamo clonato su ~/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

Struttura del repository

Per mantenere la coerenza con i repository della piattaforma esistenti nell'organizzazione OpenThread di GitHub, potresti voler strutturare il tuo repository come segue:

tree -F -L 1 --dirsfirst
.
├── examples/
├── openthread/
├── script/
├── src/
├── third_party/
├── CMakeLists.txt
├── LICENSE
└── README.md
Cartella Description
examples Facoltativo Applicazioni di esempio
openthread Il repository openthread come sottomodulo
script Script per la creazione, il test, il linting
src Implementazione del livello di astrazione della piattaforma
third_party Posizione per eventuali fonti di terze parti

Aggiungi sottomoduli

Il passaggio successivo consiste nell'aggiungere openthread ed eventuali altri repository richiesti come sottomoduli

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.

Per questo esempio, aggiungeremo una versione Lite dell'SDK Silicon Labs Gecko come sottomodulo in 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.

Script

Per semplificare le attività più comuni, potresti creare alcuni script nella cartella script. Questi possono includere script per attività come bootstrap, creazione, esecuzione di un ll code e uno script per il test dei controlli CI di GitHub.

Di seguito sono riportati alcuni esempi di script standard per la maggior parte dei repository di piattaforma esistenti.

bootstrap

Questo script deve installare tutti gli strumenti e i pacchetti richiesti dalla tua piattaforma hardware. Dovrebbe anche eseguire lo script bootstrap di openthread per garantire che l'utente disponga di tutte le informazioni necessarie per creare lo stack OpenThread.

Per un esempio, vedi lo script del bootstrap in ot-efr32.

build

Lo script di compilazione CMake deve consentire agli utenti di creare lo stack OpenThread per la tua piattaforma. Se il tuo repository definisce applicazioni di esempio, questo script dovrebbe crearle. Questo script deve contenere le opzioni di configurazione di base del sistema, comprese eventuali definizioni di macro specifiche della piattaforma.

Per un esempio, vedi lo script della build in ot-efr32.

test

Uno script per il test può essere utile per consentire agli utenti di testare le modifiche utilizzando i test che hai definito. Potrebbe trattarsi semplicemente di un'esecuzione del controllo di integrità o di un'operazione complicata come il lancio di una suite di test delle unità.

In ot-efr32, lo script esegue semplicemente lo script build per ogni lavagna supportata su ciascuna delle piattaforme efr32.

Per un esempio, vedi lo script per il test in ot-efr32.

make-pretty

Per mantenere uno stile coerente, questo script deve formattare il codice, gli script e i file di markup.

Puoi definire personalmente questo script, ma potrebbe essere più semplice utilizzare lo script make-pretty utilizzato dai repository di piattaforme esistenti. Lo script chiama gli script di stile di openthread e contribuisce a garantire uno stile coerente in tutti i repository OpenThread.

Configurazione dello script dei linker

Lo script GNU Linker descrive come mappare tutte le sezioni dei file di input (.o file "object" generati dalla GNU Compiler Collection (GCC)) all'output finale (ad esempio, .elf). Determina anche la località di archiviazione di ciascun segmento di un programma eseguibile, nonché l'indirizzo di ingresso. Lo script dei linker specifici della piattaforma è spesso fornito con il fornitore di servizi di pagamento.

Configura lo strumento ld in modo che punti allo script del linker specifico della piattaforma utilizzando target_link_libraries sulla destinazione CMake della piattaforma su 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
)

Codice avvio toolchain

Il codice di avvio toolchain viene spesso fornito insieme al BSP della piattaforma. Generalmente, questo codice:

  1. Implementa la funzione voce (Reset_Handler) del programma eseguibile
  2. Definisce la tabella vettoriale di interruzione
  3. Inizializza lo heap e lo stack
  4. Copia la sezione .data dalla memoria non volatile alla RAM
  5. Salta alla funzione principale dell'applicazione per eseguire la logica dell'applicazione

Il codice di avvio (C o codice sorgente dell'assemblaggio) deve essere incluso nella libreria openthread-platform-name della tua piattaforma, altrimenti alcune variabili chiave utilizzate nello script del linker non possono essere citate correttamente:

  • src/CMakeLists.txt

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

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