Módulo 1.2

Anatomía de una aplicación

Estructura interna de un proyecto Zephyr

Santi Scagliusi, PhD

Comenzar arrow_downward
settings
CMakeLists.txt
Sistema de build
tune
prj.conf
Configuración SW
account_tree
Overlays
Modificar HW
code
src/main.c
Tu código

Estructura de un proyecto Zephyr

Cada archivo tiene un propósito específico. Entender su función es clave para desarrollar aplicaciones.

folder_open Árbol de archivos típico

folder mi_aplicación/
settings CMakeLists.txt Build
tune prj.conf Config SW
tune Kconfig Opcional
folder boards/
account_tree nrf52840dk_nrf52840.overlay Config HW
folder src/
code main.c Código
settings

CMakeLists.txt

Define cómo construir el proyecto. Carga el sistema de build de Zephyr y especifica qué archivos compilar.

tune

prj.conf

Configuración de software mediante Kconfig. Habilita o deshabilita funcionalidades del kernel y drivers.

account_tree

*.overlay

Modifica la descripción del hardware (DeviceTree) sin tocar los archivos base. Ideal para personalizar pines.

code

src/main.c

Tu código de aplicación. Aquí va la lógica de negocio que utiliza las APIs de Zephyr.

CMakeLists.txt

El corazón del sistema de build. Define cómo CMake debe construir tu aplicación.

CMakeLists.txt
# Versión mínima de CMake requerida
cmake_minimum_required(VERSION 3.20.0)
# Cargar el sistema de build de Zephyr
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
# Nombre de tu proyecto
project(mi_aplicación)
# Archivos fuente a compilar
target_sources(app PRIVATE src/main.c)
1

cmake_minimum_required()

Especifica la versión mínima de CMake. Zephyr requiere al menos la versión 3.20.0.

2

find_package(Zephyr)

Carga todo el sistema de build de Zephyr: toolchain, Kconfig, DeviceTree, etc. Esta línea es la que hace la "magia".

3

project()

Define el nombre de tu proyecto. Aparecerá en los logs de build y en algunos metadatos.

4

target_sources()

Lista los archivos fuente (.c) que deben compilarse. El target app es creado automáticamente por Zephyr.

info
Orden importante: find_package(Zephyr) debe ir antes de project(). Este orden es específico de Zephyr.

prj.conf - Configuración de software

Habilita o deshabilita funcionalidades del sistema. Cada opción se traduce en #define en el código.

prj.conf
# Habilitar subsistema GPIO
CONFIG_GPIO=y
# Activar sistema de logging
CONFIG_LOG=y
CONFIG_LOG_DEFAULT_LEVEL=3
# Configuración de UART
CONFIG_SERIAL=y
CONFIG_UART_CONSOLE=y
# Deshabilitar algo
CONFIG_BOOT_BANNER=n
lightbulb
Formato: CONFIG_<SIMBOLO>=<valor>
Valores comunes: y (sí), n (no), números, strings entre comillas.

sync_alt Cómo funciona

CONFIG_GPIO=y
arrow_forward
#define CONFIG_GPIO 1
CONFIG_LOG=n
arrow_forward
/* CONFIG_LOG not defined */

layers Jerarquía de configuración

La configuración final es el resultado de combinar varias fuentes:

1 Valores por defecto de Zephyr
add
2 Configuración de la placa (_defconfig)
add
3 Tu prj.conf
arrow_downward
check_circle Configuración final

Explorando opciones con Kconfig GUI

No necesitas memorizar todas las opciones. La GUI de Kconfig te permite explorar y modificar la configuración visualmente.

tune nRF Kconfig - Configuración de proyecto
Categorías
General
Drivers
Networking
Bluetooth
Logging
Debug
Drivers
Vista simplificada de la interfaz de Kconfig

touch_app Cómo acceder a Kconfig GUI

1

En VS Code, abre la paleta de comandos (Ctrl+Shift+P)

2

Escribe nRF Kconfig y selecciona "Open nRF Kconfig GUI"

3

