Configura l'ambiente di build

Visualizza l'origine su GitHub

Per promuovere lo sviluppo senza costi e aperto, OpenThread utilizza CMake nella catena di strumenti di creazione. Attualmente, questa toolchain è necessaria per trasferire OpenThread su una nuova piattaforma hardware.

In futuro potrebbero essere supportate altre catene di strumenti per la creazione, ma non rientrano nell'ambito di questa guida al trasferimento.

Crea un nuovo repository

Il primo passo è configurare una nuova casa per la piattaforma hardware. In questa guida creeremo un nuovo repository denominato ot-efr32, che contiene il livello di astrazione della piattaforma, l'SDK della piattaforma hardware e alcuni script utili.

In questo esempio abbiamo creato il repository SiliconLabs/ot-efr32 su GitHub e lo abbiamo clonato in ~/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 piattaforme esistenti nell'organizzazione GitHub OpenThread, puoi strutturare il tuo repository in questo modo:

tree -F -L 1 --dirsfirst
.
├── examples/
├── openthread/
├── script/
├── src/
├── third_party/
├── CMakeLists.txt
├── LICENSE
└── README.md
cartella Descrizione
examples facoltativo Applicazioni di esempio
openthread Il repository openthread come sottomodulo
script Script per creazione, test, analisi tramite lint
src L'implementazione del livello di astrazione della piattaforma
third_party Posizione per le eventuali fonti di terze parti

Aggiungere sottomoduli

Il passaggio successivo consiste nell'aggiungere openthread e qualsiasi altro repository obbligatorio come sottomodulo

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 semplificata 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à comuni, puoi creare alcuni script nella cartella script. Potrebbero essere inclusi script per attività come bootstrap, creazione, esecuzione di un codice linter e script di test per i controlli CI GitHub.

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

bootstrap

Questo script dovrebbe installare tutti gli strumenti e i pacchetti richiesti dalla tua piattaforma hardware. Deve inoltre eseguire lo script di bootstrap di openthread per assicurare che l'utente disponga di tutto il necessario per creare lo stack OpenThread.

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

build

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

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

test

Uno script di test potrebbe essere utile agli utenti per testare le modifiche utilizzando qualsiasi test da te definito. Potrebbe essere qualcosa di semplice come eseguire build di controllo di integrità o creare una suite di test delle unità.

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

Per un esempio, consulta lo script di test in ot-efr32.

make-pretty

Per mantenere lo stile coerente, questo script dovrebbe formattare il codice, gli script e i file di markdown.

Anche se puoi definire questo script, potrebbe essere più semplice utilizzare lo script make-pretty usato dalla repository della piattaforma esistente. Lo script chiama gli script di stile di openthread e contribuisce a garantire uno stile coerente in tutti i repository OpenThread.

Configurazione dello script del linker

Lo script GNU Linker descrive come mappare tutte le sezioni dei file di input (file .o "object" generati dalla GNU Compiler Collection (GCC)) al file di output finale (ad esempio .elf). Determina inoltre la località di archiviazione di ogni segmento di un programma eseguibile e l'indirizzo della voce. Lo script Linker specifico della piattaforma viene spesso fornito con il BSP della piattaforma.

Configura lo strumento ld in modo che rimandi allo script di collegamento specifico per la piattaforma utilizzando target_link_libraries nella tua piattaforma di destinazione CMake in 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 di avvio di Toolchain

Spesso viene fornito il codice di avvio di Toolchain insieme al BSP della piattaforma. Generalmente, questo codice:

  1. Implementa la funzione di inserimento (Reset_Handler) del programma eseguibile
  2. Definisce la tabella dei vettori di interruzione
  3. Inizializza heap e stack
  4. Copia la sezione .data dalla memoria non volatile alla RAM
  5. Passa 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 non è possibile citare correttamente alcune variabili chiave utilizzate nello script linker:

  • 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
    $
)