Buscar

Sistemas Embarcados pdf 02

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 17 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 17 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 17 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

SISTEMAS EMBARCADOS 
AULA 2 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Prof. Rafael Vilas Boas Wiecheteck
 
 
CONVERSA INICIAL 
 Os sistemas embarcados mais atuais são dispositivos com grande poder 
de processamento e, portanto, possuem a capacidade de processar diversas 
tarefas ao mesmo tempo, bem como suportar diversos periféricos. 
 Para auxiliar o desenvolvedor no gerenciamento de todas essas tarefas e 
periféricos, a utilização de um sistema operacional torna-se fundamental, visto 
que, sem ele, o programador precisaria conhecer a fundo todos os dispositivos 
de hardware e programá-los um a um. 
 Nesta aula, será apresentado o Sistema Operacional de Tempo Real, 
também chamado de RTOS – Real Time Operating System, que é um sistema 
operacional específico para atender aos requisitos de aplicações com sistemas 
embarcados. Será feita uma introdução ao sistema com a apresentação dos 
principais conceitos. Na sequência, falaremos sobre o escalonamento de tarefas, 
que consiste no modo como o sistema operacional faz a gerência das diversas 
tarefas que requisitam o processador a todo momento. Por fim, será apresentada 
a sincronização de tarefas, que tem a função de gerenciar a comunicação entre 
processos que precisam acessar e manipular dados entre si. 
TEMA 1 – INTRODUÇÃO A SISTEMAS OPERACIONAIS DE TEMPO REAL 
Um sistema operacional (SO) é um software que, basicamente, é 
responsável pelo gerenciamento de tarefas, memórias e todos os recursos de 
hardware de uma máquina, acessando diretamente os dispositivos e fornecendo 
a base para os demais softwares de usuário. Sem um SO, o desenvolvedor 
necessitaria conhecer todos os detalhes de cada componente de hardware para 
poder desenvolver seu software, além de gerenciá-los. Outra função é a proteção 
contra acessos indevidos que possam comprometer o funcionamento do sistema 
(Tanenbaum, 2009). 
Outra função dos sistemas operacionais é permitir a execução de vários 
programas ao mesmo tempo, gerenciando a alocação ordenada e controlada 
dos periféricos entre os programas que competem por eles (Tanenbaum, 2009). 
A figura 1 mostra onde o SO se encontra dentro do sistema como um todo. 
 
 
 
3 
Figura 1 – Local do sistema operacional 
 
Fonte: Tanenbaum, 2009. 
O desenvolvimento de softwares e as aplicações para sistemas 
embarcados possuem como característica a necessidade de acessar 
diretamente o hardware e, por isso, nem sempre um sistema operacional é 
usado. A principal utilização de um sistema operacional para esses sistemas é 
quando há a necessidade de executar mais de uma tarefa ao mesmo tempo. 
Um sistema operacional aplicado a um sistema embarcado pode variar de 
um pequeno kernel a um sistema operacional de tempo real completo (RTOS – 
Real Time Operating System). 
1.1 Sistema Operacional de Tempo Real (RTOS) 
Esses sistemas operacionais se fazem presentes, normalmente, em 
sistemas embarcados mais complexos, que utilizam periféricos como ethernet, 
wireless e USB, com o objetivo de gerenciar os recursos limitados e atuar em 
situações em que o tempo é o parâmetro essencial no funcionamento de toda a 
aplicação controlada. Ou seja, há restrições de tempo, de modo que o 
processamento e seus resultados devem ser finalizados no momento certo. Este 
momento certo de ser finalizado, ou prazo final para uma tarefa, é chamado de 
deadline. 
 Um RTOS pode ser dividido em função do que acontece quando um 
deadline é perdido. Se uma ação precisa ocorrer em determinado instante de 
tempo e é necessário garantir totalmente que essa ação ocorra no momento 
especificado, dizemos que este é um sistema operacional de tempo real crítico, 
 
 
4 
ou RTOS hard. Como exemplo, consideremos as aplicações onde há risco de 
vida ou processos industriais em que a perda do tempo determinado implica 
grande prejuízo de matéria prima e tempo de produção. 
Por outro lado, os sistemas de tempo real não crítico, ou RTOS soft, são 
utilizados em aplicações onde, embora não desejável, o descumprimento do 
deadline não causará uma falha crítica. A figura 2 apresenta alguns exemplos de 
aplicação que vão dos sistemas sem tempo real ao tempo real crítico. 
Figura 2 – Exemplos de aplicações dos sistemas operacionais 
 
