configura l'ambiente di creazione

Visualizza il codice sorgente su GitHub

Per promuovere lo sviluppo libero e aperto, OpenThread utilizza CMake nella toolchain di compilazione. Al momento, questa toolchain è necessaria per il porting di OpenThread a una nuova piattaforma hardware.

In futuro potrebbero essere supportate altre toolchain di compilazione, ma non rientrano nell'ambito di questa guida al porting.

.

Crea un nuovo repository

Il primo passaggio consiste nel configurare una nuova home page per la tua 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 della piattaforma esistenti nell'organizzazione GitHub di OpenThread, ti consigliamo di strutturare il tuo repository come segue:

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 la compilazione, i test e il linting
src L'implementazione del livello di astrazione della piattaforma
third_party Posizione di eventuali origini di terze parti

Aggiungere sottomoduli

Il passaggio successivo consiste nell'aggiungere openthread e tutti gli 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 Gecko di Silicon Labs 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, ti consigliamo di creare alcuni script nella cartella script. Potrebbero essere inclusi script per attività come l'inizializzazione, la compilazione, l'esecuzione di un linting del codice e uno script di test per i controlli CI di 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 anche eseguire lo script di bootstrap di openthread per assicurarsi che l'utente abbia tutto il necessario per compilare lo stack OpenThread.

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

build

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

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

test

Uno script di test può essere utile per consentire agli utenti di testare le modifiche utilizzando i test che hai definito. Può trattarsi di un'operazione semplice come l'esecuzione di build di controllo di congruenza o di un'operazione complessa come il lancio di una suite di test di 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 uno stile coerente, questo script deve formattare codice, script e file Markdown.

Puoi definire questo script autonomamente, ma potrebbe essere più semplice utilizzare lo script make-pretty utilizzato dai repository della piattaforma esistenti. Lo script richiama 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 "object" .o generati dalla raccolta di compilatori GNU (GCC)) al file di output finale (ad esempio .elf). Determina inoltre la posizione di archiviazione di ogni segmento di un programma eseguibile, nonché l'indirizzo di entrata. Lo script del linker specifico per la piattaforma viene spesso fornito con il BSP della piattaforma.

Configura lo strumento ld in modo che indichi lo script del linker specifico della piattaforma utilizzando target_link_libraries sul target CMake della piattaforma 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 della toolchain

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

  1. Implementa la funzione di entrata (Reset_Handler) del programma eseguibile
  2. Definisce la tabella dei vettori di interruzione
  3. Inizializza l'heap e lo 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 (codice sorgente C o assembly) deve essere incluso nella bibliotecaopenthread-platform-name della piattaforma, altrimenti alcune variabili chiave utilizzate nello script del linker non possono essere tra virgolette 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
    $
)