Callback Funktion in c.

Gast #5374293
Lesenswert?

Guten Morgen,
ich suche nach einer Grundlage der C Programmierung.
Versuche mich seit ein paar Wochen mit den STM32 zu beschäftigen.
Ich finde in der Doko der Hal Funktionen immer wieder Callbacks´s
Ich habe soweit verstanden das zB Interrupts nicht direkt aus der Hal 
verwendend werden dürfen. Und soweit ich verstanden habe soll man bzw 
muss man Callbacks verwenden. Stimmt das? Oder habe ich diesen Ansatz 
schon missverstanden?
Kann mir bitte jemand eine gute Deutsche Quelle nennen wo ich mich dazu 
einlesen kann? Oder kann mir anhand eines Beispiels jemand erklären wie 
ich diese Callbacks richtig nutze.
Möchte die Interrupts durch testen und richtig verstehen.
Bei den AVR war es ja Einfach.
Noch eine Frage die NVIC gibt für eine Peripherie global den Interrupt 
dieser frei Oder? Dann Muss man in der Interrupt Routine selbst erkennen 
was es für ein Interrupt war? Stimmt das so?
Danke für Eure Hilfe
Gast #5374304
Lesenswert?

Die HAL (wie der Name schon sagt) abstrahiert die Hardware-Ebene des 
Controllers und macht Programme, die darauf basieren (etwas) 
portierbarer innerhalb der Controller-Familie.

Die NVIC ist das gleiche wie beim AVR die Interrupt-Sprungtabelle.
Allerdings um ein paar Prioritätgeschichten erweitert.

Wird unter HAL ein Interrupt ausgelöst, wird der IRGHandler aufgerufen, 
der das Ereignis filtert.
Dieser ruft wiederum die passende Callback auf. Diese werden durch den 
Applikationsprogrammierer erstellt und verarbeiten die Informationen aus 
dem Handleraufruf weiter.

Die Interrupts werden durch die entsprechenden Enable-Flags freigegeben. 
Das wird entweder duch entsprechende Makro-Aufrufe oder den 
Funktionsaufruf ("..._IT(...)") erledigt.

Flussmittel schrieb:
> Kann mir bitte jemand eine gute Deutsche Quelle nennen wo ich mich dazu
> einlesen kann?

Lern Englisch!
Gast #5374309
Lesenswert?

Deine Frage hat nichts mit den C Grundlagen zu tun, sondern den 
spezifischen Anforderungen der HAL. Diese ist (soweit ich weiß) 
ausschließlich in englisch dokumentiert.

Wenn du µC Dokumentationen auf Deutsch suchst, dann solltest du zu den 
älteren AVR, PIC oder MCS51 wechseln. Da gibt es einiges auf Deutsch und 
keine HAL.

Als Mittelweg kann ich Dir empfehlen, STM32 ohne HAL zu programmieren. 
Um die englischen Datenblätter und Reference Manuals kommst du zwar 
nicht herum, aber immerhin brauchst du dann die Doku der HAL nicht zu 
auch noch zu lesen.
Gast #5374414
Lesenswert?

Peter D. schrieb:
> Einen Callback nimmt man, wenn ein Interrupt abhängig vom Kontext
> verschiedene Funktionen aufrufen soll.

Heißt das das der Callback mehrmals verwendet wird?

STK500-Besitzer schrieb:
> Wird unter HAL ein Interrupt ausgelöst, wird der IRGHandler aufgerufen,
> der das Ereignis filtert.
> Dieser ruft wiederum die passende Callback auf. Diese werden durch den
> Applikationsprogrammierer erstellt und verarbeiten die Informationen aus
> dem Handleraufruf weiter.
>
> Die Interrupts werden durch die entsprechenden Enable-Flags freigegeben.
> Das wird entweder duch entsprechende Makro-Aufrufe oder den
> Funktionsaufruf ("..._IT(...)") erledigt.
>
> Flussmittel schrieb:
>> Kann mir bitte jemand eine gute Deutsche Quelle nennen wo ich mich dazu
>> einlesen kann?
>
> Lern Englisch!

Wenn ich es richtig verstanden habe gebe ich in der NVIC den Interrupt 
Global frei und dann kann ich mit den Makros die verschiedenen 
Interrupts auswählen?
Wie genau setze ich den zB HAL_UART_TxCpltCallback?
In der Doku sehe ich zwar die verschiedenen Interrupt Quellen aber wie 
ich sie aktiviere habe ich nicht gefunden.
Mein Englisch ist leider für so komplexe Sachen zu schwach.

Danke für Eure Hilfe Zeit und Nerven
#5374656
Lesenswert?

Ich hab die HAL nun einige Zeit nicht mehr verwendet, aber soweit ich 
mich erinnern kann gibt es 2x Varianten wie man die Callbacks setzt.

1.) Der Callback ist bereits definiert, jedoch ein weak Symbol. Das ist 
zum Beispiel bei der UART (STM32F4 Library) der Fall:
1
 __weak void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)

Es reicht also, wenn du die entsprechende Funktion selbst (ohne __weak) 
definierst.


2.) Der Callback muss bei der Initialisierung im "Init-Struct" 
mitgegeben werden. Beispiel dafür hab ich aktuell keins, meine mich aber 
daran erinnern zu können dass manche Peripherien das so handhaben.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren