This shows you the differences between two versions of the page.
patr:laboratoare:07 [2022/01/12 15:20] alexandru.ionita99 |
patr:laboratoare:07 [2022/02/14 15:16] (current) alexandru.ionita99 [Task-uri FreeRTOS] |
||
---|---|---|---|
Line 93: | Line 93: | ||
TaskHandle_t xHandle; | TaskHandle_t xHandle; | ||
- | // Creem task-ul | + | // Creăm task-ul |
if( xTaskCreate( | if( xTaskCreate( | ||
vTaskCode, //Pointer către funcția ce va rula la pornirea task-ului | vTaskCode, //Pointer către funcția ce va rula la pornirea task-ului | ||
Line 147: | Line 147: | ||
=== vTaskDelay() === | === vTaskDelay() === | ||
- | O funcție foarte importantă din Task API este **void vTaskDelay( TickType_t xTicksToDelay );**. Aceasta înlocuiește clasica funcție **delay()** din Arduino. Funcția plasează **task-ul din care a fost apelată** în starea **BLOCAT** pentru o perioadă de X cicli de ceas, unde X este oferit ca parametru, timp în care alte task-uri, de exemplu cele cu o prioritate mai mică, pot accesa procesorul. | + | O funcție foarte importantă din Task API este **void vTaskDelay( TickType_t xTicksToDelay );**. Aceasta înlocuiește clasica funcție **delay()** din Arduino. Funcția plasează **task-ul din care a fost apelată** în starea **BLOCAT** pentru o perioadă de X ticks, unde X este oferit ca parametru, timp în care alte task-uri, de exemplu cele cu o prioritate mai mică, pot accesa procesorul. |
- | Pentru a transforma timpul din milisecunde în cicli de ceas, utilizăm funcția **pdMS_TO_TICKS()**. | + | Pentru a transforma timpul din milisecunde în ticks, utilizăm funcția **pdMS_TO_TICKS()**. |
<note warning>Utilizarea funcției **delay()** nu este recomandată împreună cu FreeRTOS, deoarece conduce la **suspendarea activității procesorului**, adică a tutoror task-urilor care rulează. Dacă în cazul programării clasice, acest aspect nu era o problemă (exista un singur task), în cazul FreeRTOS pot apărea efecte neașteptate.</note> | <note warning>Utilizarea funcției **delay()** nu este recomandată împreună cu FreeRTOS, deoarece conduce la **suspendarea activității procesorului**, adică a tutoror task-urilor care rulează. Dacă în cazul programării clasice, acest aspect nu era o problemă (exista un singur task), în cazul FreeRTOS pot apărea efecte neașteptate.</note> | ||
Line 162: | Line 162: | ||
{ | { | ||
... | ... | ||
- | // Intră în starea BLOCAT pentru 20 ticks (cicli de ceas) | + | // Intră în starea BLOCAT pentru 20 ticks |
vTaskDelay( 20 ); | vTaskDelay( 20 ); | ||
Line 171: | Line 171: | ||
</code> | </code> | ||
+ | |||
+ | === Alte funcții utile === | ||
+ | |||
+ | * **vTaskDelete( TaskHandle_t pxTask ) ** - Șterge task-ul aferent hande-ului oferit ca parametru. Este eliberată memoria alocată automat la momentul creării task-ului | ||
+ | * **xTaskGetCurrentTaskHandle() ** - Este întors handle-ul task-ului care se află **în execuție** la acel moment | ||
+ | * **xTaskGetHandle( const char *pcNameToQuery ) ** - Este întors handle-ul task-ului cu numele oferit ca parametru | ||
+ | * **pcTaskGetName( TaskHandle_t xTaskToQuery ) ** - Întoarce numele task-ului referit prin handle | ||
+ | * **uxTaskPriorityGet( TaskHandle_t pxTask ) ** - Întoarce prioritatea task-ului referit prin hadle, la acel moment | ||
+ | * **vTaskPrioritySet( TaskHandle_t pxTask, UBaseType_t uxNewPriority ) ** - Setează o nouă prioritate pentru un task | ||
+ | * **vTaskSuspend( TaskHandle_t pxTaskToSuspend ) ** - Pune task-ul în starea **Suspendat** | ||
+ | * **vTaskResume( TaskHandle_t pxTaskToResume) ** - Pune task-ul în starea **Running**. Funcționează doar pentru task-uri **suspendate** | ||
+ | * **taskYIELD() ** - Se apelează dintr-un task **Running**, care iși oferă partiția de timp către alte task-uri **de aceeași prioritate** |