Você está na página 1de 8

Componente Curricular: ENGD33 - Programação em Tempo Real para Sistemas Embarcados

Professor: Jés de Jesus Fiais Cerqueira


Aluno: Cristian Araujo
Lista de Exercício No 1 Exercício

1. Defina o que é um sistema eletrônico embutido (Embedded Systems).


R - O IEEE (Instituto de Engenharia Elétrica e Eletrônica dos Estados Unidos) define "embedded"
como todo e qualquer circuito eletrônico que faça parte de um sistema mais amplo que ele controla,
monitora ou dá assistência.

2. Comente sobre os pontos positivos e os pontos negativos em construir programas em


Assembly.
R – Como vantagens nós temos: tamanho dos programas que são menores, permitir criar ações de
alta complexidade, impossíveis ou difíceis de se realizar em linguagens de Alto Nível, o
conhecimento em Assembly possibilita a programação nos outros tipos de linguagem, é uma
linguagem recomendável onde o tempo é um fator crítico como por exemplo: medições de tempo
que exigem boa performance e por fim se torna de fácil compreensão com algum conhecimento de
conceitos de hardware e seus dialetos.

Já desvantagens podemos citar: programar em Assembly consome muito tempo para o programador,
é uma linguagem portável apenas dentro de uma família de processadores, como é uma linguagem
especifica para processares de cada máquina, é necessário desenvolver um programa para cada
máquina, não existem rotinas pré-definidas, o programador deverá desenvolver suas próprias
rotinas, a linguagem Assembly apresenta um número muito reduzido de instruções, do tipo
operações de movimentação de dados em memória, para registros e para memórias, e operações
lógicas e aritméticas bem simples. Estas instruções são de baixa expressividade, isto é, elas são de
baixo nível. O programador deve programar num nível de detalhamento muito maior para fazer a
mesma coisa que em um programa escrito em linguagem de alto nível e por fim como o
programador utiliza diretamente os recursos do processador e memória, ele deve conhecer muito
bem a máquina onde ele está programando.

3. Quais são algumas das diferentes noções sobre tempo existentes na literatura de sistemas
computacionais?
R - Tempo na Execução, considerado como um recurso a ser gasto durante a execução de um
programa como outros recursos físicos ou lógicos e o Tempo na Programação visto como uma
grandeza a ser manipulada pelo programa como outros tipos de variáveis;

Tempo Lógico é definido a partir de relações de precedência entre eventos, o que permite o
estabelecimento de ordens causais sobre um conjunto de eventos e o Tempo Físico que é um tempo
métrico que permite expressar quantitativamente a distância entre eventos e estabelecer ordens
totais entre eventos.
Tempo Denso que segue a natureza uniforme e continua do tempo físico e é isomorfo ao conjunto
dos reais e o Tempo Discreto, uma simplificação geralmente aceita ao anterior, porém isomorfo em
relação ao conjunto dos naturais positivos;
Tempo Global, noção abstrata que permite ao usuário de um sistema distribuído ter acesso a um
instante de referência único em qualquer parte do sistema e o Tempo Local observável localmente
nos diferentes nós de um sistema distribuído; tanto o tempo global quanto o tempo local podem ser
físicos ou lógicos.
Tempo Absoluto com referência estabelecida a partir de um evento global e o Tempo Relativo tendo
como referência um evento local; o tempo absoluto é sempre global, enquanto o relativo é sempre
local.

4. Defina: (i) sistema computacional transformacional; (ii) sistema computacional reativo; (iii)
sistema computacional em tempo real.
R - Sistemas reativos – Segundo o qual um programa pode executar indefinidamente uma sequência
de interações, por exemplo operando sobre um fluxo de dados.

Sistemas transformacionais – Segundo o qual um programa inicia e termina, transformando dados


de entrada em resultados ou dados de saída.

