queues and hook functions

51
ESCOLA POLITÉCNICA DE PERNAMBUCO UNIVERSIDADE DE PERNAMBUCO SISTEMAS OPERACIONAIS QUEUES E HOOK FUNCTIONS

Upload: mayara-monica

Post on 29-Jun-2015

286 views

Category:

Education


0 download

TRANSCRIPT

Page 1: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

QUEUES E HOOK

FUNCTIONS

Page 2: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

Introdução

Conceito de FIFO ( First In First Out ) onde os

dados são escritos no fim e lidos no início.

Page 3: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

Introdução

Queues são a principal forma de comunicação entre tarefas.

Page 4: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

Introdução

Elas podem ser usadas para enviar mensagens entre tarefas

e entre interrupções e tarefas.

Page 5: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

Introdução

Novos dados podem ser enviados para o fim da fila

ou ainda podem ser enviados para a frente.

Page 6: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

Introdução

Uma fila não pertence a nenhuma tarefa em

específico.

Page 7: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

Introdução • Cada queue armazena um conjunto finito de itens

(uxLenght);

• Cada item do queue pode ter um tamanho fixo de bytes

(uxItemSize);

• Ambos “uxLenght” e “uxItemSize” são definidos no

momento da criação do queue;

• Escrever em uma queue significa copiar os dados byte a

byte. Ler de uma queue significa cópia e remoção dos

dados da queue. Se o elemento da queue for muito

grande, o ideal é trabalhar com ponteiros.

Page 8: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

• Pequenas mensagens podem ser enviadas diretamente para a queue

ou lidas diretamente da queue através de variáveis.

• O envio para uma queue deste modo permite substituir a variável que

foi enviado para a queue.

• Usar queues que passam dados por cópia não impede que elas

também possam ser utilizadas para transmitir dados por referência.

• Quando o tamanho de uma mensagem chegar a um ponto em que não

é prático copiar toda a mensagem para a queue byte a byte, então são

utilizados ponteiros. O ponteiro é copiado para o lugar da mensagem

na queue.

Introdução

Page 9: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

• Uma única queue pode ser usada para receber diferentes tipos de

mensagens e mensagens de vários locais.

• Uma queue pode armazenar uma estrutura que tem um elemento que

contém o tipo de mensagem, e um outro elemento que contém os

dados da mensagem ou ainda um ponteiro para os dados da

mensagem.

• Os dados são interpretados depende do tipo de mensagem.

• Por exemplo, isto é exatamente o que a tarefa que gerencia a pilha

FreeRTOS + UDP IP é capaz de fazer.

• Usa única fila para receber notificações de eventos do timer ARP,

pacotes sendo recebidos do hardware Ethernet, os pacotes recebidos

do aplicativo, a rede para baixo eventos, etc

Introdução

Page 10: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

As funções da API de queues permite um tempo de bloqueio que

pode ser especificado caso uma das duas situações ocorram:

• Lendo da Queue:

• A tarefa esta aguardando um item da queue. A tarefa será colocada

no estado Blocked até que os dados estejam disponíveis na fila ou

até o tempo de bloqueio expirar (timeout de leitura). • Não consome tempo de CPU e outras tarefas podem ser executadas.

• Uma tarefa esperando um item na queue é automaticamente

colocada no estado Ready quando: • Um item é escrito na queue;

• O timeout de leitura expira ;

Bloqueio de Queues

Page 11: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

• Lendo da Queue:

• Queues podem ter mais de uma tarefa esperando a leitura de um

item;

• A tarefa de maior prioridade é passada para o estado Ready;

• Se existir mais uma tarefa com a mesma prioridade, então a tarefa

que esta esperando a mais tempo será passada para o estado

Ready.

Bloqueio de Queues

Page 12: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

• Lendo do Queue:

Bloqueio de Queues

Page 13: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

• Escrevendo na queue:

• A tarefa tenta escrever em uma queue cheia. A tarefa será colocada

no estado Blocked até que haja espaço disponível na fila ou até o

tempo de bloqueio expirar (timeout de escrita). • Não consome tempo de CPU e outras tarefas podem ser executadas.

• Uma tarefa escrevendo um item na queue é colocada

