Konfigurowanie środowiska kompilacji

Wyświetl źródło w GitHubie

Aby promować wolny i otwarty rozwój, OpenThread używa w narzędziu do kompilacji CMake. Obecnie ta łańcuch narzędzi jest wymagany do przeniesienia OpenThread na nową platformę sprzętową.

W przyszłości mogą być obsługiwane inne zestawy narzędzi do kompilacji, ale nie są one objęte zakresem tego przewodnika.

Utwórz nowe

Pierwszym krokiem jest skonfigurowanie nowego miejsca dla platformy sprzętowej. W tym przewodniku utworzymy nowe repozytorium o nazwie ot-efr32, które zawiera warstwę abstrakcji platformy, pakiet SDK platformy sprzętowej i kilka przydatnych skryptów.

W tym przykładzie utworzyliśmy repozytorium SiliconLabs/ot-efr32 w GitHubie i sklonowaliśmy je do ~/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

Struktura repozytorium

Aby zachować spójność z dotychczasowymi repozytoriami platformy w organizacji OpenThread w GitHub, możesz uporządkować repozytorium w ten sposób:

tree -F -L 1 --dirsfirst
.
├── examples/
├── openthread/
├── script/
├── src/
├── third_party/
├── CMakeLists.txt
├── LICENSE
└── README.md
Folder Opis
examples opcjonalne przykładowe aplikacje
openthread repozytorium openthread jako podmoduł,
script Skrypty do kompilowania, testowania i sprawdzania kodu
src Implementacja warstwy abstrakcji platformy
third_party Lokalizacja dla dowolnych źródeł zewnętrznych

Dodawanie podmodułów

Kolejnym krokiem jest dodanie repozytorium openthread i innych wymaganych repozytoriów jako podmodułów.

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.

W tym przykładzie dodamy wersję lite pakietu SDK Gecko firmy Silicon Labs jako moduł podrzędny w pliku 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.

Skrypty

Aby ułatwić sobie wykonywanie typowych zadań, możesz utworzyć skrypty w folderze script. Mogą to być skrypty do wykonywania takich zadań jak bootstrapping, kompilowanie, uruchamianie lintera kodu i skrypt testowy do sprawdzania CI w GitHubie.

Poniżej znajdziesz kilka przykładów skryptów, które są standardem w przypadku większości repozytoriów platform.

bootstrap

Ten skrypt powinien zainstalować wszystkie narzędzia i pakiety wymagane przez Twoją platformę sprzętową. Powinien on też wykonać skrypt bootstrap openthread, aby upewnić się, że użytkownik ma wszystko, czego potrzebuje do skompilowania pakietu OpenThread.

Przykładem jest skrypt bootstrapot-efr32.

build

Skrypt kompilacji CMake powinien umożliwiać użytkownikom kompilowanie pakietu OpenThread na Twojej platformie. Jeśli Twoje repozytorium definiuje jakieś przykładowe aplikacje, skrypt powinien je też skompilować. Skrypt powinien zawierać podstawowe opcje konfiguracji systemu, w tym definicje makr dla poszczególnych platform.

Przykładowy skrypt kompilacji znajdziesz w pliku ot-efr32.

test

Skrypt testowy może być przydatny użytkownikom do testowania zmian za pomocą zdefiniowanych przez Ciebie testów. Może to być coś tak prostego jak uruchamianie kompilacji weryfikujących poprawność lub coś tak skomplikowanego jak uruchamianie zestawu testów jednostkowych.

ot-efr32 skrypt po prostu wykonuje skrypt build dla każdej obsługiwanej płyty na każdej platformie efr32.

Przykładowy skrypt testowy znajdziesz w pliku ot-efr32.

make-pretty

Aby zachować spójny styl, skrypt powinien formatować kod, skrypty i pliki Markdown.

Możesz zdefiniować ten skrypt samodzielnie, ale najłatwiej będzie użyć skryptu make-pretty, którego używają istniejące repozytoria platformy. Skrypt wywołuje skrypty stylów openthread i pomaga zapewnić spójność stylu we wszystkich repozytoriach OpenThread.

Konfiguracja skryptu linkera

Skrypt GNU Linker określa, jak zmapować wszystkie sekcje w plikach wejściowych (.o pliki „obiektowe” wygenerowane przez GNU Compiler Collection (GCC)) do końcowego pliku wyjściowego (na przykład .elf). Określa on też lokalizację przechowywania każdego segmentu programu wykonywalnego oraz adres wejścia. Skrypt linkera dla konkretnej platformy jest często dostarczany razem z BSP platformy.

Skonfiguruj narzędzie ld tak, aby wskazywało skrypt linkera dla danej platformy za pomocą opcji target_link_libraries w docelowym pliku CMake dla platformy w pliku 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
)

Kod narzędzia startowego

Kod uruchamiający narzędzia jest często dostarczany razem z platformą BSP. Ten kod zwykle:

  1. realizuje funkcję wejściową (Reset_Handler) programu wykonywalnego;
  2. Definiuje tabelę wektorów przerwania
  3. Inicjowanie stosu i kupy
  4. kopiuje sekcję .data z pamięci nieulotnej do pamięci RAM;
  5. Przechodzi do głównej funkcji aplikacji w celu wykonania jej logiki.

Kod uruchamiający (kod źródłowy w języku C lub asemblera) musi być zawarty w bibliotece openthread-platform-name platformy, ponieważ w przeciwnym razie niektóre kluczowe zmienne używane w skrypcie linkera nie będą mogły być poprawnie zacytowane:

  • src/CMakeLists.txt

Przykład: startup-gcc.c w ot-cc2538 – src/CMakeLists.txt

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