Forum: Mikrocontroller und Digitale Elektronik Problem FreeRTOS vTaskDelay()


von Joachim W. (maddin319)


Lesenswert?

Hallo,

bin grad am FreeRTOS programmieren auf einem ATMEGA1284P mit einem 
Dragon.
Ich habe folgendes seltsame Problem.

hier erstmal der code:
1
static void led_toggle(void *x)
2
  {
3
  (void)x;  //ignore argument
4
5
    for(;;)
6
      {
7
      PORTB^=(1<<PB1);
8
      vTaskDelay(100);
9
10
      }
11
  }
12
13
static void led_toggle2(void *x)
14
  {
15
  (void)x;
16
  portTickType xLastWakeTime;
17
  const portTickType xFrequency =100;
18
  xLastWakeTime = xTaskGetTickCount();
19
  for(;;)
20
    {
21
    vTaskDelayUntil(&xLastWakeTime, xFrequency);
22
    PORTB^=(1<<PB2);
23
    }
24
  }    
25
26
27
28
    
29
int main( void )
30
{
31
  PORTB= 0xff; // LEDs off
32
  DDRB = 0xff; // for LEDs
33
  DDRA = 0xff;
34
35
36
  //Task Erzeugen 
37
  xTaskCreate(led_toggle,0,configMINIMAL_STACK_SIZE, (void*)0, tskIDLE_PRIORITY + 1,NULL);
38
  xTaskCreate(led_toggle2,0,configMINIMAL_STACK_SIZE, (void*)0, tskIDLE_PRIORITY +1,NULL);
39
40
  
41
  
42
  vTaskStartScheduler();
43
44
  return 0;
45
}


und zwar trägt man bei vTaskDelay ja normal die ms als übergabewert ein, 
wenn ich also ein 1 sec takt haben will 1000, doch in meinem Programm 
muss ich 100 eintragen damit ich den 1 sec takt habe auf meinem STK500 
board.

Kann mir wer sagen warum? Nebenbei 8MHz oszillator ist bei atmega 
eingetragen.

mfg

von Rolf Magnus (Gast)


Lesenswert?

Joachim Werner schrieb:
> und zwar trägt man bei vTaskDelay ja normal die ms als übergabewert
> ein,

Nein. Man gibt die Zahl an Scheduler-Ticks an.
Aus der Doku:

********************************************************************
 Delay a task for a given number of ticks. The actual time that the task 
remains blocked depends on the tick rate. The constant portTICK_RATE_MS 
can be used to calculate real time from the tick rate - with the 
resolution of one tick period.
********************************************************************

von Joachim W. (maddin319)


Lesenswert?

Rolf Magnus schrieb:
> Joachim Werner schrieb:
>> und zwar trägt man bei vTaskDelay ja normal die ms als übergabewert
>> ein,
>
> Nein. Man gibt die Zahl an Scheduler-Ticks an.
> Aus der Doku:
>
> ********************************************************************
>  Delay a task for a given number of ticks. The actual time that the task
> remains blocked depends on the tick rate. The constant portTICK_RATE_MS
> can be used to calculate real time from the tick rate - with the
> resolution of one tick period.
> ********************************************************************

ahhh danke dir!

hab jetzt in der FreeRTOSconfig.h

#define configTICK_RATE_HZ    ( ( portTickType ) 10000 )

10000 eingetragen statt 1000 , somit komm ich auf 0.1ms und jetzt trägt 
man quasi die ms beim vTaskDelay ein!

von Rolf Magnus (Gast)


Lesenswert?

Das verstehe ich jetzt nicht.
Vor allem: Hast du wirklich eine Tickrate von 10000? Das wäre ziemlich 
kurz, und ein erheblicher Teil der Rechenleistung geht dann nur für 
Taskwechsel drauf.

von Karl H. (kbuchegg)


Lesenswert?

Joachim Werner schrieb:

> #define configTICK_RATE_HZ    ( ( portTickType ) 10000 )
>
> 10000 eingetragen statt 1000 , somit komm ich auf 0.1ms und jetzt trägt
> man quasi die ms beim vTaskDelay ein!

das ergibt keinen Sinn.
Mit der ursprünglichen Tick Rate hättest du mit einem Delay Wert von 
1000 auf 1 Sekunde kommen müssen. Wenn das nicht so ist, dann hilft es 
nichts an den anderen Schrauben zu drehen. Denn mit dieser Konstanten 
und deinen 1000 müsste deine Verzögerungszeit jetzt 0.1 Sekunden sein, 
was sie aber nicht ist.

Ich tippe mal auf das übliche:
> Nebenbei 8MHz oszillator ist bei atmega eingetragen.

* Was heißt das? Hast du die Fuses entsprechend umgestellt?
* Weiß auch dein FreeRTOS von diesen 8Mhz?

Ein Faktor 8 ist nahe genug an 10 (1 Sekunde - 10 Sekunden), so dass man 
das mit freiem Auge nicht zweifelsfrei feststellen kann, wenn man nicht 
explizit darauf achtet.

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.