Se si va ad esaminare il file FreeRTOSConfig. della libreria FreeRTOS™ inclusa tra le librerie del "core" Arduino UNO R4 si scopre che i parametri relativi al multi tasking sono così impostati:
#define configUSE_PREEMPTION (1)
e
#define configUSE_TIME_SLICING (0)
... quindi, FreeRTOS™ è configurato per utilizzare il "preemptive RTOS scheduler", ma NON il "prioritised preemptive scheduling with time slicing" e quindi che, per task alla stessa priorità, NON viene effettuato il task switching. ![]()
Il motivo di tale scelta risulta chiaro se si pensa che FreeRTOS™ è visto solo come una libreria aggiuntiva di un insieme che NON è stato disegnato per lavorare in multi task, time sharing. Ci sono difatti alcune librerie che prevedono, nelle loro funzioni, delle tempistiche ben precise e sono state scritte con in mente il concetto del mono task senza tenere conto che in un ambiente multi task, time sharing potrebbero venire interrotte in qualsiasi momento (cosa che invece tiene sempre in considerazione chi scrive driver per ambienti RTOS).
Se, per ragioni di efficienza, si imposta il parametro:
#define configUSE_TIME_SLICING (1)
si deve tenere ben presente che la cosa può creare grossi problemi in funzione delle librerie che si andranno ad utilizzare nel proprio programma.
Un tipico esempio è la libreria Wire che è a corredo del "core" Arduino UNO R4 (quindi specificatamente fatta per il Renesas RA4M1) che, in ben due punti ha un qualche cosa tipo:
while(((millis() - start) < timeout_ms) && bus_status == WIRE_STATUS_UNSET && err == FSP_SUCCESS) {
... è evidente che, se durante il while() avviene un task switching, si potrebbe tornare al while() (dopo il giro tra i vari task ad eguale priorità) dopo un tempo che potrebbe essere considerato come un timeout nella while(). ![]()
Considerate che ho fatto la prova con un programma che usa vari sensore su bus I2C e altre cose per un totale di 6 task (i vari task sono tutti alla stessa priorità) ed un timer. L'ovvia possibilità di conflitto nell'uso del bus I2C è naturalmente gestita con un "mutex", ma ... NON basta.
Dopo qualche ora di funzionamento capita che avviene il task switch al momento sbagliato e ... il bus I2C cessa di funzionare (non riesce neanche a riprendersi) e quindi, niente dati in arrivo dai vari sensore su I2C.