• Nenhum resultado encontrado

Ambientes multi-tarefas visam a facilitar o desenvolvimento de sistemas mais com- plexos, visto que torna possível a realização de uma depuração a módulos mais pequenos que compõem um sistema e não comprometem o sistema caso este fique aguardando por um evento, dado que o sistema operativo oferece vários meca- nismos de sincronização, assim quando uma tarefa aguarda por um evento será interrompida a sua execução dando a possibilidade das restantes tarefas continu- arem com a sua execução normal.

As tarefas no FreeRTOS são implementadas como sendo simples funções C, mas com a particularidade de estas terem de ser declaradas segundo o formato imposto pelo sistema operativo. As funções declaradas como tarefas devem ser obrigatori- amente declaradas com o tipo de retorno void e um único argumento, que deverá ser um apontador para void e as funções associadas às tarefas nunca deveram de retornar nenhum valor.

No caso de um processador single core apenas uma tarefa está em execução, e diz- se que esta se encontra em estado Running e as restantes em estado Not Running como ilustra a Figura 3.2. As tarefas que encontram no estado Not Running podem estar prontas para serem executadas ou não, quando estas se encontram prontas assumem o estado de Ready senão assumem um dos dois estados Suspended ou

Blocked. Na Figura 3.3 está representada a máquina de estados completa das

#error Ensure CreateProjectDirectoryStructure.bat has been executed before building. See comment immediately above. #ifndef FREERTOS_CONFIG_H #define FREERTOS_CONFIG_H #include <stdint.h> #include <stddef.h> /*--- * Application specific definitions.

*

* These definitions should be adjusted for your particular hardware and * application requirements.

*

* THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. *

* See http://www.freertos.org/a00110.html. *---*/

extern uint32_t SystemFrequency;

#define configUSE_PREEMPTION 1 #define configUSE_IDLE_HOOK 1 #define configUSE_TICK_HOOK 0

#define configCPU_CLOCK_HZ ( SystemFrequency ) #define configTICK_RATE_HZ ( ( TickType_t ) 1000 ) #define configMAX_PRIORITIES ( 5 )

#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 90 ) #define configTOTAL_HEAP_SIZE ( ( size_t ) ( 30 * 1024 ) ) #define configMAX_TASK_NAME_LEN ( 10 ) #define configUSE_TRACE_FACILITY 1 #define configUSE_16_BIT_TICKS 0 #define configIDLE_SHOULD_YIELD 1 #define configUSE_MUTEXES 1 #define configQUEUE_REGISTRY_SIZE 0 #define configGENERATE_RUN_TIME_STATS 1 #define configCHECK_FOR_STACK_OVERFLOW 2 #define configUSE_RECURSIVE_MUTEXES 1 #define configUSE_MALLOC_FAILED_HOOK 1 #define configUSE_APPLICATION_TASK_TAG 0 #define configUSE_COUNTING_SEMAPHORES 0 /* Co-routine definitions. */ #define configUSE_CO_ROUTINES 0 #define configMAX_CO_ROUTINE_PRIORITIES ( 2 )

/* Software timer definitions. */

#define configUSE_TIMERS 1 #define configTIMER_TASK_PRIORITY ( 2 ) #define configTIMER_QUEUE_LENGTH 10

#define configTIMER_TASK_STACK_DEPTH ( configMINIMAL_STACK_SIZE * 2 )

/* Set the following definitions to 1 to include the API function, or zero to exclude the API function. */

#define INCLUDE_vTaskPrioritySet 1 #define INCLUDE_uxTaskPriorityGet 1 #define INCLUDE_vTaskDelete 1 #define INCLUDE_vTaskCleanUpResources 1 #define INCLUDE_vTaskSuspend 1 #define INCLUDE_vTaskDelayUntil 1 #define INCLUDE_vTaskDelay 1

Not Running

Running

Preemption

Not RunningNot RunningNot Running

Figura 3.2: Visão geral dos estados das tarefas no FreeRTOS

Running

Ready

Blocked

Suspensed

vTaskSuspend() Blocking API