Sistemas de tempo real - Modelo reativo em que o programa tem de se manter sincronizado com o
fluxo de dados, o qual impõe restrições temporais à execução do programa.
5. Explique como a integridade do processamento (correctness) e o cronograma de execução
do processamento estão relacionados com sistema computacional em tempo real?
R - Um Sistema de Tempo Real é um sistema computacional que deve reagir a estímulos oriundos
do seu ambiente em prazos específicos. O atendimento desses prazos resulta em requisitos de
natureza temporal sobre o comportamento desses sistemas. Em consequência, em cada reação, o
sistema de tempo real deve entregar um resultado correto dentro de um prazo específico, sob pena
de ocorrer uma falha temporal. O comportamento correto de um sistema de tempo real, portanto,
não depende só da integridade dos resultados obtidos “correctness” mas também dos valores de
tempo em que são produzidos “timeliness”.
6. Quando um sistema computacional em tempo real é dito previsível (predictable)? Quais as
hipóteses comportamentais para que isto seja alcançado?
R - Hipótese de carga: ela determina o que corresponde a carga computacional de pico (carga
máxima) gerada pelo ambiente em um intervalo mínimo de tempo, entre cada reação do sistema de
tempo real.

Hipótese de falhas: ela descreve os tipos e frequências de falhas com os quais o sistema deve
conviver em tempo de execução, continuando a atender os seus requisitos funcionais e temporais.

7. Como sistemas computacionais em tempo real podem ser classificados?


R - Os STR são classificados, basicamente, em: Críticos (hard RTS - também chamados de rígidos)
e Não-Críticos (soft RTS - também chamados de moderados).

O STR Crítico é aquele que tem um comportamento determinístico, ou seja, o prazo para execução
de uma tarefa (deadline) não pode ser violado.

O STR Não-Crítico é aquele que também tem o tempo como parâmetro fundamental, mas uma falha
é aceitável. O sistema que funciona em um leitor de DVD não é crítico, pois o não cumprimento de
uma tarefa em resposta e um evento em um determinado intervalo de tempo não provoca danos
irreversíveis. Ao contrário dos sistemas críticos, esses sistemas normalmente trabalham com um
grande volume de dados.
8. Quais são as restrições temporais para o processamento de uma tarefa?
R - Tempo de computação ("Computation Time"): O tempo de computação de uma tarefa é o tempo
necessário para a execução completa da tarefa.
Tempo de início ("Start Time"): Esse tempo corresponde ao instante de início do processamento da
tarefa em uma ativação.
Tempo de término ("Completion Time"): É o instante de tempo em que se completa a execução da
tarefa na ativação.
Tempo de chegada ("Arrival Time"): O tempo de chegada de uma tarefa é o instante em que o
escalonador toma conhecimento de uma ativação dessa tarefa. Em tarefas periódicas, o tempo de
chegada coincide sempre com o início do período da ativação. As tarefas aperiódicas apresentam o
tempo de chega da coincidindo com o tempo da requisição do processamento aperiódico.
Tempo de liberação ("Release Time"): O tempo de liberação de uma tarefa coincide com o instante
de sua inclusão na fila de Pronto (fila de tarefas prontas) para executar

9. O que é um escalonador de tarefas (scheduler)?


R - Um Escalonador de Tarefas é um subsistema do Sistema Operacional responsável por decidir o
momento em que cada processo obterá a CPU. É utilizado algoritmos de escalonamento que
estabelecem a lógica de tal decisão. Nesse momento de decidir qual escalonador será utilizado no
sistema operacional, cabe avaliar o cenário que o sistema será utilizado.

10. O que são os escalonadores preemptivos e os não preemptivos?


R - O Escalonamento Não Preemptivo ocorre apenas em situações que praticamente obrigam que
uma decisão seja tomada. Esse cenário tem as seguintes condições: criação de um novo processo,
término de um processo, processo ser bloqueado, após alguma interrupção.
O Escalonamento Preemptivo escolhe um processo e lhe concede a CPU durante certo tempo.
Findado esse tempo, a CPU é de outro processo. Esse cenário tem as seguintes condições: Criação
de um novo processo; Término de um processo; Processo ser bloqueado; Após alguma interrupção;
Periodicamente, a cada k intervalos de relógio.

11. Quais as premissas para a garantia de escalonamento em tempo de projeto?


