freeRTOS - problema temporizzazione blink

Allora, butta quel codice :smiley:

  1. Per evitare problemi, su Arduino usa sempre l'allocazione statica delle risorse e non quella dinamica

  2. l'inizializzazione del HW si fa nel setup(), NON nei task

  3. ricorda sempre che stai su Arduino e NON su un PIC32 (dove il "tick" è 1 msec) ... su Arduino il "tick" del sistema operativo, per ragioni di compatibilità con le librerie che usano i timers, è fatto con il WatchDog ed il "tick" minimo è di 15 msec.
    Task che terminano prima dello scadere del tick ritornano correttamente il controllo al SO, ma operazioni che coinvolgono i ticks vanno fatte tenendone conto.

  4. Per quanto detto sopra, i periodi calcolati sui tick devono ovviamente essere multipli del tick o ... verranno arrotondati. Per cui, vTaskDelay(20 / portTICK_PERIOD_MS); ti darà, in reltà, il ritardo di circa 1 tick, difatti 20/16 = 1.25 (operazioni con interi arrotondata) e quindi di circa 15 msec.

Detto questo, il tuo codice riscritto correttamete diventa:

#include <Arduino_FreeRTOS.h>
#include <task.h>

#define  RITARDO  2000

StackType_t   uxStackBuffer_T1[192];
StaticTask_t  xTaskBuffer_T1;

void MyTask1(void * pvParameters) {
   for (;;) {
      digitalWrite(LED_BUILTIN, HIGH);    // LED acceso
      vTaskDelay(20 / portTICK_PERIOD_MS);
      digitalWrite(LED_BUILTIN, LOW);     // LED spento
      vTaskDelay(RITARDO / portTICK_PERIOD_MS);
   }
}

void setup() {
   pinMode(LED_BUILTIN, OUTPUT);
   digitalWrite(LED_BUILTIN, LOW);
   //
   xTaskCreateStatic(MyTask1, "Task1", 192, NULL, 1, uxStackBuffer_T1, &xTaskBuffer_T1);
}

void loop() {

}

... dove, per divertirti a cambiare l'intervallo x di cui tu parli, ti basta andare a correggere il valore nella #define RITARDO.

Provalo e vedi come va :wink:

Guglielmo

P.S.: Tieni sempre a mente che, su un Arduino a 16 MHz hai i seguenti valori costanti definiti dal OS:
portUSE_WDTO = 0 (che corrisponde a WDTO_15MS)
configTICK_RATE_HZ = 62
portTICK_PERIOD_MS = 16