Forum: Compiler & IDEs STM32L433, Keil mdk und Mailversand beim RTX


von Rahul D. (rahul)


Lesenswert?

Moin,
ich habe hier (Verstandnis-) Problem:
Ich versuche auf einem STM32L433RCT Mails zwischen verschiedenen Threads 
auszutauschen, was nur bedingt funktioniert.
Da der STM32L433RCT nicht wirklich von Keil mdk unterstützt wird, habe 
ich die HAL-Treiberfunktionen für verschiedene Schnittstellen verwendet.
Das System funktioniert auf einem STM32F429 problemlos (der ist aber für 
die Endanwendung viel zu groß).

Ich kann zwischen verschiedenen Threads Mails verschicken.
Versuche ich aber aus einer HAL-Callback eine Mail zu verschicken, 
liefert "osMailAlloc" keinen freien Slotplatz (der sicher vorhanden 
ist).

Testweise habe ich das Senden und Empfangen direkt hintereinander in 
verschiedenen Threads/Funktionen eingebaut, um festzustellen, dass es 
ausser in den HAL-Callbacks funktioniert.
("osMailGet" liefert einen "osErrorParameter")

Woran liegt das? Und wie kann ich das beheben?

Die Funktionen:
1
osMailQDef(testQueue, 10, MailTest_t);
2
osMailQId MailTestQueue_Id = NULL;
3
4
5
int32_t startTestMailQueue(void){
6
  if (MailTestQueue_Id == NULL){
7
    MailTestQueue_Id = osMailCreate(osMailQ(testQueue), NULL);
8
  }
9
  return 0;
10
}
11
12
int32_t sendMail2TestQueue(MailTest_t data){
13
  MailTest_p outgoingMail = osMailAlloc(MailTestQueue_Id, osWaitForever);
14
  if (outgoingMail != NULL){
15
    memcpy(outgoingMail, &data, sizeof(MailTest_t));
16
    osMailPut(MailTestQueue_Id,outgoingMail); 
17
    return 0;
18
  }
19
  return -1;
20
}
21
22
int32_t fetchMailfromTestQueue(MailTest_t* data){
23
  osEvent evt = osMailGet(MailTestQueue_Id, 100);
24
  if (evt.status == osEventMail){
25
    MailTest_p receivedData = (MailTest_p) evt.value.p;
26
    memcpy(data, receivedData, sizeof(MailTest_t));
27
    osMailFree(MailTestQueue_Id, receivedData);
28
    return 0;
29
  }
30
  return -1;
31
}

Sie funktionieren - aber nicht aus der HAL-Callback.

Vielen Dank im Voraus,
Rahul

von ztr (Gast)


Lesenswert?

ist die HAL callback aus einer ISR ?

von Rahul D. (rahul)


Lesenswert?

ztr schrieb:
> ist die HAL callback aus einer ISR ?

Ja, das sollte aber laut Keil-Doku kein Problem sein.
Die beziehen sich aber vermutlich auf ihre eigenen ISR.
Dass es deswegen Probleme gibt, dachte ich auch schon. Ich wüsste aber 
nicht, wo ich suchen soll.

von Steffen R. (steffen_rose)


Lesenswert?

Rahul D. schrieb:
> osMailAlloc(MailTestQueue_Id, osWaitForever);

Lt. Doku:
The parameter millisec must be 0 for using this function in an ISR.

Ohne dass du den nicht funktionierenden Code postest ist es allerdings 
nur ein wildes rumgestocher.

von Rahul D. (rahul)


Lesenswert?

Danke, Lösung gefunden!

ztr schrieb:
> ist die HAL callback aus einer ISR ?

Da ein Mail-Versand aus der ISR nicht funktioniert, wird in der Callback 
nur ein Signal gesetzt, das einen Empfangsthread weckt.
Der muss sich dann um die Datenverarbeitung kümmern.

Manchmal sieht man's einfach nicht.

von Rahul D. (rahul)


Lesenswert?

Steffen R. schrieb:
> Lt. Doku:
> The parameter millisec must be 0 for using this function in an ISR.

oder so... DANKE!
Mein ADHS ist Mist!

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
Noch kein Account? Hier anmelden.