ich versuche seit ein paar Tagen die Blibliotheken an den richtigen Stellen zu packen, sodass ich einige Programme fehlerfrei kompilieren kann. Als erstes habe ich mir gedacht starte ich damit den Systemtakt einzustellen um das dann mit dem SysTick durch toggeln einer LED abzuprüfen z. B. ~ 1s
Zum Erstellen der C-Programme nutze ich die STM32CubeIDE + CMSIS Bibliothek
Ausgeführt werden die Programme auf einem NUCLEO-64 Board mit einem STM32F411RE.
Ich habe einmal ein Screenshot von der jetzigen Projektstruktur gemacht.
In diesem Fall spuckt der Compiler "undefined reference to `RCC_AHB1PeriphClockCmd'" aus.
Das RCC_AHB1PeriphClockCmd ist in der stm32f4xx_rcc.h definiert und auch bereits in der main.c inkludiert. So richtig hab ich nicht verstanden, was ich falsch mache.
Das bedeutet, dein Linker kennt diese Funktion nicht. Das bedeutet, sie wurde nicht übersetzt. Das bedeutet vermutlich, dass die entsprechende Sourcedatei in einem Verzeichnis liegt, welches nicht übersetzt wird, selbst wenn die Textsuche die Funktion finden kann.
Schonmal im zweiten Screenshot den Reiter Source Location überprüft?
Das bedeutet, dein Linker kennt diese Funktion nicht. Das
bedeutet, sie
wurde nicht übersetzt. Das bedeutet vermutlich, dass die entsprechende
Sourcedatei in einem Verzeichnis liegt, welches nicht übersetzt wird,
selbst wenn die Textsuche die Funktion finden kann.
Nur warum?
Schonmal im zweiten Screenshot den Reiter Source Location überprüft?
Hast du in der Datei stm32f4xx.h die Zeile für dein Target
aktiviert?
Anbei mal ein Beispiel für den STM32F407.
Ja habe ich. Habs mal spaßeshalber wieder auskommentiert, dann kommt folgende Fehlermeldung: #error "Please select first the target STM32F4xx device used in your application (in stm32f4xx.h file)"
Die RCC_AHB1PeriphClockCmd ist Teil der LowLevel-Library. Wie hast
du
die eingebunden?
LowLevel, ist damit die stm32f4xx_rcc.h, stm32f4xx_gpio.h etc. gemeint oder welche Dateien sind das? Wenn es das erste ist, befinden die sich im Ordner Inc (siehe Bild)
LowLevel, ist damit die stm32f4xx_rcc.h, stm32f4xx_gpio.h etc. gemeint
Ich hab mich vertan: Diese beiden Files sind ein Teil der veralteten Standard Peripheral Library (SPL), aber es fehlen die dazugehörigen Source-Files.
Der Nachfolger der SPL ist die "LowLevel" (LL) -Library mit ähnlichen Konzepten aber nicht identisch. Die LowLevel Library befindet sich neben der HAL im STM32CubeF4-Paket ("stm32f4xx_ll_rcc.c" usw.).
Es empfiehlt sich die veraltete SPL nicht mehr zu nutzen sondern wenn schon die modernere LowLevel-Variante. Die ist zwar recht kompakt und effizient aber eben auch nicht besonders komfortabel.
Nehm's mir nicht übel, aber ich glaube bei deinem Wissensstand ist es einfacher, die HAL zu benutzen. Die IDE erzeugt mit der HAL automatisch direkt lauffähige Projekte, du kannst Code dafür generieren und die APIs sind recht abstrakt.
Es gibt recht wenig Grund noch die LL oder gar SPL zu nutzen außer man muss penibel an Speicher und Takten sparen.
Das sind keine Libraries, sondern "include"- oder auch "Header"-Dateien.
War mal so. Die Bedeutung des Begriffes hat sich inzwischen verändert.
Der Begriff gilt auch für Sammlungen von Quelltexten.
Nur bei den Ardui****
Verdammt, beinahe hätte ich mch verquatscht. Also anders: bei allen, die wirklich wissen, was sie tun, gab es keine derartige Bedeutungsverschiebung des Begriffs...
Also anders: bei allen, die
wirklich wissen, was sie tun, gab es keine derartige
Bedeutungsverschiebung des Begriffs...
Wie nennst du das Paket STM32CubeHAL oder CMSIS? Da ist keine *.lib oder *.a Datei drin.
Wie nennst du eine oder mehrere Header-Dateien welche Definitionen und Inline-Funktionen enthalten, welche für sich kein ausführbares Programm ergeben, aber als Komponente in viele verschiedene Programme eingebunden werden kann?
Wie nennst du eine oder mehrere Header-Dateien welche Definitionen und
Inline-Funktionen enthalten, welche für sich kein ausführbares Programm
ergeben, aber als Komponente in viele verschiedene Programme eingebunden
werden kann?
Header-Dateien - was denn sonst?
Inline-Funktionen gehören nicht in einen Header.
Ein Library enthällt min. auch Source-Files (.C(PP))
.a oder .lib sind nicht unbedingt ein Muß.
Note: It’s imperative that the function’s definition (the part between the {...}) be placed in a header file, unless the function is used only in a single .cpp file. In particular, if you put the inline function’s definition into a .cpp file and you call it from some other .cpp file, you’ll get an “unresolved external” error from the linker.
So, ich habs getestet:
Die inline-Funktion in der main.c geschrieben, in einer Header-Datei als extern definiert und in einer weiteren .c-Datei verwendet - funktioniert.
Die inline-Funktion in der main.c geschrieben, in einer Header-Datei als
extern definiert und in einer weiteren .c-Datei verwendet -
Welcher Compiler?
Bei MinGW32 (GCC v11) funktioniert es auch mit "extern" nicht, weder C noch C++. inline-Funktionen müssen, genau wie der Name es sagt, "inline" (typischerweise im Header) definiert werden, vor jeder Nutzung. Genau so steht es auch seit eh und je in allen C & C++ Büchern & Tutorials.
Die C++ -Community nennt so etwas schon lange "Header-Only Library". Wie würdest du es nennen? Einfach nur "Headersammlung" ist zu ungenau und klobig. Man möchte betonen, dass diese Sammlung als wiederverwendbarer Teil in Anwendungen eingebunden werden kann.