R - A garantia em tempo de projeto é conseguida a partir de um conjunto de premissas: a carga
computacional do sistema é conhecida em tempo de projeto (carga estática) e que no sistema existe
uma reserva de recursos suficientes para a execução das tarefas, atendendo suas restrições
temporais, na condição de pior caso.

12. Como se determina a taxa de ocupação de uma tarefa?


R - A utilização de uma tarefa Tique serve como uma medida da ocupação do processador pela
mesma, é dado por: Ui= Ci/Pi se a tarefa Ti é periódica, ou Ui= Ci/ Mini se a tarefa Ti é esporádica,
onde Ci, Pi e Mini são respectivamente o tempo máximo de computação, o período e o intervalo
mínimo entre requisições da tarefa Ti.

13. Qual é a política de escalonamento do método conhecido como taxa monotônica (Rate
Monotonic) e quais são as suas premissas? Qual a condição de suficiência para a sua
escalonabilidade?
R - O escalonamento Taxa Monotônica “Rate Monotonic” produz escalas em tempo de execução
através de escalonadores preemptivos, dirigidos a prioridades. É um esquema de prioridade fixa, o
que define então, o RM como escalonamento estático e on-line.

As premissas do RM que facilitam as análises de escalonabilidade, definem um modelo de tarefas


bastante simples: as tarefas são periódicas e independentes, o "deadline" de cada tarefa coincide
com o seu período (Di=Pi), o tempo de computação (Ci) de cada tarefa é conhecido e constante
(“WorstCase Computation Time”), o tempo de chaveamento entre tarefas é assumido como nulo.
A análise de escalonabilidade no RM, feita em tempo de projeto, é baseada no cálculo da utilização.
Para que n tarefas tenham o atendimento de suas restrições temporais quando escalonadas pelo RM,
deve ser satisfeito o teste abaixo que define uma condição suficiente:

14. Indique as prioridades para as tarefas e verifique se o sistema apresentado na tabela 1 é


escalonável por taxa monotônica. Apresente o diagrama de Gantt.
Tarefas Período Custo Computacional Prioridade Taxa de Utilização
Tarefa A 100 20
Tarefa B 50 15
Tarefa C 200 50
Tarefa D 75 10

15. Qual é a política de escalonamento do método conhecido como prazo de conclusão mais
curto primeiro (Earliest Deadline First) e quais são as suas premissas? Qual a condição de
suficiência e necessidade para a sua escalonabilidade?
R - A política de escalonamento no EDF corresponde a uma atribuição dinâmica de prioridades que
define a ordenação das tarefas segundo os seus "deadlines" absolutos(di). A tarefa mais prioritária é
a que tem o "deadline" di mais próximo do tempo atual. A cada chegada de tarefa a fila de prontos é
reordenada, considerando a nova distribuição de prioridades. A cada ativação de uma tarefa Ti,
seguindo o modelo de tarefas periódicas, um novo valor de "deadline" absoluto é determinado
considerando o número de períodos que antecede a atual ativação (k):dik=kPi.
No EDF, a escalonabilidade é também verificada em tempo de projeto, tomando como base a
utilização do processador. Um conjunto de tarefas periódicas satisfazendo as premissas acima é
escalonável com o EDF se e somente se:

Esse teste é suficiente e necessário na classe de problema definida para o EDF pelas premissas a, b,
c ed. Se qualquer uma dessas premissas é relaxada (por exemplo, assumindo Di≠Pi), a condição
continua a ser necessária porém não é mais suficiente.

16. Verifique se o sistema apresentado na tabela 2 é escalonável por Earliest Deadline First.
Apresente o diagrama de Gantt.

Tarefas Período Custo Computacional Prazo de Conclusão Taxa de Utilização


Tarefa A 100 20 100
Tarefa B 50 15 50
Tarefa C 200 50 200
Tarefa D 75 10 75
17. Qual é a política de escalonamento do método conhecido como prazo de conclusão
monotônico (Deadline Monotonic)?
R - A política do DM define uma atribuição estática de prioridades, baseada nos"deadlines"relativos
das tarefas (Di). As prioridades são atribuídas na ordem inversados valores de seus "deadlines"
relativos.

