CMSIS vs HAL vs Standard Peripherals Library

29

Also wechsele ich von PICs zu ARM und kaufe ein STM32F4 Discovery Board. Soweit ich weiß, können Sie zum Programmieren entweder direkt auf alle Register im Speicher zugreifen (auf offensichtliche Weise), und es gibt drei Hauptbibliotheken, mit denen Sie Ihr Leben einfacher gestalten können. Nun ist meine Frage, welche dieser 3 (CMSIS, HAL, Std Peripherals Lib) die niedrigste Stufe ist? dh der mit dem geringeren Overhead. Mein Ziel ist es, das Innenleben des Controllers zu erlernen und mein Leben nicht (nur ein wenig) zu vereinfachen. Daher möchte ich gerne wissen, welches davon näher am Kern liegt, ohne die Montage zu verwenden.

John
quelle
10
[Die STM32-Seite von] CMSIS besteht im Wesentlichen nur aus Registerdefinitionen und keinem Code. CMSIS == direkter Registerzugriff. AFAIK ST bietet keinen separaten Download nur für CMSIS. Wenn Sie jedoch StdPeriph Lib oder STM32Cube herunterladen, können Sie nur den CMSIS-Teil verwenden. Die STM32-Registerdefinitionen befinden sich entweder in Libraries/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.hoder in Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h.
Aleksi Torhamo

Antworten:

27

Auf jeden Fall das CMSIS. Es ist nicht gerade eine Bibliothek, es enthält meist Definitionen für die verschiedenen Register.

Es ist genau das, was man braucht, um einfach auf die Register des Mikrocontrollers zuzugreifen, um seine / ihre eigene HAL zu implementieren. Es hat keinen Overhead, da Sie nur auf die Register zugreifen.

Beachten Sie, dass CMSIS im Gegensatz zu den beiden anderen von ARM und nicht von ST definiert wird. Dies bedeutet, dass die verschiedenen CMSIS-Bibliotheken für die verschiedenen Mikrocontroller sehr ähnlich sind, was die Portabilität erheblich verbessert.

Darüber hinaus ist CMSIS das einfachere und damit das vielseitigste und zuverlässigste (IMO) mit möglicherweise weniger (oder gar keinen) Fehlern. Einige hal-Bibliotheken für die verschiedenen MCUs, die ich verwendet habe, sind ziemlich berüchtigt für ihre Fehler.

Auf der anderen Seite benötigt CMSIS viel mehr Arbeit von Ihnen. Es ist jedoch meine persönliche Entscheidung, da ich es vorziehen würde, meine Zeit in die Erstellung hochwertiger Bibliotheken zu investieren, die meinen Bedürfnissen entsprechen und zu verstehen, wie der Chip funktioniert, und nur Zeit zu investieren, um nur eine neue Bibliothek zu lernen.

Fotis Panagiotopoulos
quelle
Ich bin nicht sicher, ob ST die CMSIS-Bibliothek noch unterstützt
Scott Seidman
1
Na ja ... so etwas. Es gibt keine direkte Verbindung, sie raten davon ab (es scheint, als wollten sie Benutzer so weit wie möglich an ihren Code binden und sie davon abhalten, für eine andere Marke zu gehen), aber es wird in ihren anderen Bibliotheken verwendet. Sie können es von dort extrahieren. Es ist recht einfach, enthält nicht viel Code und scheint ausgereift zu sein. Sieht so aus, als wäre es sicher für die Produktion, egal ob sie es als unterstützt vermarkten oder nicht.
Fotis Panagiotopoulos
Ja, es ist ein Mist, dass sie aufgehört haben, sich in diese Richtung zu entwickeln. Die Einhaltung von CMSIS war einer der Gründe, warum ich mich für ST entschieden habe. Ich benutze es immer noch, aber ich habe das Gefühl, dass der Tag kommen wird, an dem es nicht bequem ist.
Scott Seidman
3
@ ScottSeidman, ich denke, Sie haben CMSIS mit StdPeriph verwechselt. CMSIS wird gut unterstützt und auf unbestimmte Zeit unterstützt. Sein StdPeriph ist im Grunde genommen veraltet, aber CMSIS ist noch so lebendig wie vor 10 Jahren.
ScienceSamovar
14

