Sunteți pe pagina 1din 4

Laborator Sisteme de Operare II

Lucrarea 2
Task-uri și queues în FreeRTOS

1. Se testează un program care conține doar vLEDFlashTask fără nici un


parametru.

2. Se testează un program care conține 2 instanțe ale vLEDFlashTask cu


timpul de așteptare ca parametru, acționând pe același led și se observă
efectul.
În fișierul myTasks.cpp se modifică funcția vLEDFlashTask astfel:

void vLEDFlashTask( void *pvParameters )


{
unsigned int timpul;

vLEDInit(0);

timpul = ( unsigned int) pvParameters;

portTickType xLastWakeTime;
const portTickType xFrequency = timpul;

xLastWakeTime=xTaskGetTickCount();
for( ;; )
{
vLEDToggle(0);
vTaskDelayUntil(&xLastWakeTime,xFrequency);
} }

Se declară în fișierul principal (main.cpp) variabila globală:

static const unsigned int timp1 = 3000;


static const unsigned int timp2 = 1000;

În fișierul principal (main.cpp) se modifică funcția main astfel:

int main(void)
{

xTaskCreate( vLEDFlashTask, "LED", configMINIMAL_STACK_SIZE, (void


*)timp1, mainLED_TASK_PRIORITY, NULL);

1
xTaskCreate( vLEDFlashTask, "LED1", configMINIMAL_STACK_SIZE, (void
*)timp2, mainLED_TASK_PRIORITY, NULL);
//start scheduler
vTaskStartScheduler();
//you should never get here
while (1)
{ }
return 0;
}

Exercițiu: se modifică programul astfel încât să existe 2 task-uri separate,


fiecare pe un alt led.

3. Se testează ștergerea unui task. Se adaugă în fișierul myTasks.cpp


următoarea funcție:

void vLEDFlashTask1(void *pvParameters )


{
params *prm_in;
uint8_t a=0;

vLEDInit(0);

prm_in = (params *) pvParameters; //remapare de la *void la *params

portTickType xLastWakeTime;
const portTickType xFrequency = prm_in->timp; //acces le componentele
//structurii prin pointer

xLastWakeTime=xTaskGetTickCount();
for( ;; )
{
vLEDToggle(0);

vTaskDelayUntil(&xLastWakeTime,xFrequency);
if (a==0) {vTaskDelete(prm_in->task);a=1;} //sterg doar o data

} }

Se declară în fișierul principal (main.cpp) variabilele globale:


TaskHandle_t xTask1Handle = NULL;
params prm;

În fișierul principal (main.cpp) se modifică funcția main astfel:

int main(void)
{

2
xTaskCreate( vLEDFlashTask, "LED2", configMINIMAL_STACK_SIZE, (void
*)timp2, mainLED_TASK_PRIORITY, &xTask1Handle);
prm.task=xTask1Handle;
prm.timp=8000U;
xTaskCreate( vLEDFlashTask1, "LED1", configMINIMAL_STACK_SIZE, (void
*)&prm, mainLED_TASK_PRIORITY, NULL );
//start scheduler
vTaskStartScheduler();
//you should never get here
while (1)
{
}
return 0;
}
Exercițiu: să se modifice programul astfel încât task-ul vLEDFlashTask să fie
șters înainte de a se executa, dacă intervalul de timp de așteptare pentru
vLEDFlashTask1 este mai mic de 3s.

4. Folosirea queues pentru comunicarea între task-uri. Se adaugă în fișierul


myTasks.cpp următoarele funcții:

void vLEDFlashTask2(void *pvParameters )


{
unsigned int timpul;
uint8_t in=0;

vLEDInit(6);

timpul = ( unsigned int) pvParameters;

portTickType xLastWakeTime;
const portTickType xFrequency = timpul;

xLastWakeTime=xTaskGetTickCount();
for( ;; )
{
xQueueReceive(xQueue, &in, portMAX_DELAY );
if (in) vLEDToggle(6);
} }

void vBtnCheck(void *pvParameters )


{
unsigned int timpul;
unsigned int ant=1;
uint8_t val;

vBtnInit (3);

timpul = ( unsigned int) pvParameters;

portTickType xLastWakeTime;

3
const portTickType xFrequency = timpul;

xLastWakeTime=xTaskGetTickCount();
for( ;; )
{
val=uBtnPressed(3,&ant);
xQueueSendToBack( xQueue, &val, 0 );
vTaskDelayUntil(&xLastWakeTime,xFrequency);
}

}
Se declară în fișierul myTasks.cpp variabila globală:

extern QueueHandle_t xQueue;

Se declară în fișierul principal (main.cpp) variabila globală:

QueueHandle_t xQueue;

În fișierul principal (main.cpp) se adaugă în funcția main următoarele


instrucțiuni:
xQueue = xQueueCreate(1,sizeof(uint8_t));
xTaskCreate( vBtnCheck, "Buton", configMINIMAL_STACK_SIZE, (void
*)timp1, mainLED_TASK_PRIORITY+1, NULL);
xTaskCreate( vLEDFlashTask2, "LED2", configMINIMAL_STACK_SIZE, (void
*)timp2, mainLED_TASK_PRIORITY, NULL);

Exercițiu: să se modifice programul astfel încât task-ul vLEDFlashTask2


să fie șters după 4 apăsări ale butonului.

S-ar putea să vă placă și