Para promover el desarrollo abierto y gratuito, OpenThread usa CMake en la cadena de herramientas de compilación. Actualmente, esta cadena de herramientas es necesaria para la portabilidad. OpenThread a una nueva plataforma de hardware.
Es posible que se admitan otras cadenas de herramientas de compilación en el futuro, pero no están dentro de el alcance de esta guía de portabilidad.
Crea un repositorio nuevo
El primer paso es configurar una nueva casa para tu plataforma de hardware. En esta guía, crearemos un nuevo repositorio llamado ot-efr32 que contiene la capa de abstracción de la plataforma, el SDK de la plataforma de hardware y algunas secuencias de comandos útiles.
En este ejemplo, creamos el repositorio SiliconLabs/ot-efr32 en GitHub y lo clonamos en ~/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
Estructura del repositorio
Para ayudar a mantener la coherencia con los repositorios de plataforma existentes en la organización de GitHub de OpenThread, recomendamos estructurar tu repositorio de la siguiente manera:
tree -F -L 1 --dirsfirst
.
├── examples/
├── openthread/
├── script/
├── src/
├── third_party/
├── CMakeLists.txt
├── LICENSE
└── README.md
| Carpeta | Descripción |
|---|---|
examples |
Aplicaciones de ejemplo opcionales |
openthread |
El repositorio openthread como submódulo |
script |
Secuencias de comandos para compilar, probar y analizar con lint |
src |
La implementación de la capa de abstracción de la plataforma |
third_party |
Ubicación de cualquier fuente de terceros |
Cómo agregar submódulos
El siguiente paso es agregar openthread y cualquier otro repositorio requerido 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.
Para este ejemplo, agregaremos una versión lite del SDK de Gecko de Silicon Labs como un submódulo en 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.
Secuencias de comandos
Para facilitar las tareas comunes, te recomendamos crear algunas secuencias de comandos en la carpeta script. Esto puede incluir secuencias de comandos para tareas como el arranque, la compilación, la ejecución de un linter de código y una secuencia de comandos de prueba para las verificaciones de CI de GitHub.
A continuación, se presentan algunos ejemplos de secuencias de comandos estándar para la mayoría de los repositorios de plataformas existentes.
bootstrap
Esta secuencia de comandos debe instalar todas las herramientas y los paquetes que requiere tu plataforma de hardware. También debe ejecutar la secuencia de comandos de arranque de openthread para garantizar que el usuario tenga todo lo necesario para compilar la pila de OpenThread.
Consulta la secuencia de comandos de arranque en ot-efr32 para ver un ejemplo.
build
La secuencia de comandos de compilación de CMake debería permitir a los usuarios compilar la pila de OpenThread para tu plataforma. Si tu repositorio define alguna aplicación de ejemplo, esta secuencia de comandos también debe compilarla. Esta secuencia de comandos debe contener las opciones básicas de configuración del sistema, incluidas las definiciones de macro específicas de la plataforma.
Consulta la secuencia de comandos de compilación en ot-efr32 para ver un ejemplo.
test
Una secuencia de comandos de prueba puede ser útil para que los usuarios prueben los cambios mediante las pruebas que hayas definido. Puede ser algo tan simple como ejecutar compilaciones de comprobación de estado o tan complicado como lanzar un paquete de pruebas de unidades.
En ot-efr32, la secuencia de comandos simplemente ejecuta la secuencia de comandos build para cada placa compatible en cada una de las plataformas efr32.
Consulta la secuencia de comandos de prueba en ot-efr32 para ver un ejemplo.
make-pretty
Para mantener un estilo coherente, esta secuencia de comandos debe dar formato al código, las secuencias de comandos y los archivos markdown.
Puedes definir esta secuencia de comandos por tu cuenta, pero es más fácil usar la de make-pretty que usan los repositorios existentes de la plataforma. La secuencia de comandos llama a las secuencias de comandos de estilo de openthread y ayuda a garantizar un estilo coherente en todos los repositorios de OpenThread.
Configuración de la secuencia de comandos del vinculador
El guion del vinculador de GNU
se describe cómo asignar todas las secciones en los archivos de entrada (archivos de "objetos" .o)
generado por GNU Compiler Collection (GCC)) al archivo de salida final (por
ejemplo, .elf). También determina la ubicación de almacenamiento de cada segmento de un
ejecutable, así como la dirección de entrada. El vinculador específico de la plataforma
se proporciona con el BSP de la plataforma.
Configura la herramienta ld para que apunte a la secuencia de comandos del vinculador específica de la plataforma con el siguiente comando:
target_link_libraries en el destino de CMake de tu plataforma en 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 inicio del conjunto de herramientas
El código de inicio de la cadena de herramientas suele proporcionarse junto con el BSP de la plataforma. Esta código normal en general:
- Implementa la función de entrada (
Reset_Handler) del programa ejecutable. - Define la tabla de vectores de interrupción
- Inicializa el montón y la pila
- Copia la sección
.datade la memoria no volátil a la RAM - Ir a la función principal de la aplicación para ejecutar su lógica
El código de inicio (C o código fuente de ensamblado) debe incluirse en el archivo
Biblioteca openthread-platform-name; de lo contrario, se usan algunas variables clave en el vinculador
la secuencia de comandos no se puede citar correctamente:
src/CMakeLists.txt
Ejemplo: startup-gcc.c en ot-cc2538 - src/CMakeLists.txt
add_library(openthread-cc2538
alarm.c
...
startup-gcc.c
...
system.c
logging.c
uart.c
$
)