Hallo zusammen. Ich bin gerade dabei einige Treiberfunktionen zu implementieren und habe ein problem in sachen Error Handling in Verbindung mit stm cube. Anhand des I2C-Interface will ich das kurz erläutern. Vorab. die Kommuikation funktioniert schon. Ich verwende auf der untersten ebene die Interruptgesteuerten Funktionen der HAL von STM. HAL_StatusTypeDef HAL_I2C_Master_Transmit_IT(I2C_HandleTypeDef * hi2c, uint16_t DevAddress, uint8_t * pData, uint16_t Size) Ich verwende FreeRTOS und sperre die Ressource während einer Kommunikation mit einer binären Semaphore. In der End of Communication Callback gebe ich das Interface wieder frei. Wie gesagt alles funktioniert... Ich wollte jetzt mal die ErrorCallback untersuchen und habe mal während des Betriebs den I2C Bus unterbrochen. Zu meinem erstaunen wurde die Errorcallback nicht aufgerufen sondern immer die End of Communication. Lese ich dort den Status aus, steht der richtigerweise auf BUSERROR. Ich hätte hier erwartet, dass die ErrorCallback aufgerufen wird...(Ich untersuche das nochmal) Nun zum Kern meiner Frage. Wenn ich Interruptgetriebene Kommunikationsmodelle verwende und eine Kommunikation geht schief, dann muss ich irgendwie sicherstellen, dass ein erneuter Sendeversuch unternommen wird oder unter umständen das Interface Resetiert wird. Wie kann ich das in Verbindung mit einem RTOS sicher und sauber gewährleisten? Das Problem ist ja, dass ich im Applikationscode weiterarbeite und da ich momentan nur die Ressource schütze. Ein Ansatz wäre, zusätzlich zur Ressourcenkontrolle per Semaphor ein Event in der ISR zu setzen, auf welches ich dann im Sendetask gezielt reagieren kann. Ich befürchte aber, dass ich alles zu kompliziert mache.. Was ich auf keinen Fall möchte ist das Interface pollen.... Hat jemand anregungen für mich?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.