Um zu lernen, wie es funktioniert, möchten Sie keines der oben genannten verwenden. Holen Sie sich einen Arm Cross Compiler und die Dokumentation von st, fertig. Starten Sie die Codierung. Diese Chips sind in der Regel sehr einfach zu programmieren. In der Dokumentation erfahren Sie, welche Bits in welchen Registern was bewirken.

Alle diese Bibliotheken sollen Ihnen das Verständnis / die Last / die Arbeit nehmen und das Gefühl vermitteln, eine API-ähnliche Anwendungsprogrammiererfahrung zu haben. Welches ist, was viele Leute wollen. Sie können den gesamten Quellcode für diese Bibliotheken verwenden, um das Verständnis zu verbessern. Wenn Sie jedoch besser werden, finden Sie Lücken und Probleme in den Bibliotheken, manchmal sehr beängstigenden Code. Code wurde zusammen geworfen, generisch geschrieben und grob von einem Chip auf einen anderen portiert. Möglicherweise werden Funktionen unterstützt, die Ihr Chip nicht hat usw. Und alle haben einen übermäßigen Overhead. 10- bis 100-mal zu viel Code für die Aufgabe, sicher, dass viel davon wegoptimiert wird, aber warum ist er überhaupt da?

Unabhängig davon, ob Sie eine eigene oder eine dieser Bibliotheken verwenden, sollten Sie sich die Quelle der von Ihnen verwendeten Bibliotheken ansehen, um festzustellen, ob Sie mit ihren Funktionen vertraut sind, ob sie sinnvoll sind, mit der Dokumentation des Chips übereinstimmen usw. Wenn etwas schief geht, müssen Sie wahrscheinlich so viel durch ihre Sachen wie Ihre graben, um herauszufinden, warum.

Beachten Sie, dass die Chip-Dokumente auch nicht perfekt sind, das ist ein Teil des Spaßes.

Ich verstehe nicht, warum Baugruppen in einer Diskussion über Bare-Metal-Programmierung auftauchen. Sie kommen mit sehr wenig Montage aus. Für diese Cortex-M-Chips benötigen Sie technisch gesehen nur so viel Asm, um gebootet zu werden:

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

Sie können sich weder auf Daten noch auf BSS verlassen, und Sie können nicht mit einem Minimum an Asm von Main zurückkehren. Aber das ist alles, was Sie für die Barest of Bare Metal brauchen. Wenn Sie nun Interrupts ausführen möchten, benötigen Sie weitere Einträge in der Vektortabelle. mehr .word Zeilen. Ich empfehle mehr asm, aber vielleicht 10 oder 20 Zeilen mehr.

Das ist normalerweise alles, was ich benutze.

.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

Ja, es heißt Cortex-m0, aber dies ist der eigentliche Bootstrap für meinen M4-Code. Ich bevorzuge es, daumen nicht daumen2 zu sein. Und ich verwende diesen Code einfach von einem Kortex-m zum anderen und ändere die Stapelzeigeradresse nach Bedarf, sodass er für m0, m3 und m4 funktioniert. Ich habe noch kein m7 und habe auch nicht viel recherchiert.

Für die Aktivierung der fpu sind möglicherweise einige Zeilen mehr erforderlich, da spezielle Anweisungen erforderlich sind. Aber der Punkt ist nicht zu verwechseln Low-Level-Programmierung und asm. C hat alles, was Sie brauchen, um den Chip zu konfigurieren und eine Anwendung zu schreiben. Die Bibliotheken, von denen Sie sprechen, sind in C und nicht in asm geschrieben, daher müssen sie offensichtlich auch nicht asm verwenden.

Wenn Sie das Innenleben lernen möchten, schreiben Sie Ihren eigenen Code. Verwenden Sie diese Bibliotheken nur als Referenz. Manchmal ist es einfacher, es einfach zu hacken, als zu versuchen, ihren Code zu lesen. (Nicht nur ST, sondern alle Anbieter. Einer der Anbieter hatte eine Codezeile, die so alarmierend ist, dass ich sie als Interviewfrage verwende, dass ich sie hier nicht veröffentlichen werde.)

Um Strom zu sparen, haben aber definitiv auch andere Hersteller Taktfreigaben für Teile des Chips. Bevor Sie also hineingehen und versuchen, eine LED zu blinken, müssen Sie das Freigabebit für diesen GPIO-Block finden und sehen, ob es herauskommt of reset enabled, wenn nicht, aktivieren Sie es. Wenn Sie mit dieser gpio-Logik sprechen, ohne dass eine Uhr aktiviert ist, hängt sie den Prozessor einfach auf, während er auf eine Antwort von der Logik wartet, die niemals antwortet. Sie erzählen nicht immer von diesen Möglichkeiten. Einmal aktiviert, werden Sie manchmal durch das Init für ein bestimmtes Peripheriegerät geführt. ST-Dokumente sind ziemlich gut. Wenn Sie von einem Mikrochip kommen, der eine ziemlich schlechte Bewertung für die Dokumentation erhält, sollten Sie kein Problem haben.

Oldtimer
quelle
2
Das OP hat nicht nach dem Startverfahren oder ähnlichem gefragt. Welche Bibliothek ist für ihn am besten geeignet?
Fotis Panagiotopoulos
asm wurde erwähnt und damit die Kommentare zu asm
old_timer
2
Das CMSIS enthält bis auf ein Minimum keinen Code. Es enthält keinen Startcode, keine Linker-Skripte oder ähnliches. Es enthält nur Definitionen für die Register. Warum sollte man kryptischen Code schreiben oder das Rad neu erfinden, anstatt einen schönen Namen zu verwenden, um direkt auf die Register zuzugreifen?
Fotis Panagiotopoulos
2
@John You can easily start an ARM microcontroller with absolutelly no ASM, equally efficiently. If interested ask a new question, and comment a link here to show you some examples.
Fotis Panagiotopoulos
1
@user3634713 I'm actually very interested. Thanks electronics.stackexchange.com/questions/224618/…
John
2

I have used both, just bare metal register access and the std peripheral library. I find it easier just to deal with the registers. Also if you are using a debugger you can view the registers and confirm they contain what you programmed them to be. I think you do learn more about the operation of the chip in that way also.

Joe McCarron
quelle
2

Comming from the 8bit world I was always used to programming peripherals via registers. Microcontroller data sheets (i.e STM32 reference manuals) describe the peripherals exclusively in register notation. Since the programmer must read this very same documentation to know about the peripheral funtions and features before any attempt is made to use it then it seems natural to me to start programming the registers. With carful code layout and commenting I find the code can be pleasantly to read and modify even after coming back to it months later.

Adam
quelle
2

Until now I have used CMSIS definitions and enjoyed using registers directly. Meanwhile, I used HAL libraries in few projects. It had a considerable influence on code running time so I quit it. Although CMSIS serves my interest, these days I am going to be a fan of libopencm3. It is like LL libraries provided by ST. However, it covers more micro-controllers even in ST families:

The libopencm3 project (previously known as libopenstm32) aims to create a free/libre/open-source firmware library for various ARM Cortex-M3 microcontrollers, including ST STM32, Toshiba TX03, Atmel SAM3U, NXP LPC1000 and others.

please note that:

Despite the name, libopencm3 also supports other ARM Cortex "related" microcontrollers such as Cortex-M0 or Cortex-M4/Cortex-M4F ones, for example.

you can find the list of supported micro-controllers here.

Pana
quelle
The actual problem is that ST has the wrong idea of what a HAL is supposed to do. A proper HAL will have a function like adc_get_result() which wraps in the complete ADC peripheral driver including real-time aspects, interrupts etc. The ST one seems to rather be write_to_scary_register which is basically just a bloated wrapper around the register access. In all fairness, ST isn't the only vendor to provide such excess bloat, Atmel ASF and others are equally bad.
Lundin