Event vTaskSuspend() vTaskResume() Preemption vTaskSuspend() xTaskCreate()

Not Running

O escalonador é a única entidade que pode promover uma tarefa para o estado de

Running. As tarefas apenas podem ser transitar para o estado de Running a partir

do estado Ready. Quando uma tarefa entra em estado Running a tarefa que estava a ser executada é despromovida pelo escalonador, mas esta também poderá aban- donar a sua própria execução. Se a tarefa chamar a função vTaskSuspend(NULL) o seu estado passará a ser Suspensed e o escalonador irá selecionar a tarefa mais prioritária das prontas para execução - estado Ready. A função vTaskSuspend() também pode ser chamada para suspender uma outra tarefa, para isso basta passar como argumento o apontador para a tarefa a ser suspensa. Uma tarefa também poderá passar do estado Ready para estado Bloked ficando a aguardar por um evento. Os eventos podem ser de dois tipos: eventos de temporização e eventos de sincronização. Quando uma tarefa necessitar poderá atrasar a sua execução por um determinado número de ticks ou por um tempo especifico, para tal, basta chamar as funções vTaskDelay()e vTaskDelayUntil(), respetivamente. No caso da chamada de vTaskDelay() o tempo real que a tarefa permanece bloqueada depende da frequência atribuída ao tick, dado que o parâmetro que esta função recebe é o número de ticks pretendidos de delay, e a frequência do tick poderá ser configu- rada no ficheiro de configuração citado na secção anterior alterando o parâmetro

configTICK_RATE_HZ. Para eventos de sincronização o FreeRTOS oferece vários

recursos com este intuito como, por exemplo, queues, semáforos binários, semáfo- ros contadores, semáforos recursivos, mutexes. Ao usar eventos de sincronização pode ser definido um tempo de timeout para o bloqueio da tarefa, a tarefa saíra do estado Bloked assim que ocorrer o respetivo evento ou quando o tempo de timeout atribuído expirar.

Em termos de prioridades, o número máximo de prioridades que podem ser atribuí- das às tarefas é definido pela constante configMAX_PRIORITIES. O FreeRTOS não impõem qualquer limitação a este valor mas quanto maior for o número de prioridades mais RAM será consumida pelo sistema operativo, pois para cada pri- oridade é criada uma lista de tarefas prontas. Quando é atribuído a uma tarefa um valor baixo de prioridade significa que esta tarefa tem um grau de prioridade baixo, sendo 0 o valor mais baixo. Quando as tarefas partilham a mesma priori- dade, estas serão executadas alternadamente, sendo o escalonador o responsável por alternar a execução das tarefas, que serão interrompidas à frequência do tick definido.

De forma a gerir as tarefas, o FreeRTOS atribui a cada tarefa uma estrutura de dados, denominada de TCB (Task Control Block) que contém informações neces-

sárias das tarefas. A Figura 3.4 mostra esta estrutura de dados. Para cada tarefa é atribuído um espaço de memória usado por esta, denominado de stack. O TCB armazena as informações importantes para a gestão desta stack, usado três apon- tadores para o efeito: pxTopOfStack, pxStack e pxEndOfStack. Sendo o primeiro um apontador para o último item colocado na stack da tarefa, o segundo e terceiro apontam para o inicio e fim da stack, respetivamente. O TCB também contém a prioridade da tarefa (uxPriority), o nome que lhe foi atribuído (pcTaskName) e duas estruturas. A estrutura xGenericListItem é usada listas Ready, Suspended e a xEventListItem na lista Blocked que serão discutidas na secção seguinte.

*pxTopOfStack xGenericListItem xEventListItem uxPriority *pxStack TCB pcTaskName xItemValue = configMAX_PRIORITIES - uxPrio rity *pxNext *pxPrevious *pvOwner *pvContainer=NULL struct xLIST_ITEM xItemValue *pxNext *pxPrevious *pvOwner *pvContainer=NULL struct xLIST_ITEM *pxEndOfStack pxCurrentTCB

Figura 3.4: Estrutura TCB (Task Control Block)

Documentos relacionados