Expert - Firmware - RTOS
Neste laboratório vamos trabalhar com:
- Métricas para sistemas de tempo real
- Uso de
Symmetric Multiprocessing(SMP) com FreeRTOS (multicore)
Antes de começar o lab, será necessário estudar os materiais a seguir:
Leitura 1
Leitura 2
A ideia deste laboratório é que vocês reutilizem um laboratório já implementado anteriormente (I²C) como base para as medições. Primeiro, devem realizar todas as medições de métricas executando o sistema em um único core, exatamente como foi feito no laboratório original. Em seguida, devem habilitar o modo SMP e distribuir as tasks entre os dois cores da CPU, explorando o paralelismo disponível e tentando otimizar, o melhor possível, a alocação de recursos.
Após essa modificação, todas as métricas devem ser medidas novamente, permitindo comparar os resultados antes e depois do uso dos dois cores. O objetivo é quantificar o ganho real de desempenho obtido com o uso de SMP, com base em medições experimentais.
A entrega deve ser uma documentação das métricas no README do repositório, com:
Tabela — Single Core:
| Métrica / Task | mpu_task | fusion_task | uart_task | pwm_task |
|---|---|---|---|---|
| WCET | ||||
| Jitter | ||||
| Deadline Miss Rate | ||||
| Stack Usage |
Tabela — SMP (2 cores):
| Métrica / Task | mpu_task | fusion_task | uart_task | pwm_task |
|---|---|---|---|---|
| WCET | ||||
| Jitter | ||||
| Deadline Miss Rate | ||||
| Stack Usage |
TIP
Você pode usar outros equipamentos para realizar as medições:
- saleae
- analog discovery
Parte 1 — Medindo em Single Core
Instrumentalizando o tempo:
- Instrumentalize cada uma das tasks (use um pino diferente para cada task).
- Conecte ao osciloscópio e realize as medições.
- Realize os cálculos.
Instrumentalizando o stack size:
- Agora instrumentalize o stack size.
Sempre que for medir o tempo, desative a instrumentalização do stack size, pois o
printfpode consumir tempo e afetar a sua medição.
INFO
Tire fotos das medições; vamos querer ver como você as adquiriu.
Parte 2 — SMP no FreeRTOS
Agora vamos otimizar o software com base no que vocês estão medindo.
- Ative o modo SMP no FreeRTOS e defina a afinidade de cada task. Usando os dados da tabela "Single Core", defina a melhor distribuição.
- Ajuste as prioridades (se achar necessário).
- Ajuste o stack para respeitar a regra dos 80%.
- Ajuste as frequências das tasks.
Parte 3 — Medindo em SMP
Refaça as medições. Está tudo certo agora?
Perguntas extras
Perguntas a serem respondidas na validação:
- Qual é a frequência máxima que a task
fusionpode executar? - Nós configuramos o
fusionpara funcionar a 100 Hz. Isso estava correto?
#define SAMPLE_PERIOD (0.1f) // replace this with actual sample period- Como otimizar a task da
uartpara que ela não ocupe tanto processamento? - Por que o valor do jitter é baixo/alto nessa aplicação?
- O jitter aumentou ou diminuiu com SMP? O que mais contribuiu para isso (interrupções, afinidade, prioridades, locks)?
- Houve deadline miss em alguma task? Em qual condição (Single Core vs SMP) e como você mitigou?
- Como você mediu o jitter (qual sinal, qual definição: período entre ativações vs variação do início/fim)?
- Qual foi o efeito de mudar prioridades vs mudar afinidade? Qual teve mais impacto e por quê?
- O tamanho de stack de cada task ficou dentro da regra dos 80%? Mostre os valores e o racional de ajuste.