Estudio preliminar sobre el microkernel de kernel L4 F9

F9 Kernel es una implementación experimental de microkernel inspirada en el famoso microkernel L4 para construir sistemas embebidos flexibles. La motivación para el desarrollo del microkernel F9 es utilizar las últimas ideas de diseño de kernel para ejecutar aplicaciones en tiempo real y de tiempo compartido (como aplicaciones de comunicación inalámbrica, etc.) en la serie de microprocesadores ARM Cortex-M, mientras se toma en cuenta eficiencia de la cuenta (rendimiento + consumo de energía) y rendimiento de seguridad (protección de memoria + ejecución aislada). Tiene las siguientes caracteristicas

  • F9 sigue los principios básicos del microkernel y solo implementa el espacio de direcciones, la gestión de subprocesos y el mecanismo de comunicación IPC en el modo de privilegio del procesador.
  • Diseñado y personalizado para la serie ARM Cortex-M, compatible con NVIC (controlador de interrupción vectorial anidado), banda de bits, MPU (unidad de protección de memoria).
  • La programación eficiente y el mecanismo tickless permiten que el ARM Cortex-M se active solo cuando sea necesario, ya sea en un momento predeterminado o en un evento de interrupción. Por lo tanto, produce mejores ahorros de energía que el método habitual de usar el temporizador del sistema SysTick, que requiere un reloj de alta frecuencia que funcione constantemente.
  • Admite el mecanismo KProbes, KProbes es un sistema de detección dinámica inspirado en el kernel de Linux, que permite a los desarrolladores recopilar información adicional sobre las operaciones del kernel sin volver a compilar o reiniciar el kernel. Permite que el código se inserte en la posición en el kernel.Cuando el núcleo ARM encuentra un punto de detección, el código insertado se ejecutará. Una vez que se ejecuta el código instrumentado, el kernel continuará ejecutándose normalmente.
  • Cada subproceso tiene su propio TCB (bloque de control de subprocesos) y se direcciona mediante su ID global. El despachador es responsable de cambiar el contexto. Los subprocesos con la misma prioridad se ejecutan por turnos.
  • Hay tres formas de administrar la memoria
    1. Grupo de memoria, que representa un área del espacio de direcciones físicas con atributos específicos.
    2. Página flexible (página flexible), que describe un área del espacio de direcciones que siempre está alineada en tamaño. A diferencia de otras implementaciones de L4, la página flexible en F9 reemplaza el área de MPU.
    3. El espacio de direcciones está compuesto por estas páginas flexibles.
  • Proporcionar llamadas al sistema para administrar el espacio de direcciones.
    1. Otorgar: Otorga páginas de memoria a nuevos usuarios y ya no pueden ser utilizadas por usuarios anteriores.
    2. Mapa: esto implementa la memoria compartida, las páginas de memoria se pasan a otra tarea, pero se pueden usar ambas tareas.
    3. Flush: las páginas de memoria que se han asignado a otros usuarios se eliminarán de su espacio de direcciones.
  • En cuanto a la interacción entre hilos de usuario y microkernels, se está adoptando el concepto de UTCB (User Level Thread Control Block). UTCB es un área pequeña específica del subproceso en el espacio de direcciones virtuales del subproceso, y siempre se asigna. Por lo tanto, el acceso a UTCB nunca causará una falla en la página, lo que permite que el kernel tenga un buen acceso a los parámetros de llamada del sistema, especialmente a las cargas útiles de IPC copiadas desde / hacia el hilo del usuario.
  • El núcleo proporciona IPC síncrono (comunicación entre procesos). El IPC corto solo lleva la carga útil en el registro de la CPU, mientras que el IPC completo replica la carga útil del mensaje a través de las UTCB de las partes comunicantes.
  • Admite el mecanismo de análisis y depuración del kernel:
    1. Consola de depuración configurable
    2. Volcado de memoria
    3. Análisis de subprocesos: nombre, tiempo de actividad, pila asignada / actual / usada
    4. Análisis de memoria: tabla del kernel, tamaño libre / asignado del grupo, fragmentación

Placa de desarrollo:

La plataforma de desarrollo utilizada en este entorno es STM32F407G-DISC1, que es la serie stm32f4-discovery, el control principal es el núcleo Cortex-M4F y se admite el depurador st-link integrado. Los recursos de la placa de desarrollo son los siguientes:

  • STM32F407VGT6 en paquete LQFP100
  • CPU ARM® Cortex® -M4 de 32 bits con FPU
  • Frecuencia máxima de CPU de 168 MHz
  • Flash de 1 MB
  • SRAM de 192 + 4 KB, incluidos 64 Kbytes de memoria acoplada de núcleo
  • GPIO con capacidad de interrupción externa
  • ADC de 3x12 bits con 24 canales
  • Convertidores D / A de 2x12 bits
  • USART / UART (6)
  • ......