Fonte: Barr, 2009. 
Portanto, para os sistemas de tempo real, mais importante que a 
velocidade de processamento é o atendimento ao deadline, que pode variar de 
alguns milissegundos até horas. Ou seja, o sistema deve ser previsível. 
1.2 Tarefas e threads 
Uma tarefa é um conjunto de instruções executadas em sequência, e que, 
quando criada, recebe um conjunto de registradores e uma área de pilha (stack) 
específica. 
 As threads são operações de uma mesma tarefa executadas 
simultaneamente que compartilham o processador do mesmo modo que as 
tarefas. As threads também possuem seus conjuntos de registradores, porém 
compartilham o mesmo espaço de endereçamento, visto que fazem parte de 
uma mesma tarefa. 
Portanto, sistemas multitarefa são capazes de executar mais de uma 
tarefa ao mesmo tempo, enquanto o multi-thread executa mais de uma parte da 
mesma tarefa ao mesmo tempo. 
Enquanto no processamento multi-thread as informações entre threads 
podem ser trocadas com variáveis comuns, na multitarefa há um aumento na 
complexidade do sistema e na quantidade de recursos, pois, neste caso, são 
necessários recursos mais sofisticados, como semáforos, mensagens e filas. 
 
 
5 
1.3 Núcleo preemptivo e não preemptivo 
Em sistemas operacionais, a preemptividade é a interrupção temporária 
de uma tarefa para realizar outra atividade, com posterior retorno à tarefa 
paralisada no ponto em que foi interrompida para finalizar sua execução. A figura 
3 apresenta um exemplo de preempção de tarefas. 
Figura 3 – Exemplo de preempção de tarefas 
 
Em um núcleo preemptivo, o tempo de resposta do sistema para 
determinado evento de maior prioridade é mais importante, portanto, o sistema 
paralisa um processo em favor de outro, isto é, sempre que um processo de 
maior prioridade está apto para ser executado, a CPU é cedida para este 
processo. 
Para as tarefas de maior prioridade, o tempo de execução é 
determinístico, pois sua execução é minimizada, visto que deve ser feita no 
menor tempo possível. Esta é uma importante característica para os sistemas 
operacionais de tempo real, que necessitam gerenciar as interrupções de 
entrada e saída da aplicação. 
Por outro lado, os sistemas não preemptivos são aqueles que executam 
os processos até o fim sem serem interrompidos. Ou seja, para que outra tarefa 
possa ser executada, a que está em execução deve desistir da CPU. Por isso, 
este tipo de sistema também é conhecido como cooperativo. 
Em relação aos eventos assíncronos, estes continuam sendo tratados por 
interrupção, mas só assumem a CPU quando a tarefa atual termina sua 
execução. 
As tarefas em execução podem ter um tempo de resposta menor, visto 
que o processo em execução não pode ser interrompido. Por outro lado, as 
tarefas prontas para serem executadas, que estão aguardando sua vez para 
 
 
6 
assumir a CPU, podem ter um tempo de resposta mais longo. Dessa forma, os 
sistemas não preemptivos não são determinísticos. 
TEMA 2 – CONCEITOS SOBRE SISTEMAS OPERACIONAIS DE TEMPO REAL 
2.1 Bloco de controle de tarefas 
Para controlar as várias tarefas que utilizam o processador, o sistema 
operacional utiliza uma estrutura de dados para representá-las chamada de 
bloco de controle de tarefas (TCB – Task Control Block). O TCB é criado junto 
com a tarefa e é utilizado para manter o estado da tarefa associada a esse bloco 
quando ocorre a preempção. 
 Ao voltar à CPU, depois de cedê-la à tarefa de maior prioridade, é devido 
ao TCB que a tarefa retorna à execução no mesmo ponto em que foi 
interrompida. 
 Em um TCB, normalmente há as seguintes informações: 
 prioridade; 
 localização e tamanho da memória; estado relativo ao processador (pronto, executando, suspenso etc.); 
 contexto da execução; 
 nome da tarefa. 
