CMSIS vs HAL vs Standard Peripherals Library

23

Así que estoy cambiando de PIC a ARM y compré una placa de descubrimiento STM32F4. Hasta ahora, entiendo que para programarlo puede acceder a todos los registros directamente en la memoria (forma obvia) y también hay 3 bibliotecas principales que puede usar para hacer su vida más fácil. Ahora mi pregunta es: ¿cuál de esos 3 (CMSIS, HAL, Std Peripherals Lib) es el nivel más BAJO? es decir. el que tiene menos gastos generales. Mi objetivo es aprender el funcionamiento interno del controlador y no facilitar mi vida (solo un poco), por lo que me gustaría saber cuál de estos está más cerca del núcleo sin tener que recurrir al ensamblaje.

    
pregunta John

4 respuestas

23

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

Es exactamente lo que se necesita para acceder fácilmente a los registros del microcontrolador, a fin de implementar su propia HAL. No tiene gastos generales, ya que solo tiene acceso 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 en la portabilidad.

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

Por otro lado, CMSIS necesita mucho más trabajo por tu 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 entender cómo funciona el chip, que solo dedique tiempo a aprender solo una nueva biblioteca.

    
respondido por el user3634713
11

Para saber cómo funciona, no quieres usar ninguno de los anteriores. Obtener un compilador de la cruz del brazo y la documentación de st, hecho. Comience a codificar. Estos chips son generalmente muy fáciles de programar. la documentación le dice qué bits en qué registros hacen qué.

Cualquier / todas estas bibliotecas tienen la intención de 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 mucha gente quiere. Puede usar todas las fuentes de estas bibliotecas para ayudar a comprender, pero a medida que mejora, encontrará agujeros y problemas en las bibliotecas, a veces con un código muy aterrador. código mezclado, escrito genéricamente y portado de forma aproximada de un chip a otro, tal vez con características de soporte que su chip no tiene, etc. Y todos tienen una sobrecarga excesiva. 10 a 100 veces demasiado código para la tarea, seguro que gran parte de él se puede optimizar, pero ¿por qué tenerlo allí en primer lugar?

Ya sea que vaya por su cuenta o use una de estas bibliotecas, aún debe consultar la 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. . Cuando algo sale mal, es probable que tenga que escarbar tanto en sus cosas como en las suyas para averiguar por qué.

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

No entiendo por qué surge el ensamblaje en una discusión acerca de la programación completa. Se puede arreglárselas con muy poco montaje. Para estos chips Cortex-M, técnicamente solo necesitas esta cantidad de ASM para arrancar:

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

No puede confiar en data ni en bss y no puede regresar de main con un mínimo de asm. Pero ese es todo el asm que NECESITA para el más simple de metal desnudo. Ahora, si quiere hacer interrupciones, necesita más entradas en la tabla de vectores. Más líneas de palabras. Recomiendo más asm, pero quizás 10 o 20 líneas más.

esto suele ser todo el asm 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 bootstrap real para mi código m4. Prefiero que esto sea pulgar no pulgar2. Y solo reutilizo este código de una corteza a otra, cambiando la dirección del puntero de 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 el 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 asm. 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 simplemente 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 publicaremos aquí).

Definitivamente ST, pero también otros proveedores, para ahorrar energía, habilitar el reloj para las secciones del chip, así que antes de entrar e intentar parpadear un led, debe encontrar el bit de habilitación para ese bloque gpio y ver si sale del reinicio habilitado, si no, entonces habilítelo, hablar con esa lógica gpio sin un reloj habilitándolo simplemente bloquea el procesador mientras espera una respuesta de la lógica que nunca responderá. No siempre te hablan de estas habilitaciones. Una vez habilitados, a veces te guían por el inicio de algún periférico en particular. ST docs son bastante buenos. Al venir de un microchip que obtiene una nota bastante mala para la documentación, no debería tener un problema.

    
respondido por el old_timer
2

He utilizado ambos, solo el acceso de registro completo y la biblioteca de periféricos estándar. Me parece más fácil tratar con los registros. Además, si está utilizando un depurador, puede ver los registros y confirmar que contienen lo que usted programó. Creo que también aprendes más sobre el funcionamiento del chip de esa manera.

    
respondido por el Joe McCarron
2

Desde el mundo de 8 bits, siempre estaba acostumbrado a programar periféricos a través de registros. Las hojas de datos del microcontrolador (es decir, los manuales de referencia de STM32) describen los periféricos exclusivamente en notación de registro. Dado que el programador debe leer esta misma documentación para conocer las funciones y funciones periféricas antes de intentar usarla, entonces me parece natural comenzar a programar los registros. Con un diseño de código cuidadoso y comentarios, encuentro que el código puede leerse y modificarse de manera agradable incluso después de regresar meses después.

    
respondido por el Adam

Lea otras preguntas en las etiquetas

Comentarios Recientes

o es-ES nNEXPLORATOR Digital C-Studio hKEES UP Schindler Net: 99vH DIRECT vs sittech 1946 Puntos planos PERU Cadwallader CentiPed0 Ulmer Dodge DB X4 Trojan.26 CRAP X DualDeconstructor Alexishop rBAD MARINA TestBlaster eMule eFactory nMemory lArch mouse37 WT12 JOPOL SYSTEM SILenz XEU Sanctions JG Makers landtech O como | Tabla de contenidos sobre el diseño de software Una búsqueda de las publicaciones principales de Stream-COM-Matches.COM realizadas: el 20 de julio de 2000 Información registrada por-CampuD_te bagcatnet... Lees verder