Nabend, ich habe mit FreeRTOS zwei Tasks in jeweils einer Datei erstellt. Jetzt soll TaskA (in DateiA) den TaskB (in DateiB) triggern. Wie wird sowas am besten umgesetzt? Eine Idee ist in DateiB eine Funktion zu erstellen welche von TaskA aufgerufen wird. In dieser Funktion wird xEventGroupSetBits aufgerufen, wodurch TaskB ausgeführt wird. Oder gibt es da andere möglichkeiten?
Die Dateistruktur hat zunächst einmal nichts mit der Taktstruktur von FreeRTOS zu tun. Und die Auswahl der geeigneten Kommunikationsmechanismen zwischen unterschiedlichen Tasks hängt natürlich davon ab, welche Art von Informationen zwischen den Task sowie von Interrupthandlern o.ä. an Tasks übertragen werden sollen. Event Groups sind möglicherweise für Deinen Zweck geeignet. Und ob eine Task ausgeführt wird oder nicht, hängt natürlich auch von vielen Dingen ab. Zunächst muss sie überhaupt gestartet worden sein. Und sie muss ggf. auf entsprechende Bits mittels xEventGroupWaitBits() warten (, sofern sie nicht eh schon ausführbereit ist). Und es dürfen natürlich keine höherprioren Task ausgeführt werden oder ausführbereit sein. Neben Event Groups gibt es bei FreeRTOS z.B. auch noch Task Notifications.
Oder wenn Daten übergeben werden sollen, auch noch Message Queues.
Eins N00B schrieb: > Oder wenn Daten übergeben werden sollen, auch noch Message Queues. Ja, das funktioniert gut. fileA:
1 | xQueueHandle sendQueue; |
2 | message_ts message_s; |
3 | |
4 | do{ |
5 | vTaskDelay(10); |
6 | sendQueue = getSendQueue(); |
7 | }while(sendQueue == NULL); |
8 | |
9 | |
10 | EventBits_t uxBits; |
11 | sensorEventGroup = xEventGroupCreate(); |
12 | |
13 | portBASE_TYPE xStatus; |
14 | |
15 | while(1) |
16 | {
|
17 | uxBits = xEventGroupWaitBits( |
18 | sensorEventGroup, |
19 | SENSOR_CHANGE_BIT, |
20 | pdTRUE, |
21 | pdFALSE, |
22 | portMAX_DELAY); |
23 | |
24 | message_s.id = 0x85; |
25 | message_s.x= 0x01; |
26 | message_s.y++; |
27 | xStatus = xQueueSend(sendQueue, &message_s, 0); |
28 | if(pdPASS != xStatus) |
29 | {
|
30 | ESP_LOGE(TAG, "failed xQueueSend: %d", xStatus); |
31 | }
|
32 | }
|
FileB:
1 | message_ts sendMessage_s; |
2 | message_ts receiveMessage_s; |
3 | |
4 | sendQueue = xQueueCreate(10, sizeof(message_ts)); |
5 | if(NULL == sendQueue) |
6 | {
|
7 | ESP_LOGE(TAG, "failed xQueueCreate"); |
8 | return; |
9 | }
|
10 | |
11 | portBASE_TYPE xStatus; |
12 | |
13 | while(1) |
14 | {
|
15 | |
16 | xStatus = xQueueReceive(sendQueue, &receiveMessage_s, portMAX_DELAY); |
17 | if(pdPASS != xStatus) |
18 | {
|
19 | ESP_LOGE(TAG, "failed xQueueReceive: %d", xStatus); |
20 | }
|
21 | else
|
22 | {
|
23 | sendMessage_s.id = receiveMessage_s.id; |
24 | sendMessage_s.x = receiveMessage_s.x; |
25 | sendMessage_s.y = receiveMessage_s.y; |
26 | ESP_LOGI(TAG, "received Message\t id: %d\tx: %d\ty: %d", sendMessage_s.id, sendMessage_s.x, sendMessage_s.y); |
27 | }
|
28 | }
|
29 | |
30 | xQueueHandle getSendQueue(void) |
31 | {
|
32 | return sendQueue; |
33 | }
|
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.