• No results found

Para disponibilizar as características discutidas nesta seção, o FreeRTOS contém um conjunto de funcionalidades que podem ser classificados da seguinte forma: criação de tarefas, controle de tarefas, utilitários de tarefas, controle do escalonador e gerenciamento de co-rotinas. A seguir, tem-se em detalhes a descrição de cada uma dessas funcionalides. 3.1.4.1 Criação de Tarefas

Essa parte é responsável pela entidade tarefa e sua criação. Nela, estão presentes um tipo, responsável por representar uma tarefa do sistema, e duas funcionalidades, uma para a criação e outra para a remoção de tarefas do sistema. Em seguida, tem-se o tipo e as funcionalidades que compõem a biblioteca em questão.

• xTaskCreate: cria uma nova tarefa para o sistema;

2As tarefas bloqueadas por um evento temporal devem retornar para o estado pronta quando o tempo de

execução é igual ao seu tempo de bloqueio e as bloqueadas por eventos das abstrações de hardware devem ser desbloqueada até o seu tempo de bloqueio.

• vTaskDelete: remove uma tarefa do sistema3; e

• xTaskHandle: tipo pelo qual uma tarefa é referenciada. Por exemplo, quando uma tarefa é criada através do método xTaskCreate, este retorna uma referência para a nova tarefa através do tipo xTaskHandle.

3.1.4.2 Controle de tarefas

A parte de controle de tarefas realiza operações sobre as tarefas do sistema. Ela disponibiliza funcionalidades capazes de bloquear, suspender e reativar uma tarefa do sistema e informar e alterar a prioridade de uma tarefa no sistema. A lista das principais funcionalidades pertencentes a essa classificação pode ser vista a seguir:

• vTaskDelay: bloqueia uma tarefa por um determinado tempo. Nessa funcionali- dade, para calcular o tempo em que a tarefa deve permanecer bloqueada, será levado em consideração o instante da chamada à funcionalidade. Devido a isso, essa fun- cionalidade não é recomendada para a criação de tarefas cíclicas, pois o instante em que ela é chamada pode variar a cada execução da tarefa, por causa das interrupções que uma tarefa pode sofrer;

• vTaskDelayUntil: bloqueia uma tarefa por um determinado tempo. Essa funcional- idade, diferente da vTaskDelay, calcula o tempo que a tarefa deve permanecer blo- queada com base no instante do último desbloqueio da tarefa. Assim, se ocorrer uma interrupção no momento da chamada à funcionalidade, o instante em que a tarefa foi desbloqueada não ira mudar. Com isso, esse método torna-se recomendável para a criação de tarefas cíclicas;

• uxTaskPriorityGet: informa a prioridade de uma determinada tarefa; • vTaskPrioritySet: muda a prioridade de uma determinada tarefa; • vTaskSuspend: coloca uma determinada tarefa no estado suspensa;

• vTaskResume: coloca uma determinada tarefa suspensa no estado pronta; e • xTaskResumeFromISR: funcionalidade usada pelo tratamento de interrupções do

sistema. Ela coloca uma determinada tarefa suspensa para o estado pronta. 3.1.4.3 Utilitários de tarefas

O FreeRTOS disponibiliza para o usuário informações importantes a respeito das tare- fas e do escalonador de tarefas. Nesta parte da biblioteca, estão presentes funcionalidades capazes de retornar uma referência para a atual tarefa em execução, retornar o tempo de funcionamento e estado do escalonador e retornar o número de tarefas que estão sendo gerenciadas pelo sistema. Uma lista das principais funcionalidades dessa biblioteca é encontrada a seguir:

• xTaskGetCurrentTaskHandle: retorna uma referência para a atual tarefa em exe- cução;

3A memória alocada pela tarefa será liberada somente quando a tarefa ociosa entrar em exe-

• uxTaskGetStackHighWaterMark: retorna a quantidade de espaço restante na pilha de uma tarefa;

• xTaskGetTickCount: retorna o tempo decorrido desde a inicialização do escalon- ador;

• xTaskGetSchedulerState: retorna o estado do escalonador;

• uxTaskGetNumberOfTasks: retorna o número de tarefas do sistema;

• TaskCallApplicationTaskHook: executa a função gancho, função associada a uma tarefa para preceder a sua execução; e

• TaskSetApplicationTag: associa uma ’tag’ a uma tarefa. Essa ’tag’ será utilizada principalmente pelas funcionalidades de rastreamento do sistema. Entretanto, é possível usar essa ’tag’ para associar uma função gancho a uma tarefa. Essa função é executada através da chamada à funcionalidade TaskCallApplicationTaskHook, informando a tarefa associada.

3.1.4.4 Controle do Escalonador

Nessa parte estão presentes as funcionalidades responsáveis por controlar as ativi- dades do escalonador de tarefas. Essas iniciam, finalizam, suspendem e reativam as ativi- dades do escalonador. Entre elas, as principais são:

• vTaskStartScheduler: inicia as atividades do escalonador, ou seja, inicializa o sistema;

• vTaskEndScheduler: encerra as atividades do escalonador, ou seja, finaliza o sis- tema;

• vTaskSuspendAll: suspende as atividades do escalonador

• xTaskResumeAll: reativa o escalonador quando o mesmo está suspenso; • taskYIELD: força a troca de contexto4entre tarefas;

• taskENTER_CRITICAL: indica o início de uma região crítica, desabilita tempo- rariamente a característica de preempção do escalonador impedindo que a tarefa em execução seja interrompida por outra;

• taskEXIT_CRITICAL: indica o final de uma região crítica, permitindo que ocorra novamente o escalonamento preemptivo;

• taskDISABLE_INTERRUPTS: Desabilita as interrupções do microcontrolador; e

• taskENABLE_INTERRUPTS: Habilita as interrupções do microcontrolador.

4Troca de contexto é a operação na qual a tarefa em execução é trocada por outra. Para que a troca de

3.1.4.5 Co-rotinas

Por fim, tem-se a parte de gerenciamento de co-rotinas. Nela, estão presentes as fun- cionalidades e tipos responsáveis por criar e controlar o elemento co-rotina. A lista com- pleta das funcionalidades presentes nessa biblioteca pode ser vista a seguir:

• xCoRoutineHandle: tipo que representa uma co-rotina. • xCoRoutineCreate: cria uma nova co-rotina no sistema.

• crDELAY: bloquea uma co-rotina durante uma determinada quantidade de tempo. • crQUEUE_SEND: envia uma mensagem para uma fila através de uma co-rotina. • crQUEUE_RECEIVE: recebe uma mensagem de uma fila através de uma co-

rotina.

• crQUEUE_SEND_FROM_ISR: envia uma mensagem para uma fila, através de uma co-rotina responsável por tratar uma interrupção.

• crQUEUE_RECEIVE_FROM_ISR: recebe uma mensagem de uma fila, através de uma co-rotina responsável por tratar uma interrupção.

• vCoRoutineSchedule: chama o escalonador para escolher e colocar em execução a co-rotina de maior prioridade entre as co-rotinas de estado pronto.