Saltar al contenido

CMSIS vs HAL vs Biblioteca de periféricos estándar

Investigamos por el mundo online y de este modo tener para ti la solución a tu dilema, si tienes dificultades déjanos tu comentario y te contestamos con gusto.

Solución:

Definitivamente el CMSIS. No es exactamente una biblioteca, en su mayoría contiene definiciones para los distintos registros.

Es exactamente lo que se necesita para acceder fácilmente a los registros del microcontrolador, a fin de implementar su propio HAL. No tiene gastos generales, ya que solo accede a los registros.

Tenga en cuenta que CMSIS, a diferencia de los otros dos, está definido por ARM y no por ST. Esto significa que las diversas bibliotecas CMSIS que existen para los distintos microcontroladores son bastante similares, lo que ayuda enormemente a la portabilidad.

Además, CMSIS es el más simple, por lo que es (IMO) el más versátil y confiable, con posiblemente menos (o ningún) errores. Algunas bibliotecas hal para las diversas mcu que he usado son bastante infames por sus errores.

Por otro lado, CMSIS necesita bastante más trabajo de su parte. Sin embargo, es mi elección personal, ya que prefiero invertir mi tiempo en crear bibliotecas de calidad, que se adapten a mis necesidades y comprender cómo funciona el chip, que simplemente dedicar tiempo a aprender otra biblioteca nueva.

Para saber cómo funciona, no debe utilizar ninguno de los anteriores. Obtenga un compilador de arm cross y la documentación de st, listo. Empiece a codificar. estos chips son generalmente muy fáciles de programar. la documentación le dice qué bits en qué registros hacen qué.

Cualquiera / todas estas bibliotecas están destinadas a eliminar esa comprensión / carga / trabajo de usted y hacer que se sienta como una experiencia de programación de aplicaciones similar a una API. Que es lo que quiere mucha gente. Puede usar todo el código fuente de estas bibliotecas para ayudar a comprender, pero a medida que mejora, encontrará agujeros y problemas en las bibliotecas, a veces código muy aterrador. código mezclado, escrito genéricamente y transferido de un chip a otro, quizás funciones de soporte que su chip no tiene, etc. Y todos tienen una sobrecarga excesiva. De 10 a 100 veces más código para la tarea, seguro que una gran cantidad puede optimizarse, pero ¿por qué tenerlo allí en primer lugar?

Ya sea que elija la suya propia o use una de estas bibliotecas, debe buscar el código fuente de las bibliotecas que usa para ver si se siente cómodo con lo que están haciendo, si tiene sentido, coincide con la documentación del chip, etc. sale mal, es probable que tengas que investigar tanto sus cosas como las tuyas para averiguar por qué.

Tenga en cuenta que los documentos con chips tampoco son perfectos, eso es parte de la diversión.

No entiendo por qué surge el ensamblaje en una discusión sobre programación bare metal. Puede arreglárselas con muy poco montaje. Para estos chips cortex-m, técnicamente solo necesita esta cantidad de asm para arrancar:

.globl _start
_start:
.word 0x20001000
.word main

No puede confiar en los datos ni en bss y no puede regresar de main con ese mínimo de asm. Pero eso es todo lo que NECESITAS para lo más básico del metal desnudo. Ahora, si desea hacer interrupciones, necesita más entradas en la tabla de vectores. más líneas de .word. Recomiendo más asm, pero quizás 10 o 20 líneas más.

este es normalmente todo el conjunto que uso.

.cpu cortex-m0
.thumb
.thumb_func
.global _start
_start:
stacktop: .word 0x20001000
.word reset
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.thumb_func
reset:
    bl notmain
    b hang
.thumb_func
hang:   b .
.align
.thumb_func
.globl PUT16
PUT16:
    strh r1,[r0]
    bx lr
.thumb_func
.globl PUT32
PUT32:
    str r1,[r0]
    bx lr
.thumb_func
.globl GET32
GET32:
    ldr r0,[r0]
    bx lr
.thumb_func
.globl GET16
GET16:
    ldrh r0,[r0]
    bx lr
.thumb_func
.globl dummy
dummy:
    bx lr
.end

Sí, dice cortex-m0, pero este es un arranque real para mi código m4. Prefiero que sea el pulgar, no el pulgar2. Y simplemente reutilizo este código de un cortex-m a otro, cambiando la dirección del puntero de la pila según sea necesario, por lo que funciona para m0, m3 y m4. Todavía no tengo un m7 ni lo he investigado mucho.

Habilitar la fpu puede requerir algunas líneas más de asm ya que se necesitan instrucciones específicas. Pero el punto es no confundir la programación de bajo nivel y el ensamblaje. C tiene lo que necesita para configurar el chip, así como para escribir una aplicación. Las bibliotecas de las que está hablando están escritas en C, no en asm, por lo que obviamente tampoco necesitan usar asm.

Si desea aprender el funcionamiento interno, escriba su propio código. No utilice estas bibliotecas más que como referencia. A veces es más fácil piratearlo que intentar leer su código. (no solo ST sino todos los proveedores. Uno de los proveedores tenía una línea de código tan alarmante que la uso como una pregunta de entrevista, no, no la voy a publicar aquí).

ST definitivamente, pero otros proveedores también, para ahorrar energía, tienen habilitaciones de reloj para secciones del chip, por lo que antes de entrar e intentar hacer parpadear un led, debe encontrar el bit de habilitación para ese bloque gpio y ver si sale. de reinicio habilitado, si no, habilítelo, hablando con esa lógica gpio sin un reloj que lo habilite, simplemente cuelga el procesador mientras espera una respuesta de la lógica que nunca responderá. No siempre le informan sobre estas habilitaciones. Una vez habilitado, a veces lo guían a través del inicio de algún periférico en particular. Los documentos ST son bastante buenos. Viniendo de un microchip que obtiene una calificación bastante mala para la documentación, no debería tener ningún problema.

Hasta ahora he usado definiciones CMSIS y disfruté usando registros directamente. Mientras tanto, usé bibliotecas HAL en algunos proyectos. Tuvo una influencia considerable en el tiempo de ejecución del código, así que lo dejé. Aunque CMSIS me interesa, en estos días voy a ser fanático de libopencm3. Es como LL bibliotecas proporcionadas por ST. Sin embargo, cubre más microcontroladores incluso en familias ST:

El proyecto libopencm3 (anteriormente conocido como libopenstm32) tiene como objetivo crear una biblioteca de firmware libre / libre / de código abierto para varios microcontroladores ARM Cortex-M3, incluidos ST STM32, Toshiba TX03, Atmel SAM3U, NXP LPC1000 y otros.

tenga en cuenta que:

A pesar del nombre, libopencm3 también es compatible con otros microcontroladores “relacionados” con ARM Cortex, como los de Cortex-M0 o Cortex-M4 / Cortex-M4F, por ejemplo.

puede encontrar la lista de microcontroladores compatibles aquí.

Finalizando este artículo puedes encontrar las aclaraciones de otros administradores, tú además tienes la libertad de insertar el tuyo si te apetece.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *