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