Konfigurowanie środowiska kompilacji

Wyświetl źródło na GitHubie

Aby promować bezpłatne i otwarte programowanie, OpenThread korzysta z narzędzia CMake w łańcuchu narzędzi do tworzenia. Obecnie ten łańcuch narzędzi jest wymagany do przenoszenia OpenThread na nową platformę sprzętową.

Inne łańcuchy narzędzi do tworzenia mogą być obsługiwane w przyszłości, ale nie są dostępne w tych łańcuchach tego przewodnika.

Utwórz nowe

Pierwszym krokiem jest skonfigurowanie nowej strony głównej dla platformy sprzętowej. W tym przewodniku utworzymy nowe repozytorium o nazwie ot-efr32, które będzie zawierać warstwę abstrakcji platformy, pakiet SDK platformy sprzętowej i kilka przydatnych skryptów.

W tym przykładzie utworzyliśmy repozytorium SiliconLabs/ot-efr32 na GitHubie i sklonowaliśmy je do folderu ~/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 istniejącymi repozytoriami platformy w organizacji OpenThread na GitHubie, warto zastosować taką strukturę repozytorium:

tree -F -L 1 --dirsfirst
.
├── examples/
├── openthread/
├── script/
├── src/
├── third_party/
├── CMakeLists.txt
├── LICENSE
└── README.md
Folder Opis
examples optional Przykładowe aplikacje
openthread Repozytorium openthread jako moduł podrzędny
script Skrypty do tworzenia, testowania i lintowania
src Implementacja warstwy abstrakcji platformy
third_party Lokalizacja wszystkich źródeł zewnętrznych

Dodaj moduły podrzędne

Następnym krokiem jest dodanie openthread i innych wymaganych repozytoriów jako modułów podrzędnych.

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 do third_party jako moduł podrzędny pakietu SDK Silicon Labs Gecko w wersji uproszczonej.

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. Może to obejmować skrypty do zadań takich jak wczytywanie, kompilowanie i uruchamianie lintera oraz skrypt testowy kontroli CI na GitHubie.

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

bootstrap

Skrypt ten powinien zainstalować wszystkie narzędzia i pakiety wymagane przez daną platformę sprzętową. Powinien również wykonać skrypt wczytywania platformy openthread, aby mieć pewność, że użytkownik ma wszystko, co jest potrzebne do utworzenia stosu OpenThread.

Przykład znajdziesz w skrypcie Boottrap w ot-efr32.

build

Skrypt kompilacji CMake powinien umożliwiać użytkownikom utworzenie stosu OpenThread dla Twojej platformy. Jeśli w Twoim repozytorium są zdefiniowane przykładowe aplikacje, ten skrypt też powinien je utworzyć. Skrypt ten powinien zawierać podstawowe opcje konfiguracji systemu, w tym wszelkie definicje makr związanych z daną platformą.

Przykład znajdziesz w skrypcie kompilacji w ot-efr32.

test

Skrypt testowy może być przydatny dla użytkowników w celu przetestowania zmian za pomocą zdefiniowanych przez Ciebie testów. Może to być coś prostego, jak uruchamianie kompilacji pod kątem poprawności, albo tak skomplikowanego jak uruchamianie pakietu do testów jednostkowych.

W ot-efr32 skrypt po prostu wykonuje skrypt build dla każdej obsługiwanej płytki na każdej z platform efr32.

Przykład znajdziesz w skrypcie testowym w ot-efr32.

make-pretty

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

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

Konfiguracja skryptu łączącego

skrypt GNU Linker, opisuje, jak zmapować wszystkie sekcje w plikach wejściowych (pliki „object”: .o wygenerowanych przez narzędzie GNU Compiler Collection (GCC) do ostatecznego pliku wyjściowego (dla np. .elf). Określa też lokalizację przechowywania każdego segmentu pliku danych programu wykonywalnego oraz adresu wejściowego. Łącznik związany z konkretną platformą często jest dostarczany w BSP platformy.

Skonfiguruj narzędzie ld tak, aby wskazywało skrypt łączący właściwy dla danej platformy za pomocą target_link_libraries na Twojej platformie docelowej w 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 uruchamiania łańcucha narzędzi

Kod startowy łańcucha narzędzi jest często dostarczany wraz z pakietem BSP platformy. Ten zwykle:

  1. Implementuje funkcję wpisu (Reset_Handler) programu wykonywalnego
  2. Definiuje tabelę wektorów przerwania
  3. Inicjuje stertę i stos
  4. Kopiuje sekcję .data z pamięci nieulotnej do pamięci RAM
  5. Przechodzi do głównej funkcji aplikacji, aby wykonać logikę aplikacji

Kod startowy (kod źródłowy C lub asemblera) musi być zawarty w kodzie Twojej platformy. biblioteka openthread-platform-name, w przeciwnym razie używane są niektóre kluczowe zmienne w tagu łączącym nie można poprawnie zacytować skryptu:

  • src/CMakeLists.txt

Przykład: startup-gcc.c w ot-cc2538src/CMakeLists.txt

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