O bloco de controle de tarefas (TCB) possui os seguintes campos em sua 
estrutura: 
 Name: nome atribuído à tarefa para identificá-la durante a execução do 
sistema operacional. 
 StackPointer: ponteiro para o topo da pilha da tarefa. 
 StackInit: ponteiro para o último local da pilha, onde é seguro realizar uma 
instrução de retorno de interrupção para a tarefa. É o contexto mínimo 
para a manutenção do estado da tarefa. 
 TimeToWait: utilizado quando a tarefa precisa ser atrasada da marca de 
tempo ou quando é necessário definir o timeout de um evento pendente; 
 State: estado atual da tarefa – executando, pronto para execução, 
suspenso. 
 SuspendedType: tipo de serviço que suspende a tarefa, por exemplo, 
semáforo, espera de mensagens, eventos etc. 
 
 
7 
 Priority: prioridade da tarefa. Também é definida a política de valores para 
as prioridades. 
2.2 Marca de tempo (timer tick) 
A marca de tempo, ou timer tick, é um tipo especial de interrupção que 
ocorre regularmente e cadencia a operação do sistema operacional. Esse 
período constante é sinalizado por uma interrupção de estouro de tempo. 
Normalmente, os tempos do timer tick estão entre 1 e 200ms. 
 É por meio do timer tick que o sistema operacional pode gerenciar o 
timeout das tarefas suspensas que estão aguardando liberação para continuar 
suas execuções. Essa marca de tempo também é utilizada para gerenciar o 
atraso das tarefas de baixa prioridade para atender ao escalonamento de 
processos sem perder os deadlines associados. 
2.3 Inversão de prioridade 
 A inversão de prioridade é um problema comum em sistemas de tempo 
real e está associada ao compartilhamento de recursos. 
 Como exemplo, considere três tarefas, sendo a tarefa T1 de baixa 
prioridade, a T2 de média prioridade e a T3 de alta prioridade. A tarefa T1 adquire 
o acesso de utilização a determinado recurso e começa a utilizá-lo. Após um 
tempo, a tarefa T3, de maior prioridade, assume o processador e inicia sua 
execução, requisitando, em seguida, o mesmo recurso que está com a tarefa T1. 
 Neste caso, como o recurso está bloqueado para a tarefa T1, esta recebe 
novamente a CPU para que possa terminar de utilizar o recurso e só então liberá-
lo. Entretanto, antes que a T1 termine de usar o recurso bloqueado, a tarefa T2 
(de prioridade média) assume o processador e executa suas instruções, 
deixando a T1 bloqueada novamente. Assim que a T2 liberar o processador, a 
T1 o recebe novamente e o executa até finalizar a utilização do recurso, quando, 
finalmente, a tarefa T3 receberá o recurso para executar as suas instruções. A 
figura 4 apresenta o cenário descrito. 
 
 
 
8 
Figura 4 – Exemplo de inversão de prioridade 
 
 Entretanto, o efeito da inversão de prioridade pode ser reduzido com o 
aumento de prioridade da tarefa que acessar um recurso compartilhado por 
diversas outras tarefas. Esse aumento de prioridade é dado temporariamente, 
voltando à prioridade original ao liberar o recurso compartilhado. 
 Por outro lado, a alteração dinâmica de prioridade pode causar um 
problema de desperdício de tempo, pois o tempo de processamento da alteração 
de prioridade ocorre mesmo no caso de não haver outras tarefas que solicitem 
o compartilhamento de recursos. A alteração automática de prioridade pelo 
sistema operacional é chamada de herança de prioridade. 
 Outra solução para evitar a inversão de prioridade é criar uma tarefa para 
fazer o gerenciamento do recurso, ou seja, cada processo que quiser acessar o 
recurso precisa solicitar um pedido de acesso para a tarefa de gerência. 
2.4 Seção crítica e exclusão mútua 
 O compartilhamento de dados é a forma mais fácil de as tarefas se 
comunicarem. No entanto, é preciso garantir que cada tarefa acesse os dados 
de forma exclusiva para evitar que eles sejam corrompidos. O recurso ou a 
região de código que, em sua execução, não pode sofrer interrupção de outros 
processos é chamada de seção crítica. 
 A forma mais simples e fácil de permitir o direito exclusivo a um recurso 