18. Para o sistema apresentado na tabela 3, indique as prioridades para as tarefas e verifique
se o sistema é escalonável por prazo de conclusão monotônico. Apresente o diagrama de
Gantt.

Tarefas Período Custo Computacional Prazo de Conclusão Prioridade


Tarefa A 100 20 80
Tarefa B 50 15 20
Tarefa C 200 50 190
Tarefa D 75 10 50

19. Descreva o protocolo herança de prioridade para escalonamento em sistemas com


compartilhamento de recursos.

R - O protocolo de herança de prioridade mais simples consiste em aumentar temporariamente a


prioridade do processo Pb que detém o recurso de uso exclusivo R. Caso esse recurso seja
requisitado por um processo de maior prioridade Pa , o processo Pb “herda” temporariamente a
prioridade de Pa , para que possa voltar a executar e liberar o recurso R mais rapidamente. Assim
que liberar o recurso, Pb retorna à sua prioridade anterior.

20. Descreva como funciona o servidor background para o escalonamento de tarefas


aperiódicas.

R – Ele atende requisições aperiódicas quando a fila de prontos não possui tarefas periódicas.
Seguindo as seguintes prioridades: para periódicas, prioridades mais altas, para aperiódicas,
prioridades mais baixas. Como as tarefas aperiódicas sempre possuem a menor prioridade do
sistema só aplicável quando as requisições aperiódicas não são críticas e a carga periódica não é
alta.

21. Defina o que é um threads e indique quais os seus estados funcionais possíveis.

R - Thread é uma forma de um processo dividir a si mesmo em duas ou mais tarefas que podem ser
executadas concorrencialmente. Uma thread pode assumir os seguintes estados:
Unstarted: logo após ser criada (antes do Start());
Running: após ser ativada (Start()) ou após método Resume();
Suspended: após método Suspended();
Stopped: após método Abort().

22. Por que um sistema de tempo real necessita de temporizadores? como eles podem ser
implementados?
R - Tipicamente as aplicações precisam realizar operações que envolvem a passagem do tempo, tais
como: ler a hora com o propósito de atualizar um histórico, realizar determinada ação a cada X
unidades de tempo (ativação periódica), realizar determinada ação depois de Y unidades de tempo a
partir do instante atual, realizar determinada ação a partir do instante absoluto de tempo Z.
Tipicamente o sistema possui pelo menos um temporizador ("timer") implementado em hardware, o
qual é capaz de gerar interrupções com uma dada frequência. Cabe ao SOTR utilizar este
temporizador do hardware para criar a ilusão de múltiplos temporizadores lógicos. A cada
interrupção do temporizador em hardware o SOTR atualiza cada um dos temporizadores lógicos e
executa as operações necessárias.
23. O que é jitter? O que é latência? Qual a diferença entre os dois fenômenos?
R - Todos os sistemas digitais são sincronizados por intermédio de um relógio (clock). Os pulsos do
relógio coordenam o armazenamento e o envio das informações através do meio de comunicação.
Se o relógio do equipamento de origem não estiver sincronizado com o destino, os bits chegarão um
pouco mais cedo ou mais tarde que o esperado. Assim o jitter é um desvio ou deslocamento de
algum aspecto dos pulsos de um sinal digital. O desvio pode ocorrer em termos de amplitude, do
tempo da fase ou extensão do pulso do sinal. Entre as causas do jitter estão a interferência
eletromagnética (EMI) e a interferência com outros sinais (diafonia). O jitter pode ser resolvido
com uma série de sincronizações de relógio complicadas, incluindo sincronizações de hardware e
software ou protocolos.

Em uma rede de computadores, a latência, também conhecida como atraso, representa a expressão
do tempo necessário para um pacote de dados ir de um ponto para outro. Em outras palavras, é a
referência a qualquer atraso ou espera que aumente o tempo de resposta real ou percebido além do
tempo de resposta desejado. Em alguns casos, a latência é medida enviando-se um pacote que é
devolvido ao remetente e o tempo completo desse percurso é considerado como latência.