automaticamente no estado Ready quando: • O elemento é escrito na queue com sucesso;

• O timeout de escrita expira;

• Se a queue estiver cheia assim que surgir um espaço livre a tarefa

de maior prioridade é colocada no estado Ready;

• Se houver mais de uma tarefa bloqueada com a mesma prioridade

aguardando, a tarefa que estiver a mais tempo será passada para o

estado Ready..

Bloqueio de Queues

Page 14: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

• Escrevendo no queue:

Bloqueio de Queues

Page 15: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

• Normalmente os eventos são tratados com interrupções

dentro de uma rotina de tratamento de interrupção (ISR);

• Queues são usados para comunicar eventos e transferir

dados;

• Portanto, o queue pode ser usado para transferir dados e

deferir trabalho de uma interrupção para uma tarefa do

RTOS;

• Em interrupções use sempre as funções que terminam com

FromISR();

Interrupções

Page 16: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

API Functions

Page 17: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

API Functions xQueueCreate

queue.h

QueueHandle_t xQueueCreate

(

BaseType_t uxQueueLength,

BaseType_t uxItemSize

);

Retorno:

Se a fila é criada com êxito, um identificador para a fila recém-criada é

retornado.

Se a fila não pode ser criada, é retornado 0.

Parâmetros:

• uxQueueLength: O número máximo de itens que a fila pode conter.

• uxItemSize: O número de bytes de cada item na fila vai exigir.

Page 18: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

API Functions vQueueDelete queue.h

void vQueueDelete

{

QueueHandle_t xQueue

};

Parâmetros:

• xQueue - Um identificador para

a fila para ser excluído.

xQueueReset queue.h

BaseType_t xQueueReset

(

QueueHandle_t xQueue

);

Parâmetros:

• xQueue : o identificador da fila é

passado,

Retorna:

Desde FreeRTOS V7.2.0 xQueueReset()

sempre retorna pdPASS.

Page 19: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

API Functions

uxQueueSpacesAvailable

queue.h

BaseType_t uxQueueSpacesAvailable

(

QueueHandle_t xQueue

);

Parâmetros:

• xQueue : O identificador da fila para

ser consultado.

Retorna:

O número de espaços livres em uma

fila.

uxQueueMessagesWaiting

queue.h

BaseType_t uxQueueMessagesWaiting

(

QueueHandle_t xQueue

);

Parâmetros:

• xQueue : O identificador da fila para

ser consultado.

Retorna :

O número de mensagens disponíveis

na fila.

Page 20: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

API Functions vQueueAddToRegistry

queue.h

void vQueueAddToRegistry

(

QueueHandle_t xQueue,

char * pcQueueName

);

Parâmetros:

• xQueue: O identificador da fila em

que o item será escrito.

• pcQueueName: O nome a ser

atribuído à fila. Esta é apenas uma

sequência de texto usado para facilitar a

depuração.

vQueueUnregisterQueue

queue.h

vazio vQueueUnregisterQueue

(

QueueHandle_t xQueue

);

Parâmetros:

• xQueue: O identificador da fila

que será removida do registro.

Page 21: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

API Functions xQueueOverwrite

queue.h

BaseType_t xQueueOverwrite

(

QueueHandle_t xQueue,

const void * pvItemToQueue

);

Retorna:

xQueueOverwrite() é uma macro que chama xQueueGenericSend(), e,

portanto, tem os mesmos valores de retorno como

xQueueSendToFront(). No entanto, pdPASS é o único valor que pode ser

retornado porque xQueueOverwrite() escreve na fila, mesmo quando a fila

já esta cheia.

Parâmetros:

• xQueue: O identificador da fila em que o

item será escrito.

• pvItemToQueue: Um ponteiro para o

item que será colocado na fila.

Page 22: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

API Functions

xQueuePeek queue.h

BaseType_t xQueuePeek

(

QueueHandle_t xQueue,

void * pvBuffer, TickType_

t xTicksToWait

);

Retorna:

pdTRUE se o item foi recebido com êxito na fila, caso contrário pdFALSE.

Parâmetros:

• xQueue: O identificador da fila em que o item será escrito.

• pvBuffer: Ponteiro para o buffer no qual o item recebido será copiado.