ou código é desabilitando as interrupções antes da sua execução e habilitá-las 
novamente assim que a execução terminar. Entretanto, essa técnica apresenta 
um problema, principalmente para sistemas de tempo real que utilizam as 
interrupções para atender às requisições dos vários recursos utilizados, pois 
 
 
9 
afeta a resposta do sistema a eventos assíncronos. Por isso, recomenda-se sua 
utilização somente em operações rápidas. 
 Outra forma de trabalhar com a exclusão mútua é realizar o bloqueio do 
escalonador do sistema operacional. A principal diferença para a técnica anterior 
é que as interrupções continuam ocorrendo normalmente, porém, também traz 
um problema principalmente para os sistemas de tempo real, visto que perde o 
controle das deadlines. 
 Portanto, o método mais recomendado é o uso dos semáforos, o qual será 
descrito mais adiante. 
2.5 Deadlock e overload 
 O deadlock, nos sistemas operacionais, é uma situação em que ocorre 
um impasse entre dois ou mais processos e todos ficam impossibilitados de 
continuar suas execuções (ficam bloqueados). Por exemplo, a tarefa A tem 
acesso exclusivo ao recurso R1 e a tarefa B tem acesso exclusivo ao recurso 
R2. Se, em determinado momento, a tarefa A precisar de acesso ao recurso R2 
e a tarefa B precisar de acesso ao recurso R1, nada será executado e as duas 
tarefas ficarão paralisadas indefinidamente. 
 Há alguns métodos que podem ser utilizados para evitar o deadlock: 
 Adquirir todos os recursos necessários antes de executar as tarefas. 
 As tarefas que compartilham os recursos devem adquiri-los sempre na 
mesma ordem e liberá-los na ordem inversa. 
 Permitir a utilização de timeout na aquisição do recurso, fazendo com que 
o deadlock possa ser desfeito. 
 No caso da utilização do timeout, se o recurso não estiver disponível 
dentro de determinado tempo, a tarefa volta para a lista “pronto para a execução” 
do escalonador de tarefas e gera um erro de timeout. 
 Os deadlocks são mais comuns em sistemas multitarefa de grande escala 
e normalmente não ocorrem em sistemas embarcados. 
 Outra situação possível é o overload (sobrecarga), que é quando o 
processador e o sistema operacional não conseguem executar as tarefas sem 
perda dos prazos. Quando isso ocorre, as tarefas de menor prioridade são as 
mais prejudicadas. 
 
 
10 
 Existem poucas soluções para resolver o problema de overload, e a 
solução mais fácil é a substituição do processador por um mais eficiente. 
TEMA 3 – ESCALONAMENTO DE TAREFAS (SCHEDULER – AGENDADOR DE 
TAREFAS) 
Como foi visto anteriormente, a multitarefa é a capacidade de executar 
vários programas ao mesmo tempo. Porém, na verdade, as execuções não são 
realizadas exatamente ao mesmo tempo. Um processador executa uma tarefa 
por vez, e o que parece uma execução simultânea, na verdade, é um 
escalonamento de processos, onde há a alternância entre as tarefas que ocupam 
a CPU por determinado período de tempo. 
 O sistema operacional é o responsável por decidir qual tarefa utilizará o 
processador em determinado momento. Para que essa atividade possa ser 
realizada, o SO utiliza-se do Scheduler (Agendador de tarefas ou escalonador 
de tarefas) para tomar tais decisões. 
 Na decisão de qual tarefa deve assumir a CPU em dado momento, é 
necessário a utilização de algoritmos de agendamento. Esses algoritmos são 
escolhidos em função da aplicação do sistema e dos objetivos a serem 
alcançados. Na sequência, veremos alguns algoritmos de agendamento: 
 FIFO – Primeiro que entra, primeiro que sai (First-In-First-Out) 
 Este agendamento executa as tarefas conforme forem entrando na fila de 
execução. Também é chamado de multitarefa colaborativa, pois o processo é 
executado até o seu término para que sóentão a próxima tarefa possa ser 
iniciada. A figura 5 apresenta um exemplo desse escalonamento. 
Figura 5 – Exemplo de escalonamento FIFO 
 
 
 
