Fazer um programa para piscar os 3 LEDs como em um semáforo utilizando uma máquina de estados.
- Por que os LEDs são Active Low (acendem quando se coloca 0 na saída)?
- Quais funções você usou para acender e apagar os LEDs?
- Explique o que é o Device Tree.
- Explique as abstrações feitas pelo Sistema Operacional.
Fazer um programa para que o LED da placa frdm-kl25z, exiba a cor laranja e seja possível variar a intensidade em tempo real pelo terminal serial (UART).
- Ajuste de Cor: Utilize canais de PWM para misturar as cores e obter o tom laranja. Ajuste a frequência do sinal para que a oscilação não seja perceptível ao olho humano.
- Interatividade via Terminal: O programa deve solicitar que o usuário digite um valor de 0 a 100 (porcentagem) no console.
- Cálculo de Duty Cycle: O código deve calcular o novo duty cycle dos LEDs mantendo a proporção da cor laranja, mas alterando a intensidade total conforme o valor digitado.
- Abstração de Hardware: É obrigatório o uso do _Device Tree_ (DTS) e das APIs do Zephyr para acessar os controladores de PWM, evitando o uso de endereços ou pinos fixos (hardcoded) no meio do código principal.
Desenvolva um programa, utilizando acesso direto aos registradores, para fazer o LED verde piscar com período de 2 segundos.
Sequência de execução do programa:
- Habilitar clock da porta B.
- Configurar o registrador de controle do pino 19 (Pin Control Register).
- Configurar o pino 19 como saída.
- Acionar a saída do pino 19.
- Executar a função de espera (utilizar a função fornecida:
void delay_ms(int n), em quenrepresenta o tempo em milissegundos). - Desacionar a saída do pino 19.
- Executar novamente a função de espera.
- Repetir continuamente os passos 4 a 7.
Escreva um código em C configurando os registradores da frdm-kl25z para realizar as seguintes tarefas:
- Efetuar uma aquisição analógica utilizando o conversor A/D (ADC).
2. Acender o LED azul quando a tensão medida estiver próxima de 3,3 V; 2. Acender o LED verde quando a tensão medida estiver próxima de 0 V.
O módulo de ultrassom pode ser utilizado para medir distâncias por meio do envio e da recepção de ondas sonoras. Nesta atividade, você deverá desenvolver uma biblioteca para facilitar a utilização desse módulo em projetos futuros.
Geração do sinal de Trigger com PWM
Crie o sinal de
triggerutilizando um periférico de PWM. O sensor requer um pulso de, no mínimo, 10 μs para iniciar uma medição.- Escolha uma frequência e um duty cycle adequados para gerar esse pulso.
- Defina também a taxa de atualização das medições, ou seja, quantas vezes por segundo o sensor realizará uma nova medida de distância.
- Observe que é possível alterar a fonte de clock do PWM. Considere utilizar uma fonte mais lenta (por exemplo, 8 MHz) para facilitar a geração de períodos maiores entre as medições.
Medição da largura de pulso com Input Capture
Utilizando o recurso de Input Capture, desenvolva um programa capaz de medir a largura de um pulso PWM gerado na etapa anterior.
- Conecte a saída do PWM diretamente à entrada configurada para captura.
- Valide o funcionamento comparando o valor medido com a largura de pulso configurada.
Medição de distância com o sensor ultrassônico
Após validar o mecanismo de captura:
- Conecte o sinal PWM ao pino Trigger do módulo de ultrassom.
- Utilize o Input Capture para medir a duração do pulso presente no pino Echo.
- A partir do tempo medido, calcule a distância até o objeto utilizando a velocidade do som.
Criação de uma biblioteca
Depois de validar o funcionamento completo do sensor organize o código desenvolvido em uma biblioteca reutilizável.
Nesta atividade, você deverá integrar diferentes periféricos e utilizar múltiplas threads para executar tarefas concorrentes no sistema.
- Integre ao projeto os exemplos de leitura do ADC, botão com interrupção e acelerômetro.
- Implemente uma _thread _responsável pela leitura do ADC, executando periodicamente a cada 500 ms. Os valores lidos devem ser enviados para a interface serial.
- Implemente uma segunda thread responsável pela leitura do acelerômetro, executando periodicamente a cada 1000 ms. Os valores dos eixos X, Y e Z devem ser exibidos na interface serial.
- Configure o botão utilizando interrupção, conforme apresentado no tutorial.
- A cada acionamento do botão, alterne entre os seguintes modos de operação:
- Modo ADC: exibe somente os valores lidos pelo ADC.
- Modo Completo: exibe os valores do ADC e do acelerômetro.
- Inicialize as duas threads utilizando a mesma prioridade de execução.
- Em seguida, modifique as prioridades das threads, observe o comportamento do sistema e descreva os efeitos observados. Explique como o escalonador utiliza as prioridades para determinar a execução das tarefas.
Esta atividade tem como objetivo explorar o compartilhamento de recursos entre múltiplas threads e a utilização de mecanismos de sincronização para evitar inconsistências e coordenar o acesso a recursos compartilhados.
Será implementado um sistema composto por:
- Uma thread produtora, responsável por gerar itens.
- Uma thread consumidora, responsável por processar ou remover itens.
- Um recurso compartilhado, representado por uma variável denominada
count.
- A thread produtora incrementa o valor de contador a cada
1 segundo. - A thread consumidora decrementa o valor de contador a cada
1,5 segundos. - O recurso compartilhado é representado pela variável contador.
- Produção:
count++ - Consumo:
count--
- Produção:
- Não utilize mutexes, semáforos, filas ou qualquer outro mecanismo de sincronização.
Execute o programa e responda:
- O valor de
countpermanece consistente ao longo da execução? - O valor de
countpode assumir valores inesperados? - O comportamento muda ao alterar os períodos de execução das threads?
- O comportamento muda ao alterar as prioridades das threads?
- Quais problemas podem ocorrer quando múltiplas threads acessam simultaneamente um mesmo recurso compartilhado?
Adicione um mutex para proteger o acesso à variável count.
Execute novamente o programa e responda:
- O
mutexeliminou os problemas observados na Parte 1? - O
mutexgarante a consistência do valor decount? - Qual recurso está sendo protegido pelo
mutex? - Qual é a principal função de um
mutexneste contexto?
Modifique o programa para utilizar semáforos.
Considere que:
- O sistema possui um capacidade máxima de 10 itens.
- A thread consumidora só pode consumir quando houver itens disponíveis.
- A thread produtora só pode produzir quando houver espaço disponível.
Execute novamente o programa e responda:
- O número de itens disponíveis pode se tornar negativo?
- O número de itens pode ultrapassar a capacidade máxima definida?
- Qual problema foi resolvido pelos semáforos que não era resolvido apenas pelo
mutex? - Qual é a função de cada semáforo utilizado?
- Qual a diferença entre proteger um recurso compartilhado e controlar sua disponibilidade?
- Em qual etapa da atividade o
mutexfoi suficiente? - Em qual etapa os semáforos se mostraram mais adequados?
- Em uma aplicação real de produtor-consumidor, quando seria necessário utilizar mutexes, semáforos ou ambos? Justifique.
Nesta atividade deverá ser feito:
- Implementar uma aplicação multitarefa utilizando o Zephyr RTOS.
- Realizar aquisição contínua de dados a partir de um periférico da frdm-kl25z.
- Transmitir e visualizar dados em tempo real em um computador.
- Implementar e avaliar um filtro FIR para processamento digital de sinais.
- Medir e analisar o desempenho do sistema sob diferentes cargas de processamento.
- Investigar limitações relacionadas à comunicação UART e ao sistema de logging do Zephyr.
- Escolha uma das seguintes fontes de dados:
- Conversor Analógico-Digital (ADC).Acelerômetro mma8451q.
- Desenvolva uma aplicação contendo:
- uma thread dedicada à aquisição de dados.
- uma thread dedicada à comunicação dos dados adquiridos.
Registre um timestamp para cada amostra adquirida.
Desenvolva um script em Python capaz de receber e exibir os dados em tempo real.
Determine a maior taxa de aquisição que o sistema consegue atingir de forma estável.
Calcule a taxa de aquisição efetiva a partir dos timestamps registrados.
- Implemente um filtro FIR simples para processamento das amostras adquiridas.
- Execute os testes sem o filtro e registre:
- taxa de aquisição.
- utilização da comunicação.
- comportamento geral do sistema.
- Repita os testes com o filtro habilitado.
- Compare os resultados obtidos nas duas configurações.
- Utilize o sistema de logging do Zephyr para monitorar a execução da aplicação.
- Avalie o comportamento do sistema em diferentes taxas de aquisição.
- Investigue a ocorrência de:
- perda de mensagens.
- atrasos na transmissão.
- saturação da UART.
- Discuta as limitações observadas na comunicação UART e no sistema de logging.
- Qual foi a maior taxa de aquisição obtida pelo sistema?
- Qual foi a taxa de aquisição efetiva após a inclusão do filtro FIR?
- Qual foi o impacto do filtro FIR no desempenho do sistema?
- O sistema de logging conseguiu transmitir todas as mensagens geradas?
- Em quais condições ocorreu perda de mensagens?
- O principal gargalo do sistema foi o processamento dos dados ou a comunicação? Justifique.
- Qual configuração apresentou o melhor equilíbrio entre taxa de aquisição, qualidade do sinal e utilização dos recursos do sistema?