• xTicksToWait: A quantidade máxima de tempo que a tarefa deve bloquear à espera de

um item caso a fila esteja vazia no momento da chamada.

Page 23: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

API Functions uxQueueMessagesWaitingFromISR

queue.h

BaseType_t uxQueueMessagesWaiting

(

QueueHandle_t xQueue

);

Parâmetros:

• xQueue: Um identificador da fila que será consultada.

Retorna:

O número de mensagens armazenadas em uma fila.

Page 24: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

API Functions xQueueSendFromISR

queue.h

BaseType_t xQueueSendFromISR

(

QueueHandle_t xQueue,

const void * pvItemToQueue,

BaseType_t * pxHigherPriorityTaskWoken

);

Retorna:

pdTRUE se os dados foram enviados com sucesso para a fila, caso contrário

errQUEUE_FULL.

Page 25: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

API Functions

Parâmetros:

• xQueue: O identificador da fila em que o item está a ser escrito.

• pvItemToQueue: Um ponteiro para o item que será colocado na fila. O tamanho dos

itens da fila já foram definidos quando a fila foi criada.

• pxHigherPriorityTaskWoken: xQueueSendFromISR() irá definir

*pxHigherPriorityTaskWoken para pdTRUE se enviar para a fila uma tarefa desbloqueada

e esta tarefa desbloqueada tiver uma prioridade maior do que a tarefa em execução. Se

xQueueSendFromISR() definir este valor para pdTRUE então uma mudança de contexto

deve ser solicitada antes da interrupção ser encerrada. No FreeRTOS V7.3.0

pxHigherPriorityTaskWoken é um parâmetro opcional e pode ser definido como NULL.

Page 26: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

API Functions

xQueueSendToFrontFromISR

queue.h

BaseType_t xQueueSendToFrontFromISR

(

QueueHandle_t xQueue,

const void *pvItemToQueue,

BaseType_t *pxHigherPriorityTaskWoken

);

Retorno:

pdPass se os dados foram enviados com sucesso para a fila, senão

errQUEUE_FULL.

Page 27: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

API Functions

Parâmetros:

• xQueue: O identificador da fila na qual o item deve ser publicado.

• pvItemToQueue: Um ponteiro para o item que será colocado na fila.

• pxHigherPriorityTaskWoken: xQueueSendToFrontFromISR() irá definir

*pxHigherPriorityTaskWoken para pdTRUE se enviar para a fila uma tarefa

desbloqueada e esta tarefa desbloqueada tiver uma prioridade maior do que a

tarefa em execução. Se xQueueSendFromISR() definir este valor para pdTRUE

então uma mudança de contexto deve ser solicitada antes da interrupção ser

encerrada. No FreeRTOS V7.3.0 pxHigherPriorityTaskWoken é um parâmetro

opcional e pode ser definido como NULL.

Page 28: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

API Functions xQueueReceiveFromISR

queue.h

BaseType_t xQueueReceiveFromISR

(

QueueHandle_t xQueue,

void *pvBuffer,

BaseType_t *pxHigherPriorityTaskWoken

);

Retorno:

pdTRUE se o item foi recebido com êxito na fila, senão pdFALSE.

Page 29: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

API Functions

Parâmetros:

• xQueue: O identificador da fila para onde o item será enviado.

• pvBuffer: Ponteiro para o buffer no qual o item recebido será copiado

• pxHigherPriorityTaskWoken: Uma tarefa pode estar bloqueada esperando

pelo espaço disponível no âmbito da fila. Se xQueueReceiveFromISR provoca

tal tarefa para desbloquear *pxHigherPriorityTaskWoken irá ser definido para

pdTRUE, caso contrário *pxHigherPriorityTaskWoken permanecerá inalterado.

De FreeRTOS V7.3.0 pxHigherPriorityTaskWoken é um parâmetro opcional e

pode ser definido como NULL.

Page 30: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

API Functions xQueueIsQueueEmptyFromISR

queue.h

BaseType_t xQueueIsQueueEmptyFromISR

(

const QueueHandle_t xQueue

);

Parâmetros:

• xQueue: O indicador da fila que está sendo consultada

Retorno:

pdFALSE se a fila não estiver vazia, ou qualquer outro valor se a fila estiver vazia.