11 
Menor tarefa primeiro (Shortest job first) 
 Este algoritmo permite que a tarefa seja executada até sua finalização ou 
autossuspensão. Ao terminar sua execução, o sistema operacional verificará, na 
lista de espera, qual é o processo que demandará o menor tempo de execução 
entre todos os disponíveis, e este é o que terá a preferência e executará seu 
código até o final. 
Prioridade (Priority) 
 O algoritmo por prioridade é comumente utilizado em sistemas de tempo 
real. Cada tarefa criada recebe um nível de prioridade, usada para definir o 
próximo processo da fila a ser executado. 
 O agendamento por prioridade pode ser utilizado tanto em sistemas 
preemptivos quanto em sistemas não preemptivos. No primeiro caso, a tarefa 
pode ser interrompida para que outra tarefa, de maior prioridade, possa assumir 
a CPU. 
Round Robin 
 Neste modelo de agendamento, cada tarefa executa seu código por um 
período de tempo pré-determinado, chamado de quantum. Ao término deste 
tempo, o sistema operacional retira o processo atual da CPU e libera a execução 
da próxima tarefa da fila. O quantum definido é o mesmo para todas as tarefas. 
 A primeira tarefa só volta à sua execução após todas as tarefas que estão 
na fila utilizarem seus períodos de tempo. 
 Para os sistemas de tempo real, também há a necessidade de considerar 
as deadlines. O propósito dos algoritmos de tempo real, portanto, é garantir as 
restrições de tempo crítico (deadline e tempo de resposta), e as decisões são 
tomadas em favor das restrições mais críticas. A seguir são citados alguns 
algoritmos de tempo real: 
Menor deadline primeiro (Earliest deadline first) 
Com este algoritmo, o sistema operacional monitora a deadline de todas 
as tarefas que estão na fila de execução. Antes de carregar uma nova tarefa, o 
agendador verifica na lista qual delas possui a deadline mais curta. 
 
 
12 
Este é um agendador baseado em prioridade, com um controle adicional, 
que calcula a deadline de todas as tarefas da fila a cada período padrão (timer 
tick), de forma a reajustar as prioridades. 
Tarefa com menos tempo sobrando primeiro (Minimal Laxity First) 
Neste caso, a deadline e o tempo que cada tarefa precisa para terminar 
sua execução são monitorados. O agendador selecionará a tarefa que tem 
menos tempo sobrando até o deadline. 
Reserva de recursos (Resource reservation) 
Quando a tarefa é criada, requisitos como deadline, uso de processador, 
dentre outros recursos relevantes são considerados. A nova tarefa só é admitida 
se o sistema puder garantir que os recursos solicitados podem ser 
disponibilizados sem que provoquem prejuízo às outras tarefas. 
TEMA 4 – SINCRONIZAÇÃO DE TAREFAS 
 Quando falamos sobre escalonamento de tarefas, pode parecer que elas 
trabalham de forma independente umas das outras, porém, nem sempre é isso 
que acontece. 
 Em muitos casos, várias tarefas trabalham juntas para resolver um 
problema maior, por isso devem se comunicar entre si para sincronizar suas 
atividades. 
 Os sistemas operacionais possuem vários mecanismos para realizar essa 
sincronização de tarefas, e cada mecanismo é útil para determinadas situações. 
Na sequência, veremos alguns desses mecanismos. 
4.1 Mutex (abreviação para Mutual Exclusion – Exclusão Mútua) 
 A exclusão mútua (MUTEX) é uma das formas mais simples de 
sincronização e é utilizada para garantir o acesso exclusivo às variáveis ou 
hardwares compartilhados por determinada tarefa. É uma variável que pode ser 
representada por apenas 1 bit, ou seja, pode ter somente dois estados: 
bloqueado e desbloqueado. 
 Quando o processo precisa ter acesso a uma região crítica, o mutex torna-
se bloqueado. Se outro processo precisar do acesso à mesma região, ele não 
 
 
13 
conseguirá e ficará bloqueado até que a tarefa anterior termine sua execução e 
altere o mutex para desbloqueado, fazendo com que a tarefa que estava parada 
assuma a região crítica e a trave (mutex bloqueada) para que possa processar 
suas instruções. 
 No caso de múltiplos processos ficarem bloqueados aguardando a 