STM32F4DISCOVERY Discovery tiene 6 UART. La configuración predeterminada es 115200 8N1. Cabe señalar que el puerto de comunicación virtual ST-Link no está conectado al puerto serie del chip. Para habilitar la salida de la consola, debe utilizar un cable de pines serie y conectarlo a la UART .

Instrucciones de grabación, STM32F4DISCOVERY Discovery tiene un depurador ST-LINK / V2 integrado, que puede funcionar con OPENOCD para realizar la grabación de metal desnudo.

Obtén el kernel:

 

 El kernel f9 está alojado en github de acuerdo con el acuerdo de código abierto BSD, el kernel no es grande y la descarga se puede completar con un simple comando git clone.

git clone https://github.com/f9micro/f9-kernel.git

Configure el kernel:

La dependencia del entorno de compilación del kernel f9 es la misma que la de linux, ambos son mconf.Si la PC ha construido un entorno de desarrollo linux antes, puede desarrollarlo directamente, de lo contrario, instale la dependencia de acuerdo con el estándar de desarrollo linux.

Ejecute make config para llamar a la interfaz de configuración menuconfig similar a linux:

La plataforma elige STM32F4 y se utiliza el puerto serie predeterminado (usart4), es decir, los pines PIN PA0 y PA1 integrados. La relación de mapeo entre el puerto serie y el pin es:

Compila el kernel:

Una vez completada la configuración, haga clic en Guardar configuración antes de salir del menú de configuración. Después de salir, ejecute el comando make directamente debajo de la consola para compilar el kernel:

Ejecute make clean para borrar los archivos intermedios de compilación y los resultados de la compilación

Si desea explorar los detalles de compilación de cada archivo, puede ejecutar make V = 1

De acuerdo con los detalles de salida de la figura anterior, se puede ver que los objetivos de salida incluyen f9.elf, f9.elf.bin y f9.bin, entre los cuales f9.bin y f9.elf.bin son exactamente iguales, y ambos corresponden al archivo binario f9.elf.

Grabar el kernel:

La placa de desarrollo admite el método de grabación de disco de simulación USB. Una vez iniciado el sistema, la plataforma simulará un disco en el lado de la PC. En este momento, el archivo de resultados de compilación f9.bin se puede copiar en el disco virtual. El disco en sí es virtual, y el proceso de copia es en realidad Durante el proceso de grabación, una vez finalizada la copia, reinicie para empezar a grabar el firmware. Además, el entorno occidental de Zephyr tiene una herramienta de grabación correspondiente, que también debería admitir la grabación del kernel f9. Puedes probarlo más tarde. Aquí, primero usa el primer método de grabación de disco:

Copie el kernel en el disco virtual para completar la grabación:

Conecte el cable serial USB2TTL a USART4 (PA0, PA1) y use minicom para observar la salida del kernel durante el inicio.

Utilice st-flash para grabar el kernel:

Incendio:

st-flash write f9.bin 0x8000000

Leer:

st-flash read firmware.bin 0x8000000 0x1000

Borrar:

st-flash erase


Grabación y depuración basada en el entorno zephyr:

Queremos usar el entorno zephyr para grabar y depurar el kernel f9, echemos un vistazo a cómo zephyr reproduce esta placa de desarrollo:

El primer paso: Instale el entorno de desarrollo zephyr de acuerdo con la documentación oficial de zephyr, incluida la instalación de west, cmake, sdk tools, las dependencias requirements.txt y la descarga del código.

Paso 2: Necesita instalar elftools, de lo contrario se informará un error al compilar el proyecto de la placa de desarrollo DISCO1. No sé por qué el archivo requirements.txt no muestra la instalación, ejecute pip3 install pyelftools.

Paso 3: compila:

Primero ejecute west build -t clean para borrar el último archivo de resultados de compilación

Luego ejecute west build -b stm32f4_disco samples / basic / blinky para compilar el proyecto blinky, como se muestra a continuación:

Paso 4: quema

La grabación de Zephyr no depende del mecanismo de disco virtual utilizado anteriormente, sino que se basa en ocd y stlink.

Conecte el puerto USB y ejecute west flash

 Georgia

Observe la información impresa y observe que el puerto serial usado por zephyr es diferente del kernel f9 Zephyr usa el puerto serial usart2, que es PA2 / PA3.

Paso 4: depurar

west build -b stm32f4_disco samples / hello_world

flash del oeste

Información del puerto serie, el firmware se ha grabado en:

Después de eso, ejecute west debug para depurar el programa helloworld


¡fin!

 

Supongo que te gusta

Origin blog.csdn.net/tugouxp/article/details/113819431
Recomendado
Clasificación