Page 31: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

API Functions xQueueIsQueueFullFromISR

queue.h

BaseType_t xQueueIsQueueFullFromISR

(

const QueueHandle_t xQueue

);

Parâmetros:

• xQueue: O identificador da fila que será consultada

Retorno:

pdFALSE se a fila não estiver cheia, ou qualquer outro valor se a fila estiver cheia.

Page 32: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

API Functions xQueueOverwriteFromISR

queue.h

BaseType_t xQueueOverwrite

(

QueueHandle_t xQueue,

const void *pvItemToQueue,

BaseType_t *pxHigherPriorityTaskWoken

);

Retorno:

xQueueOverwriteFromISR() é uma macro que chama

xQueueGenericSendFromISR(), e, portanto, tem os mesmos valores de retorno

como xQueueSendToFrontFromISR(). No entanto, pdPass é o único valor que

pode ser retornado porque xQueueOverwriteFromISR() vai escrever na fila, mesmo

quando a fila já estiver cheia.

Page 33: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

API Functions

Parâmetros:

• xQueue: O identificador da fila para a qual os dados devem ser enviados.

• pvItemToQueue: Um ponteiro para o item que será colocado na fila.

• pxHigherPriorityTaskWoken: xQueueOverwriteFromISR() irá definir

*pxHigherPriorityTaskWoken para pdTRUE se enviar para a fila uma tarefa

desbloqueada e esta tarefa desbloqueada tiver uma prioridade maior do que a

tarefa em execução. Se xQueueOverwriteFromISR() definir este valor para

pdTRUE então uma mudança de contexto deve ser pedido antes da interrupção

ser encerrada.

Page 34: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

Hook Functions

Page 35: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

Tick Interrupt

• Em um kernel preemptivo: – Tarefas possuem um tempo para execução

– Time slice ou quantum

• No fim desta período de tempo: – Escalonador selecionará a próxima tarefa para

execução.

• O kernel usa uma interrupção do sistema: – tick interrupt (system tick ou clock tick).

Page 36: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

• Tick interrupt (system tick ou clock tick) – Interrupção periódica

– configTICK_RATE_HZ no arquivo FreeRTOSConfig.h

#define configUSE_PREEMPTION 1 #define configUSE_IDLE_HOOK 0 #define configUSE_TICK_HOOK 0 #define configCPU_CLOCK_HZ ( SystemCoreClock ) #define configTICK_RATE_HZ ( ( portTickType ) 1000 )

Tick Interrupt

Page 37: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

Tick Interrupt

Page 38: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

• Uma função de callback pode ser chamada em

cada tick interrupt:

– executando uma rotina periódica, como zerar o

watchdog timer.

– Contexto de interrupção -> processamento o mais breve

possível.

• Habilitar opção:

– configUSE_TICK_HOOK

• Implemente a função:

– void vApplicationTickHook(void);

Tick Interrupt Hook

Page 39: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

Tarefa Idle

• Ao se trabalhar com eventos:

– as tarefas estão quase sempre no estado Blocked.

– e não podem ser escolhidas e executadas pelo escalonador.

• Só que, a CPU precisará executar algo.

– a tarefa Idle

– criada automaticamente na inicialização do escalonador

– ao chamar a função vTaskStartScheduler().

– tem prioridade 0.

Page 40: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

Tarefas em Execução

Page 41: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

Idle Hook Function

• Função de callback chamada ao executar a tarefa Idle. – Executar um processamento contínuo em background.

– Medir a quantidade de processamento livre disponível.

– Colocar o processador em modo de baixo consumo.

• Habilitar a opção configUSE_IDLE_HOOK no arquivo FreeRTOSConfig.h.

• Implementar a função:

void vApplicationIdleHook(void);

Page 42: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

Implementação

• A função de Idle Hook nunca deve bloquear ou suspender.

• Na tarefa Idle ocorre a limpeza das tarefas deletadas pela aplicação.

– se a aplicação usa a função vTaskDelete(),

– Então a função Idle Hook sempre deverá retornar.

void vApplicationIdleHook( void )

{

++u64IdleTicksCnt;

}

Page 43: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

Gerenciamento de Memória

• O FreeRTOS precisa alocar memória dinamicamente toda