Explora las categorías, activa opciones y guarda los cambios

search Buscar opciones específicas

Usa el buscador de la GUI para encontrar opciones rápidamente:

search bluetooth

Encuentra todas las opciones relacionadas con Bluetooth

warning
Dependencias: Algunas opciones requieren que otras estén habilitadas. La GUI muestra estas dependencias automáticamente.

Overlays - Personalizar el hardware

Los overlays te permiten modificar la configuración del hardware sin editar los archivos base de la placa.

boards/nrf52840dk_nrf52840.overlay
/* Cambiar baudrate del UART */
&uart0 {
current-speed = <115200>;
};
/* Añadir un LED personalizado */
/ {
leds {
compatible = "gpio-leds";
led_custom: led_4 {
gpios = <&gpio0 17 GPIO_ACTIVE_LOW>;
label = "Custom LED";
};
};
};
info
Convención: El nombre del archivo debe coincidir con el board target: <board_target>.overlay

edit Qué puedes modificar

  • check_circle Cambiar propiedades de periféricos (baudrate, frecuencia, etc.)
  • check_circle Reasignar pines GPIO
  • check_circle Añadir nuevos dispositivos (LEDs, sensores, etc.)
  • check_circle Deshabilitar periféricos no utilizados
  • check_circle Definir aliases para acceso simplificado

folder_special Dónde colocar el overlay

check boards/<board_target>.overlay
check <board_target>.overlay En raíz

Sintaxis de DeviceTree

Conoce los elementos clave para escribir overlays correctamente.

auto_fix_high Sintaxis clave

&nodo Referencia a nodo existente
/ { } Nodo raíz (para añadir nuevos)
<valor> Valor numérico
"texto" Valor de texto (string)

code Patrones comunes

Modificar propiedad existente:
&uart0 { current-speed = <115200>; };
Deshabilitar periférico:
&spi1 { status = "disabled"; };
Crear alias:
/ { aliases { mi-led = &led0; }; };
lightbulb
Tip: Usa la extensión DeviceTree de VS Code para autocompletado y validación de sintaxis.

Todo junto: el flujo de build

Así es cómo todos los archivos trabajan juntos para generar el binario final.

tune
prj.conf
Config SW
account_tree
*.overlay
Config HW
code
src/*.c
Tu código
arrow_downward
settings
CMake
Procesa configuración
arrow_downward
build
Ninja + GCC
Compila
arrow_downward
memory
zephyr.hex
Binario final
info
Flujo simplificado: Tus archivos de configuración + código fuente pasan por CMake y el compilador para producir un binario flasheable.

Pasos del proceso de build

Cada fase genera archivos intermedios que el siguiente paso necesita.

tune

Paso 1: Configuración

Kconfig procesa prj.conf y genera autoconf.h con todos los #define.

account_tree

Paso 2: DeviceTree

Los DTS y overlays se combinan para generar devicetree_generated.h con macros de hardware.

build

Paso 3: Compilación

GCC compila tu código junto con el kernel de Zephyr y los drivers habilitados. Ninja coordina el proceso.

tips_and_updates
El resultado: Un archivo zephyr.hex listo para flashear en tu placa. Contiene tu aplicación, el RTOS y todos los drivers necesarios.
check_circle

Lo que aprendiste hoy

Archivo 1

CMakeLists.txt

Define el proyecto y carga el sistema de build de Zephyr. Es obligatorio en todo proyecto.

Archivo 2

prj.conf

Configura el software con opciones Kconfig. Habilita drivers, protocolos y funcionalidades.

Archivo 3

*.overlay

Personaliza el hardware vía DeviceTree. Cambia pines, baudrates y añade dispositivos.

tips_and_updates

"Cada archivo tiene su propósito. Aprende a usar los tres y tendrás control total."

prj.conf para software, overlay para hardware, CMakeLists.txt para el build. Así de simple.

arrow_forward Siguiente módulo

1.3 GPIO - Entradas y salidas digitales

Pondremos en práctica lo aprendido controlando LEDs y leyendo botones usando las APIs de Zephyr.