Professional Documents
Culture Documents
Labworks
FreeRTOS
Gerenciamento de tarefas
Embedded
Labworks
GERENCIAMENTO DE TAREFAS
Cada tarefa se comporta como um programa
isolado:
Tem um ponto de entrada.
implementada normalmente com um loop infinito.
Normalmente no retorna. Se uma tarefa finalizar,
responsabilidade do desenvolvedor remov-la da lista
de tarefas do kernel.
voidATaskFunction(void*pvParameters);
Prottipo de uma tarefa:
Embedded
Labworks
/*createanewtaskandaddittothelistoftasksthat
arereadytorun*/
BaseType_txTaskCreate
(
TaskFunction_tpvTaskCode,
constchar*constpcName,
unsignedshortusStackDepth,
void*pvParameters,
UBaseType_tuxPriority,
TaskHandle_t*pvCreatedTask
);
Embedded
Labworks
TCB E STACK
Tarefa X
Nome
Prioridade
Top of Stack
0x1845
0x43BF
0x5FA4
0x96BF
Stack
Embedded
Labworks
INICIANDO O ESCALONADOR
#include"FreeRTOS.h"
#include"task.h"
intmain(void)
{
[...]
/*createtask1*/
xTaskCreate(task1,(signedchar*)"Task1",
configMINIMAL_STACK_SIZE,(void*)NULL,
1,NULL);
/*startthescheduler*/
vTaskStartScheduler();
/*shouldneverreachhere!*/
for(;;);
}
Embedded
Labworks
/*removeataskfromtheRTOSkernelmanagement*/
voidvTaskDelete(TaskHandle_txTask);
Embedded
Labworks
voidATaskFunction(void*pvParameters)
{
for(;;)
{
/*taskcode*/
}
vTaskDelete(NULL);
}
Embedded
Labworks
LABORATRIO
TAREFAS EM EXECUO
TAREFA 1
TAREFA 2
t1 t2 Tempo tn
Embedded
Labworks
PRIORIDADES
A prioridade de uma tarefa definida no parmetro
uxPriority da funo xTaskCreate().
PRIORIDADES E O ESCALONADOR
As tarefas tero diferentes prioridades, dependendo
das suas caractersticas de tempo real.
MODO COLABORATIVO
No modo colaborativo, as tarefas no so interrompidas
pelo kernel durante sua execuo.
USANDO taskYIELD
#include"task.h"
voidATaskFunction(void*pvParameters)
{
for(;;){
process_something();
taskYIELD();
}
}
Embedded
Labworks
MODO PREEMPTIVO
No modo preemptivo, sempre que uma tarefa de maior
prioridade ficar pronta para execuo, o kernel ir
interromper a tarefa de menor prioridade para executar
a tarefa de maior prioridade.
TICK INTERRUPT
Para interromper a tarefa em execuo e trocar de
contexto para uma nova tarefa, o kernel usa uma
interrupo do sistema.
KERNEL
TAREFA 1
TAREFA 2
t1 t2 Tempo tn
Embedded
Labworks
LABORATRIO
Prioridades e escalonamento
Embedded
Labworks
EVENTOS
Nas atividades que desenvolvemos at agora, as
tarefas no bloqueiam ou esperam por algo, elas
simplesmente monopolizam a CPU.
ESTADO BLOCKED
Uma tarefa esperando um evento est no estado
Blocked ou bloqueada.
ROTINAS DE DELAY
#include"task.h"
/*delayataskforagivennumberofticks*/
voidvTaskDelay(
constTickType_txTicksToDelay
);
/*delayataskuntilaspecifiedtime*/
voidvTaskDelayUntil(
TickType_t*pxPreviousWakeTime,
constTickType_txTimeIncrement
);
Embedded
Labworks
ESTADO SUSPENDED
A funo vTaskSuspend() pode ser usada para colocar
uma tarefa no estado Suspended.
ESTADO READY
Tarefas que no esto nos estados Blocked ou
Suspended esto no estado Ready.
vTaskSuspend Blocking
API
Ready
vTaskResume Event
xTaskCreat
e
Suspended Blocked
vTaskSuspend
Not running
Embedded
Labworks
LABORATRIO
Rotinas de delay
Embedded
Labworks
TAREFA IDLE
Quando trabalhamos com eventos, as tarefas esto a
maioria do tempo no estado Blocked.
TAREFAS EM EXECUO
TAREFA 1
TAREFA 2
TAREFA IDLE
t1 t2 Tempo tn
Embedded
Labworks
check_if_another_task_is_ready();
execute_idle_task_hook();
check_if_should_sleep();
}
}
Embedded
Labworks
ECONOMIA DE ENERGIA
comum o uso da Idle Task Hook para colocar a CPU em um
modo de baixo consumo.
LABORATRIO
UM RESUMO DO ESCALONADOR
Uma aplicao composta por uma ou mais tarefas.
O KERNEL DO FREERTOS
Fixed Priority Preemptive Scheduling
TAREFA 1 (P3)
TAREFA 2 (P2)
TAREFA 3 (P1)
IDLE (P0)
t1 t2 Tempo tn