Baixe o app para aproveitar ainda mais
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.
Compartilhar