liberação da região crítica, o sistema operacional escolherá aleatoriamente um 
dos processos para assumir a região e bloqueá-la. 
 Uma tarefa pode mudar o estado do mutex sem o risco de ocorrer uma 
troca de contexto no meio da modificação, pois o sistema operacional possui um 
mecanismo para proteger a região crítica nesses casos. Os principais 
mecanismos para evitar este tipo de problema são: 
 Protocolo de herança de prioridade: quando uma tarefa de baixa 
prioridade assumo o mutex, sua prioridade é elevada ao nível da tarefa de 
maior prioridade que está na fila da exclusão mútua. Ao liberar o mutex, a 
tarefa volta para sua prioridade original. 
 Protocolo de prioridade teto: ao receber o mutex, a prioridade da tarefa 
é alterada para a mais alta possível. Ao liberar o mutex, a tarefa recebe 
de volta sua prioridade original. 
4.2 Semáforos 
 Um semáforo é uma estrutura de dados utilizada para controlar o acesso 
a recursos compartilhados e permitir a sincronização de atividades. 
 Basicamente, se o recurso compartilhado está em uso, o semáforo estará 
sinalizado para a tarefa corrente, e as demais tarefas ficam suspensas por esse 
período. 
 Os semáforos podem ser de dois tipos: binários ou contadores. O 
semáforo binário tem somente dois valores, sendo eles 0 e 1. Este tipo de 
semáforo é utilizado quando somente uma tarefa por vez pode acessar o 
recurso. Por exemplo, quando uma tarefa está utilizando a comunicação serial, 
uma segunda tarefa fica bloqueada aguardando sua vez de enviar a informação. 
Isso evita que os dados sejam corrompidos pelo embaralhamento das 
informações de ambas as tarefas. 
 Por outro lado, os semáforos contadores podem ter diversos valores 
(inteiros e não negativos). Este tipo de semáforo é utilizado quando mais de uma 
 
 
14 
tarefa pode acessar o mesmo recurso ao mesmo tempo, de modo que a 
quantidade de tarefas simultâneas depende do tamanho do contador. 
 Independentemente do tipo de semáforo a ser utilizado, há três modos de 
operação: inicializar, esperar e sinalizar. 
 No processo de inicialização, o valor inicial do semáforo é atribuído e a 
lista de espera das tarefas é zerada, pois deve começar vazia. 
 Na solicitação do semáforo, a tarefa verifica se ele está disponível, e, em 
caso afirmativo, quando o semáforo é maior que zero, ele é decrementado e a 
tarefa continua. Se o semáforo não estiver disponível, ou seja, for igual a zero, a 
tarefa é suspensa e colocada na lista de espera do semáforo. 
 A espera pelo semáforo pode ser de três formas: 
 Espera para sempre: a tarefa aguarda indefinidamente o semáforo ser 
liberado, independentemente do tempo de espera. 
 Espera com timeout: a tarefa fica bloqueada até o semáforo ficar 
disponível ou ocorrer um timeout após um período pré-determinado. 
Quando isso ocorre, a tarefa é retirada da fila de espera e uma sinalização 
de erro acontece. Esta espera é utilizada em sistemas de tempo real, onde 
a característica determinística é importante. 
 Não espera: a tarefa não entra em modo de espera e volta para a fila do 
escalonador de tarefas. 
 Após a liberação do semáforo, pode ocorrer uma das duas situações: 
 Se houver tarefa na fila, a próxima assume e o semáforo continua igual a 
zero. 
 Se não houver tarefa na fila, o semáforo é incrementado. 
 Em sistemas embarcados, os semáforos são utilizados no 
compartilhamento de dispositivos de entrada e saída, por exemplo, no acesso à 
comunicação serial ou no uso de LCD. 
TEMA 5 – MENSAGENS 
 Em várias situações, somente a sincronização de tarefas não é suficiente 
para atender à necessidade de uma aplicação, sendo preciso também a troca de 
mensagens contendo informações.15 
5.1 Caixas de mensagens (Message mailboxes) 
 A caixa de mensagem é um serviço provido pelo sistema operacional que 