24. Como se pode construir uma tarefa sobre o sistema operacional FreeRTOS?
R - As tarefas são criadas usando a função de API xTaskCreate() do FreeRTOS.

25. Como se pode criar uma tarefa sobre o sistema operacional FreeRTOS?
R - As tarefas são criadas usando a função de API xTaskCreate() do FreeRTOS.

26. Qual a utilidade da função vTaskStartScheduler() do FreeRTOS?


R - Inicia o processamento do tick do kernel em tempo real. Depois de chamar o kernel tem
controle sobre quais tarefas são executadas e quando. A idle task é criada automaticamente quando
vTaskStartScheduler () é chamado. Se vTaskStartScheduler() for bem-sucedido, a função não
retornará até que uma tarefa em execução chame vTaskEndScheduler(). A função pode falhar e
retornar imediatamente se houver RAM insuficiente disponível para a tarefa inativa a ser criada.

27. Qual o limite máximo de prioridades do FreeRTOS? Como se estabelece a prioridade de


uma tarefa? Ela pode ser alterada durante a execução? Se sim, como?
R - O parâmetro uxPriority da função de API xTaskCreate() atribui uma prioridade inicial para a
tarefa que está sendo criada. Você pode alterar a prioridade depois que o programador é iniciado
usando a função de API vTaskPrioritySet().
O número máximo de prioridades disponíveis é definido pela constante de configuração de tempo
de compilação configMAX_PRIORITIES definida pelo aplicativo em FreeRTOSConfig.h. Valores
numéricos baixos de prioridade indicam tarefas de prioridade baixa, com prioridade 0 sendo a
prioridade mais baixa possível. Portanto, o intervalo de prioridades disponíveis é de 0 a
(configMAX_PRIORITIES - 1).
28. Como configurar a unidade de tempo de processamento (tick interrupt) sobre o
FreeRTOS?
R - Cada vez que a contagem de ticks é incrementada, o kernel em tempo real deve verificar se está
na hora de desbloquear ou ativar uma tarefa. É possível que uma tarefa acordada ou desbloqueada
durante a marcação ISR tenha uma prioridade maior que a da tarefa interrompida. Se este for o
caso, o tick ISR deve retornar para a tarefa recém-acordada / desbloqueada - efetivamente
interrompendo uma tarefa, mas retornando para outra.

29. Como tarefas periódicas são criadas usando o FreeRTOS?

30. Qual a utilidade das funções vTaskSuspend() e vTaskResume() do FreeRTOS?


R - Tarefas no estado “Suspend” não estão disponíveis para agendamento. As tarefas só entrarão ou
sairão do estado suspenso quando forem explicitamente ordenadas a fazê-lo através das chamadas
API vTaskSuspend() e xTaskResume(), respectivamente. Um período de 'timeout' não pode ser
especificado.

31. Qual a utilidade da função vApplicationIdleHook() do FreeRTOS?


R – Uma idle task hook é uma função que é chamada durante cada ciclo da tarefa ociosa. E um dos
passos para criar uma idle hook é definir uma função que tenha como protótipo: void
vApplicationIdleHook( void );

32. Qual a utilidade da função vTaskDelete() do FreeRTOS?


R – É usado para remover uma tarefa do gerenciamento de kernels em tempo real do RTOS. A
tarefa que está sendo excluída será removida de todas as listas prontas, bloqueadas, suspensas e de
eventos.

33. Qual a utilidade da função taskYIELD() do FreeRTOS?


R - Informa ao agendador que um comutador para outra tarefa deve ocorrer agora, em vez de
manter a tarefa em execução no estado Em Execução até o final do período de tempo atual.

34. O que é uma queue sobre o FreeRTOS e como ela funciona? Como pode ser criada e como
pode ser acessada?
R - As filas são os primitivos subjacentes usado por todos os mecanismos de comunicação e
sincronização do FreeRTOS. Uma fila deve ser explicitamente criada antes de poder ser usada. A
função xQueueCreate() é usada para criar uma fila e retorna um xQueueHandle para fazer
referência à fila criada. E temos xQueueSendToBack() que é usado para enviar dados para o fim
(tail) de uma fila, e xQueueSendToFront() é usado para enviar dados para a frente (head) de uma
fila.

