Forum: Compiler & IDEs FreeRTOS & C++


von Sebastian H. (sh______)


Lesenswert?

Hallo,

ich versuche aktuell FreeRTOS unter der Verwendung von C++ auf einem 
CortexM3 ans laufen zu bekommen.

Es funktioniert soweit auch. Die Erzeugung eines neuen Tasks mache ich 
nach der Anleitung:
http://interactive.freertos.org/entries/223648-using-freertos-with-c

Der Task wird korrekt gestartet und läuft auch wie gewünscht. Allerdings 
habe ich dabei ein Problem mit dem this-Pointer. Innerhalb meiner 
Methode für den Task (TestTask::Run) sind im Constructor definierten 
Werte (this->xtest) nicht mehr vorhanden. Sprich, die Variablen "in" 
this an sich sind noch vorhanden/gültig allerdings wurden die Werte mit 
sinnlosem Inhalt überschrieben.

Da ich nur wenig Erfahrung mit C++ habe weiß ich leider nicht woran es 
liegen könnte. Ich hoffe ihr könnt mir weiter helfen.

Hier noch etwas Code. Die Klasse und die Variablen sind im 
entsprechenden Headerfile korrekt definiert.
1
TestTask::TestTask(void) {  
2
  strcpy(this->test,"blub\0");
3
  this->xtest = 42;
4
    debug_printf("Test1[%d]\n", this->xtest);
5
}
6
7
portBASE_TYPE TestTask::StartTask(void) {
8
  xTaskCreate(
9
    &TestTask_Wrapper,        //pvTaskCode -> Pointer to the task entry function.
10
    (signed char *)"TestTask",    //pcName -> A descriptive name for the task.
11
    configMINIMAL_STACK_SIZE,    //usStackDepth -> The size of the task stack.
12
    this,              //pvParameters -> Pointer that will be used as the parameter for the task being created.
13
    mainTEST_TASK_PRIORITY,      //uxPriority -> The priority at which the task should run. 
14
    &this->TaskHandle        //pvCreatedTask -> Used to pass back a handle by which the created task can be referenced.
15
  );
16
}
17
18
void TestTask::Run(void) {
19
20
    portTickType xLastWakeTime;
21
  xLastWakeTime = xTaskGetTickCount();
22
23
  for(;;) {    
24
        debug_printf("TestTask[%d]\n", this->xtest);
25
26
    //Delay für 1000ms
27
    vTaskDelayUntil(&xLastWakeTime, ( 1000 / portTICK_RATE_MS ) );
28
  }
29
}

Starten tu ich den Task aus main() wie folgt:
1
  TestTask xtest;
2
  xtest.StartTask();

von Klaus W. (mfgkw)


Lesenswert?

Die als Task gestartete Funktion ist keine normale Methode, gehört also 
nicht zu einem Objekt und dementsprechend zweckfrei ist es, darin this 
zu verwenden - daher die Forderung, die Methode static zu machen bzw. 
eine globale Funktion zu verwenden, was technisch gleichwertig ist.
Dementsprechend der Umweg, der (globalen oder statischen) 
Wrapperfunktion den Zeiger auf das gewünschte Objekt als Parameter zu 
übergeben. Die müsste dann den Parameter passend casten und darüber die 
nichtstatische Methode aufrufen, die wiederum dann ein gültiges this 
hat.

Steht soweit alles in deinem Link.

Ob du das machst, kann ich anhand der gezeigten Teile nicht so recht 
nachvollziehen.

(Nachzuvollziehen ist das erst, wenn dir klar ist, was statische und 
nichtstatische Methoden machen.)

Sebastian H. schrieb:
> Sprich, die Variablen "in"
> this an sich sind noch vorhanden/gültig allerdings wurden die Werte mit
> sinnlosem Inhalt überschrieben.

ich würde eher darauf tippen, daß this falsch ist - du findest die 
gültigen Daten einfach nicht und landest an der falschen Stelle im 
Speicher.

von Rolf M. (rmagnus)


Lesenswert?

Klaus Wachtler schrieb:
> Ob du das machst, kann ich anhand der gezeigten Teile nicht so recht
> nachvollziehen.

Es ist aber zu vermuten. Immerhin wird ja nicht TestTask::Run selbst, 
sondern eine im obigen Code leider verheimlichte Funktion namens 
TestTask_Wrapper als Task-Funktion an FreeRTOS übergeben.

> Sebastian H. schrieb:
>> Sprich, die Variablen "in"
>> this an sich sind noch vorhanden/gültig allerdings wurden die Werte mit
>> sinnlosem Inhalt überschrieben.
>
> ich würde eher darauf tippen, daß this falsch ist - du findest die
> gültigen Daten einfach nicht und landest an der falschen Stelle im
> Speicher.

Da würde die Implementation von TestTask_Wrapper vielleicht helfen.

von Sebastian H. (sh______)


Lesenswert?

Ok, danke euch beiden!
Den Satz hab ich irgendwie überlesen. Werde dann mal sehn wie ich es 
dann für mich am angenehmsten umsetze.

Gruß

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.