tem a função de enviar mensagens entre tarefas e também entre tarefas e 
recursos. Basicamente, ela é um ponteiro de tamanho variável geralmente 
utilizada para a sincronização de tarefas. 
 Cada caixa de mensagens tem uma lista de espera para os casos em que 
mais de uma tarefa queira receber determinada mensagem. Para isso, a tarefa 
que quer receber uma mensagem é suspensa e colocada na lista de espera até 
a mensagem ser recebida. Essa lista pode ser gerenciada de duas formas: por 
meio da ordem de chegada ou por meio de prioridades. 
 Para esta técnica também é possível a utilização de timeout, ou seja, no 
caso de a mensagem não chegar dentro do período especificado, ela é colocada 
na lista de tarefas prontas e é enviado um código de erro para tratamento do 
caso. 
5.2 Filas de mensagens (Message queues) 
 A fila de mensagens é um buffer por meio do qual tarefas e rotinas de 
interrupção enviam e recebem mensagens para comunicar e sincronizar dados. 
 Essa fila armazena as mensagens enviadas até que a tarefa receptora 
esteja apta a recebê-las. Ela opera como um vetor de caixas de mensagens. A 
técnica permite que as tarefas transmissora e receptora se comuniquem sem 
que precisem estar conectadas simultaneamente. 
 Essas estruturas operam como buffers circulares e, portanto, necessitam 
conter informações, como: tamanho da fila, ponteiro de entrada de dados, 
ponteiro de saída de dados, entre outras. 
 A leitura da fila normalmente é feita pelo modo FIFO (First In First Out – 
Primeiro que entra é o primeiro que sai) e a quantidade de mensagens na fila é 
dada pela diferença de posição entre o ponteiro de entrada de dados e o ponteiro 
de saída de dados. 
 Um problema que pode ocorrer neste tipo de estrutura é o buffer underrun, 
quando as tarefas receptoras não conseguem processar todas as informações 
da fila antes que ela encha. Quando isso acontece, as mensagens são 
sobrescritas. Entretanto, o buffer underrun pode ser tratado com o aumento do 
 
 
16 
tamanho da fila ou a melhora na velocidade de tratamento dos dados que estão 
na fila. 
 Da mesma forma que nas caixas de mensagens e nos semáforos, utiliza-
se uma lista de espera associada a cada fila de mensagens para o caso de mais 
de uma tarefa desejar receber as mensagens contidas nessas filas. 
 As filas de mensagens podem ser utilizadas para enviar e receber uma 
variedade de dados, como temperatura de sensores, mensagens de textos para 
display de LCD, pacote de dados para ser enviado através de uma rede etc. 
 Há duas formas de realizar a leitura dessas mensagens, sendo elas: a 
leitura destrutiva, em que a tarefa remove permanentemente a mensagem da 
lista após realizar a sua leitura com sucesso, e a leitura não destrutiva, em que 
a tarefa copia a mensagem da fila sem removê-la. 
FINALIZANDO 
 Nesta aula, pudemos verificar a importância de um sistema operacional 
em aplicações com sistemas embarcados, principalmente quando se utiliza 
processadores de maior capacidade de processamento, como é o caso das 
arquiteturas de 32 e 64 bits. Vimos também que os sistemas embarcados 
normalmente utilizam sistemas operacionais de tempo real devido à sua 
característica determinística. 
 Foram apresentados os principais conceitos sobre o assunto, como 
tarefas e threads, núcleos preemptivos e não preemptivos, seção crítica, 
exclusão mútua entre outros conceitos. Também estudamos o escalonamento 
de tarefas, sua função e algumas técnicas disponíveis de implementação. Para 
finalizar, apresentamos a sincronização de tarefas com as técnicas mutex, de 
semáforos e mensagens. 
 
 
17 
REFERÊNCIAS 
BARR, M.; MASSA, A. Programming embedded systems. 2. ed. O’ Reilly 
Media, 2009. 
SILBERSCHATZ, A. Fundamentos de sistemas operacionais. 9. ed. Rio de 
Janeiro: LTC, 2015. 
TANENBAUM, A. S. Sistemas operacionais modernos. 3. ed. São Paulo: 
Pearson Prentice Hall, 2009.

Continue navegando