35. O que é um semáforo binário e como ele funciona (como é criado e acessado) sobre o
FreeRTOS?
R - Um Semaphore Binário pode ser usado para desbloquear uma tarefa toda vez que uma
determinada interrupção ocorrer, efetivamente sincronizando a tarefa com a interrupção. Isso
permite que a maioria do processamento de eventos de interrupção seja implementada na tarefa
sincronizada. Para criar um semáforo binário, use a função da API vSemaphoreCreateBinary(). O
xSemaphoreTake é usado para "Tomar" um semáforo, ou seja "obter" ou "receber" o semáforo. O
semáforo só pode ser usado se estiver disponível. XsemaphoreGiveFromISR() é normalmente usado
após a tarefa obter o semáforo com o “take”, no fim de seu processamento, para liberar o semáforo
para outras tarefas o utilizarem.

36. Sobre o FreeRTOS, o que é um semáforo contador (counting semaphores) e o que o


diferencia de um semáforo binário?
R – O semáforo contador é similar ao binário mas conta com uma fila de valores, similar a um vetor
(array). É muito utilizado para minimizar problemas entre ISR e os outros semáforos, já que se
ocorrer mais de uma ISR antes que a tarefa o obtenha, perderemos essa ISR visto que os outros
semáforos só têm um ”espaço”. Utilizando o semáforo counting, não perdemos a ISR já que temos
vários “espaços”, sendo similar a uma Queue.

37. Como o FreeRTOS trata o compartilhamento de recursos entre tarefas? Qual as


diferenças entre o uso de taskENTER_CRITICAL() e taskEXIT_RITICAL() com o uso de
vtaskSuspendScheduler() e xtaskResumeScheduler() e com o uso de
xSemaphoreCreateMutex()?
R – O FreeRTOS fornece vários recursos que podem ser usados para implementar a exclusão
mútua, mas o melhor método de exclusão mútua é, sempre que possível, projetar o aplicativo de
modo que os recursos não sejam compartilhados, e cada recurso seja acessado apenas de uma única
tarefa.

38. Como o FreeRTOS contorna os problemas relativos à inversão de prioridade?


R – O FreeRTOS suporta herança de prioridade como um mecanismo para lidar com inversão de
prioridade.

39. Como o FreeRTOS procede alocação de memória? Como o tamanho da pilha interfere
neste procedimento?
R - As versões anteriores do FreeRTOS usavam um esquema de alocação de grupos de memória,
em que grupos com blocos de memória de tamanhos diferentes eram pré-alocados durante a
compilação e, em seguida, retornados pelas funções de alocação de memória. Embora esse seja um
esquema comumente usado em sistemas em tempo real, ele gerou muitas solicitações de suporte. O
esquema foi abandonado porque ele não podia usar a RAM de forma suficientemente eficiente a fim
de torná-lo viável para sistemas incorporados realmente pequenos.

Agora o FreeRTOS trata a alocação de memória como parte da camada portátil (em vez de parte do
código base fundamental). Isso acontece em reconhecimento aos requisitos variáveis de alocação de
memória e temporização dos sistemas incorporados. Um único algoritmo de alocação de memória
dinâmica é apropriado apenas para um subconjunto de aplicativos. Além disso, a remoção da
alocação de memória dinâmica do código base fundamental permite que os criadores de aplicativos
forneçam suas próprias implementações específicas, quando apropriado.

Quando o FreeRTOS requer RAM, ele chama pvPortMalloc() em vez de malloc(). Quando a RAM
estiver sendo liberada, o kernel chama vPortFree() em vez de free(). pvPortMalloc() tem o mesmo
protótipo que a função padrão malloc() da biblioteca C. vPortFree() tem o mesmo protótipo que a
função padrão free() da biblioteca C.

Você também pode gostar