Forum: PC-Programmierung FreeRTOS TaskB von TaskA triggern und ausführen


von Jens (Gast)


Lesenswert?

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?

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

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.

von Eins N00B (Gast)


Lesenswert?

Oder wenn Daten übergeben werden sollen, auch noch Message Queues.

von Jens (Gast)


Lesenswert?

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