vez que cria uma tarefa, um queue ou um semáforo.

• Quando o kernel precisa alocar memória, em vez de

chamar malloc() diretamente, o kernel chama

pvPortMalloc().

• Da mesma forma, para liberar memória, em vez de chamar

a função free(), o kernel chamará a função vPortFree().

Page 44: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

Alocação

• O FreeRTOS fornece 4 diferentes implementações para

alocação de memória:

• heap_1.c: apenas aloca memória.

• heap_2.c: aloca e desaloca memória, mas não trata fragmentação.

• heap_3.c: usa a implementação padrão de malloc() e free() da

biblioteca C.

• heap_4.c: disponível a partir da versão 7.2.0 do FreeRTOS. Aloca e

desaloca memória, trata fragmentação e é mais eficiente que a maioria

das implementações da biblioteca C padrão.

Page 45: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

Malloc Failed Hook Function

• Os esquemas de alocação de memória implementados por

heap1.c, heap2.c, heap3.c e heap4 podem, opcionalmente,

incluir a função Malloc Failed Hook Function que pode ser

configurada para ser chamado se pvPortMalloc() retornar

NULL.

• Definir a função Malloc Failed Hook Function ajudará a

identificar os problemas causados pela falta de memória no

heap - especialmente quando falha uma chamada para

pvPortMalloc() dentro de uma função da aplicação.

Page 46: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

Malloc Failed Hook Function

• A Malloc Failed Hook Function será chamada apenas se

configUSEMALLOCFAILEDHOOK estiver definida como 1

em FreeRTOSConfig.h.

• Quando isso é definido, a aplicação deve implementar o

método com a seguinte assinatura:

void vApplicationMallocFailedHook( void );

Page 47: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

Stack

• Região de memória onde são salvos as variáveis locais,

registradores e parâmetros nas chamadas de função.

• Na criação de uma tarefa, um stack de uso particular desta

tarefa, também é definido.

• Um mau dimensionamento do stack pode levar uma tarefa

a ultrapassar este espaço alocado (stack overflow).

Page 48: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

Stack Overflow Hook

• Dois mecanismos opcionais podem monitorar o stack das

tarefas em tempo de execução.

• O kernel irá monitorar o stack das tarefas, caso identifique

stack overflow, ele executará uma função de callback (stack

overflow hook).

• Tem como desvantagem o aumento do tempo na troca de

contexto.

Page 49: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

Stack Overflow Hook

• Para ambos os métodos, a implementação da função de

callback de stack overflow é a seguinte:

void vApplicationStackOverflowHook

(xTaskHandle *pxTask, signed char *pcTaskName);

• Deve ser usada para:

– identificar e corrigir problemas de stack durante o desenvolvimento

da aplicação.

– Simplificar o debugging de problemas com o stack.

• Não existe nenhum jeito fácil de se recuperar de um stack

overflow.

Page 50: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

MÉTODO 1

• É selecionado quando configuramos no arquivo FreeRTOSConfig.h:

configCHECK_FOR_STACK_OVERFLOW com 1.

• Após a troca de contexto de uma tarefa, o kernel verifica o stack pointer do stack associada a esta tarefa. Caso esteja fora dos limites será chamada a função de stack overflow hook.

• A desvantagem é que pode-se perder alguns stack overflows, já que apenas verifica-se o stack pointer na troca de contexto, ou seja, durante algum momento na execução da tarefa o stack pointer pode ter ultrapassado os limites do stack.

Stack Overflow Hook

Page 51: Queues and Hook Functions

ESCOLA POLITÉCNICA DE PERNAMBUCO – UNIVERSIDADE DE PERNAMBUCO

SISTEMAS OPERACIONAIS

Stack Overflow Hook MÉTODO 2

• É selecionado quando configuramos no arquivo FreeRTOSConfig.h:

configCHECK_FOR_STACK_OVERFLOW com 2.

• Acrescenta mais uma checagem ao método 1.

• O stack é preenchido com um padrão conhecido, que terá seus últimos

20 bytes verificados. Caso tenham sido sobrescrito, a função de stack

overflow hook será chamada.

• Tem a desvantagem de ser mais lento do que o método 1 , em

contrapartida garante quase que 100% de acerto.