Allora, butta quel codice
-
Per evitare problemi, su Arduino usa sempre l'allocazione statica delle risorse e non quella dinamica
-
l'inizializzazione del HW si fa nel setup(), NON nei task
-
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. -
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
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