Para promover o desenvolvimento sem custo financeiro e aberto, o OpenThread usa o CMake na o conjunto de ferramentas de build. No momento, esse conjunto de ferramentas é necessário para fazer a portabilidade OpenThread para uma nova plataforma de hardware.
Outros conjuntos de ferramentas de compilação podem receber suporte no futuro, mas não estão incluídos o escopo deste guia de portabilidade.
Criar um novo repositório
A primeira etapa é configurar uma nova página inicial para sua plataforma de hardware. Neste guia, criaremos um novo repositório chamado ot-efr32, que contém a camada de abstração da plataforma, o SDK da plataforma de hardware e alguns scripts úteis.
Neste exemplo, criamos o repositório SiliconLabs/ot-efr32 no GitHub e o clonamos em ~/repos/ot-efr32.
mkdir -p ~/reposcd ~/reposgit clone git@github.com:SiliconLabs/ot-efr32.gitCloning 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 statusOn branch main Your branch is up to date with 'origin/main'. nothing to commit, working tree clean
Estrutura do repositório
Para ajudar a manter a consistência com os repositórios atuais da plataforma (link em inglês) na organização OpenThread GitHub, recomendamos estruturar seu repositório da seguinte maneira:
tree -F -L 1 --dirsfirst
.
├── examples/
├── openthread/
├── script/
├── src/
├── third_party/
├── CMakeLists.txt
├── LICENSE
└── README.md
| Pasta | Descrição |
|---|---|
examples |
Exemplos de aplicativos opcionais |
openthread |
O repositório openthread como um submódulo |
script |
Scripts para criar, testar e inspecionar |
src |
Implementação da camada de abstração da plataforma |
third_party |
Localização de fontes de terceiros |
Adicionar submódulos
A próxima etapa é adicionar openthread e qualquer outro repositório necessário como submódulos.
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.
Neste exemplo, vamos adicionar uma versão Lite do SDK do Silicon Labs Gecko como um submódulo em third_party.
cd third_partygit submodule add git@github.com:SiliconLabs/sdk_support.gitCloning 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.
Scripts
Para facilitar tarefas comuns, você pode criar alguns scripts na pasta script. Isso pode incluir scripts para tarefas como bootstraping, criação e execução de um linter de código e um script de teste para verificações de CI do GitHub.
Abaixo estão alguns exemplos de scripts que são padrão para a maioria dos repositórios de plataforma existentes.
bootstrap
Esse script instala todas as ferramentas e pacotes exigidos pela plataforma de hardware. Ela também precisa executar o script de inicialização do openthread para garantir que o usuário tenha tudo o que é necessário para criar a pilha do OpenThread.
Consulte o script de inicialização em ot-efr32 (link em inglês) para ver um exemplo.
build
O script de build do CMake precisa permitir que os usuários criem a pilha do OpenThread para sua plataforma. Se o repositório definir aplicativos de exemplo, o script vai criá-los também. Esse script deve conter as opções básicas de configuração do sistema, incluindo quaisquer definições de macro específicas da plataforma.
Consulte o script de build em ot-efr32 (link em inglês) para conferir um exemplo.
test
Um script de teste pode ser útil para que os usuários testem as alterações usando qualquer teste que você tenha definido. Isso pode ser algo simples, como executar builds de verificação de integridade ou tão complicado quanto iniciar um pacote de teste de unidade.
No ot-efr32, o script simplesmente executa o script build para cada placa compatível em cada uma das plataformas efr32.
Consulte o script de teste em ot-efr32 para ver um exemplo.
make-pretty
Para manter um estilo consistente, ele precisa formatar códigos, scripts e arquivos de marcação.
Você pode definir esse script por conta própria, mas pode ser mais fácil usar o script make-pretty que os repositórios da plataforma atuais estão usando. O script chama os scripts de estilo do openthread e ajuda a garantir um estilo consistente em todos os repositórios do OpenThread.
Configuração do script do vinculador
O script do GNU Linker
descreve como mapear todas as seções nos arquivos de entrada (arquivos de "objeto" .o
gerado pelo GNU Compiler Collection (GCC) para o arquivo de saída final (por
exemplo, .elf). Ele também determina o local de armazenamento de cada segmento de um
programa executável e o endereço de entrada. O vinculador específico da plataforma
script geralmente é fornecido com o BSP da plataforma.
Configure a ferramenta ld para apontar para o script do vinculador específico da plataforma usando
target_link_libraries no destino do CMake da plataforma em 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
)
Código de inicialização do conjunto de ferramentas
O código de inicialização do conjunto de ferramentas geralmente é fornecido com o BSP da plataforma. Isso normalmente:
- Implementa a função de entrada (
Reset_Handler) do programa executável - Define a tabela de vetores de interrupção.
- Inicializa o heap e a pilha
- Copia a seção
.datada memória não volátil para a RAM - Pula para a função principal do aplicativo para executar a lógica dele
O código de inicialização (código-fonte C ou assembly) deve ser incluído no arquivo
Biblioteca openthread-platform-name. Caso contrário, algumas variáveis importantes serão usadas no vinculador
script não pode ser citado corretamente:
src/CMakeLists.txt
Exemplo: startup-gcc.c em ot-cc2538: src/CMakeLists.txt
add_library(openthread-cc2538
alarm.c
...
startup-gcc.c
...
system.c
logging.c
uart.c
$
)