Configura el entorno de compilación

Ver código fuente en GitHub

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 ~/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

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_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.

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:

  1. Implementa la función de entrada (Reset_Handler) del programa ejecutable.
  2. Define la tabla de vectores de interrupción
  3. Inicializa el montón y la pila
  4. Copia la sección .data de la memoria no volátil a la RAM
  5. 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
    $
)