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.