Uma análise abrangente da simulação de um sistema de tempo real estrito, explorando a escalonabilidade com o runtime assíncrono Tokio.
- Visão Geral
- Conceitos Fundamentais
- Arquitetura
- Funcionalidades
- Instalação e Configuração
- Análise de Performance
- Resultados
- Melhorias Futuras
- Tecnologias
Este projeto implementa e analisa um Sistema de Monitoramento Cardíaco de Tempo Real (STR) desenvolvido integralmente em Rust. O sistema simula um ambiente de hard real-time, onde a corretude depende não apenas da lógica computacional, mas criticamente do cumprimento de prazos temporais (deadlines) rigorosos.
Este projeto serve como uma exploração prática dos conceitos de Sistemas de Tempo Real. O resultado mais significativo é a conclusão quantificável de que o sistema, em sua configuração atual, está sobrecarregado e não é escalonável. Este "resultado negativo" demonstra a aplicação bem-sucedida de metodologias de análise para identificar limites operacionais de sistemas complexos.
A principal contribuição reside na demonstração metodológica de como a Análise de Tempo de Resposta (RTA) pode prever falhas de escalonabilidade e como medições empíricas podem validar essas previsões.
Um Sistema de Tempo Real Estrito é definido como um sistema onde a falha em cumprir um único deadline é considerada uma falha total do sistema. Diferentemente de sistemas de tempo real flexíveis (soft real-time), em sistemas estritos a previsibilidade temporal é absoluta.
- WCET (Worst-Case Execution Time): Tempo máximo que uma tarefa leva para ser executada
- WCRT (Worst-Case Response Time): Tempo de resposta de pior caso, incluindo tempo de espera
- Análise de Escalonabilidade: Processo que determina se todas as tarefas podem cumprir seus deadlines
O projeto utiliza o runtime assíncrono Tokio, onde:
- Cada tarefa é uma task assíncrona independente
- Periodicidade gerenciada via
interval.tick().await - Preempção cooperativa (não preemptiva)
- Tensão arquitetônica: Tokio é otimizado para throughput, não determinismo temporal
src/
├── lib.rs # Declaração dos módulos
├── main.rs # Ponto de entrada e orquestração
├── ecg_data.rs # Leitura e parsing de dados ECG
├── tasks.rs # Definição de tarefas e TaskManager
├── anomaly_detector.rs # Lógica de detecção de anomalias
├── interrupts.rs # Simulador de interrupções esporádicas
├── performance_collector.rs # Coleta de métricas
└── wcrt_analysis.rs # Análise de WCRT teórica e empírica
- Segurança de Memória sem GC: Elimina pausas não-determinísticas
- Performance Nativa: Código compilado altamente otimizado
- Controle de Baixo Nível: Comparável a C/C++ em performance
- Trade-off: Curva de aprendizado íngreme
-
Processamento de Sinal ECG
- Leitura de dados a partir de
ecg_input.csv - Conversão para estruturas
EcgReading
- Leitura de dados a partir de
-
Detecção de Anomalias em Tempo Real
- Comparação com limiares de voltagem
- Geração de
AnomalyEventpara anomalias detectadas
-
Simulação de Interrupções
- Eventos esporádicos (Hardware, Software, Emergência)
- Carga não determinística para teste de robustez
-
Coleta de Métricas de Performance
- Instrumentação thread-safe de baixo overhead
- Geração de relatório JSON detalhado
-
Análise Híbrida de WCRT
- Análise teórica pré-execução
- Refinamento com dados empíricos pós-execução
Instale a toolchain Rust via rustup.rs:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh# Clone o repositório
git clone https://github.com/RafaelLopes23/SistemaMonitorCardiaco.git
# Navegue para o diretório
cd SistemaMonitorCardiacoOs parâmetros da simulação são definidos em:
src/main.rs- Configurações globais (duração do teste: 60s)src/tasks.rs- Parâmetros específicos das tarefas
# Execute no modo release para medições precisas
cargo run --release- Console: Logs de eventos em tempo real
- Arquivo:
performance_report.jsoncom métricas detalhadas
- Análise teórica de WCRT com estimativas conservadoras
- Execução do sistema por 60 segundos
- Coleta de métricas durante execução
- Geração de relatório empírico
- Re-análise com dados medidos
| Tarefa | Prioridade | Período (ms) | Deadline (μs) | Responsabilidade |
|---|---|---|---|---|
| InterruptService | 1 (Alta) | Esporádica | 1000 | Interrupções de alta prioridade |
| AnomalyDetection | 2 | 2 | 2000 | Análise de anomalias ECG |
| EcgAcquisition | 3 | 5 | 5000 | Leitura de amostras ECG |
| Preprocessing | 4 | 5 | 5000 | Pré-processamento de dados |
| HumanMachineInterface | 5 | 100 | 100000 | Atualização de interface |
| LogCommunication | 6 (Baixa) | 50 | 50000 | Envio de logs |
Os resultados demonstram falha completa do sistema em atender aos requisitos de tempo real:
| Tarefa | Deadline (μs) | WCRT Teórico (μs) | Escalonável (Teoria) | WCRT Medido (μs) | Escalonável (Empírico) | Margem Real (μs) |
|---|---|---|---|---|---|---|
| InterruptService | 1000 | 335 | ✅ Sim | 2246 | ❌ Não | -1246 |
| AnomalyDetection | 2000 | 575 | ✅ Sim | 2341 | ❌ Não | -341 |
| EcgAcquisition | 5000 | 3350 | ✅ Sim | 6851 | ❌ Não | -1851 |
| Preprocessing | 5000 | 5225 | ❌ Não | 6735 | ❌ Não | -1735 |
| LogCommunication | 50000 | 52100 | ❌ Não | 51542 | ❌ Não | -1542 |
| HumanMachineInterface | 100000 | 114300 | ❌ Não | 101330 | ❌ Não | -1330 |
- Utilização de CPU: 100% durante todo o teste
- Saturação Completa: Processador nunca ocioso
- Efeito Cascata: Falha das tarefas de alta prioridade devido à saturação
- Inversão de Prioridade: Escalonador cooperativo agrava o problema
- Profiling detalhado das tarefas mais intensivas
- Eliminação de alocações desnecessárias em loops críticos
- Uso de referências em vez de tipos proprietários
- Estruturas de dados otimizadas para cada caso de uso
- Refatoração de código puramente computacional
tokio::task::spawn_blockingpara operações intensivas- Pool de threads separado para cálculos bloqueantes
- Análise de sensibilidade dos períodos das tarefas
- Trade-off entre precisão e escalonabilidade
- Reavaliação dos requisitos temporais
- RTIC (Real-Time Interrupt-driven Concurrency)
- Embassy (Runtime assíncrono para embarcados)
- Escalonamento preemptivo baseado em hardware
- Linguagem: Rust (Edição 2021)
- Runtime: Tokio (Assíncrono)
- Build: Cargo
- Serde: Serialização/desserialização
- CSV: Leitura de dados
- Chrono: Manipulação de tempo
Este projeto está licenciado sob a licença MIT - veja o arquivo LICENSE para detalhes.
Contribuições são bem-vindas! Por favor, abra uma issue ou submeta um pull request.
Nota: Este projeto é acadêmico e demonstra metodologias de análise de sistemas de tempo real. O "resultado negativo" de não-escalonabilidade é o objetivo pretendido do experimento.