C++ em Sistemas Embarcados
Uma transição prática de C para C++ moderno
Descrição do livro
A transição de C pode ser desafiadora, com preocupações sobre sobrecarga para o desempenho, complexidade adicional e ferramentas desconhecidas. Abordando esses desafios, Amar Mahmutbegovic, um defensor de C++ moderno no desenvolvimento embarcado, mostra como podemos nos beneficiar de abstrações de custo zero, verificações de tempo de compilação e poderosos recursos da linguagem para preservar o desempenho, chegando ao mesmo tempo a um código mais seguro e limpo.
Este livro preenche a lacuna entre C tradicional e C++ avançado, e o ajudará a manter a eficiência exigida dos desenvolvedores C, além de fornecer a segurança e a expressividade de C++ moderno.
Começando com uma configuração de ambiente de desenvolvimento moderno, que inclui um contêiner Docker para a replicação contínua dos exemplos, você superará os obstáculos de usar a biblioteca padrão de C++ em ambientes com restrição de memória e se familiarizará com a ETL (Embedded Template Library) como alternativa. O livro o guiará por conceitos essenciais de C++ antes de explorar tópicos avançados, como os templates, a tipagem forte, a manipulação de erros, a computação no tempo de compilação e o RAII. Com a ajuda de exemplos práticos, você implementará um sequenciador, escreverá uma HAL com segurança de tipos e aplicará padrões como Command, State e Observer para resolver problemas comuns de desenvolvimento embarcado.
Quando chegar no fim do livro, você terá aprendido a aplicar C++ moderno para desenvolver um firmware robusto e modular com desempenho igual ou superior às soluções codificadas manualmente em C.
Você aprenderá a
• Desconstruir mitos e concepções errôneas sobre o uso de C++ em sistemas embarcados.
• Definir uma automação de build personalizada para C++ em ambientes restritos.
• Usar a tipagem forte para melhorar a segurança de tipos.
• Aplicar técnicas do C++ moderno, como o RAII (Resource Acquisition Is Initialization).
• Usar a DSL (Domain Specific Language) com um exemplo prático que emprega o Boost SML.
• Implementar melhores práticas de desenvolvimento de software, incluindo o princípio SOLID, no desenvolvimento embarcado.
Ver menos ▲Sumário
Sumário
- Prefácio
- PARTE I: Introdução ao C++ no desenvolvimento embarcado
- CAPÍTULO 1: Desfazendo mitos comuns sobre C++
- Requisitos técnicos
- Uma breve história do C++
- C with Classes
- C++ moderno
- Tipos genéricos
- constexpr
- Inchaço e sobrecarga no runtime
- Construtores e destrutores
- Otimização
- Templates
- RTTI e exceções
- Resumo
- CAPÍTULO 2: Desafios de sistemas embarcados com recursos limitados
- Requisitos técnicos
- Sistemas embarcados críticos de segurança e de tempo real rigoroso
- Unidade de controle de airbag e os requisitos de tempo real
- Medindo o desempenho do firmware e o não determinismo
- Gerenciamento dinâmico de memória
- Fragmentação de memória
- Diretrizes críticas de segurança para o gerenciamento dinâmico de memória em C++
- Gerenciamento dinâmico de memória na biblioteca padrão do C++
- Desativando recursos indesejados do C++
- Resumo
- CAPÍTULO 3: Ecossistema de C++ embarcado
- Requisitos técnicos
- Compiladores e ambientes de desenvolvimento
- Arm Keil MDK e Arm Compiler for Embedded
- IAR C/C++ Compiler e IAR Embedded Workbench for Arm
- IDEs suportados pelo fornecedor e o GCC
- Analisadores estáticos
- Teste de unidade
- Perfilamento
- Resumo
- CAPÍTULO 4: Definindo o ambiente de desenvolvimento para um projeto C++ embarcado
- Requisitos técnicos
- Requisitos para um ambiente moderno de desenvolvimento de software
- Compilador
- Automação de build
- Simulador
- Editor de código
- Ambiente de desenvolvimento conteinerizado
- Construindo o programa Hello, World! usando o CMake
- Construindo um firmware usando o CMake
- Ambiente de desenvolvimento conteinerizado e o VS Code
- Resumo
- PARTE II: Fundamentos de C++
- CAPÍTULO 5: Classes – construindo blocos de aplicações C++
- Requisitos técnicos
- Encapsulamento
- Setters e getters
- Métodos estáticos
- Estruturas
- Duração do armazenamento e inicialização
- Inicialização de membros não estáticos
- Inicialização de membros estáticos
- Herança e polimorfismo dinâmico
- Funções virtuais
- Polimorfismo dinâmico
- Resumo
- CAPÍTULO 6: Além das classes – conceitos primordiais de C++
- Requisitos técnicos
- Namespaces
- Namespaces não nomeados
- Namespaces aninhados
- Sobrecarga de funções
- Interoperabilidade com C
- Vinculação externa e de linguagens em C++
- Biblioteca padrão do C em C++
- Referências
- Categorias de valor
- Referências lvalue
- Referências rvalue
- Contêineres e algoritmos da biblioteca padrão
- Array
- Adaptadores de contêiner
- Algoritmos
- Resumo
- CAPÍTULO 7: Fortalecendo o firmware – métodos práticos de manipulação de erros em C++
- Requisitos técnicos
- Códigos de erro e asserções
- Tratadores de erros globais
- Asserções
- Exceções
- std::optional e std::expected
- Resumo
- PARTE III: Conceitos avançados de C++
- CAPÍTULO 8: Construindo código genérico e reutilizável com templates
- Requisitos técnicos
- Aspectos básicos dos templates
- Fazendo uma chamada à função de template
- Especialização de template
- Metaprogramação com templates
- Concepts
- Polimorfismo no tempo de compilação
- CRTP (curiously recurring template pattern)
- Resumo
- CAPÍTULO 9: Melhorando a segurança de tipos com tipos fortes
- Requisitos técnicos
- Conversão implícita
- Promoções e conversões numéricas
- Conversão de array para ponteiro
- Conversão de função para ponteiro
- Conversão explícita
- const_cast
- static_cast
- dynamic_cast
- reinterpret_cast
- Tipos fortes
- Resumo
- CAPÍTULO 10: Escrevendo código expressivo com lambdas
- Requisitos técnicos
- Aspectos básicos das expressões lambda
- Armazenando lambdas usando std::function
- Padrão command
- Gerenciador de interrupção de GPIO
- std::function e alocação dinâmica de memória
- Resumo
- CAPÍTULO 11: Computação em tempo de compilação
- Requisitos técnicos
- Templates
- Especificador constexpr
- Exemplo 1 – Analisador de endereço MAC
- Exemplo 2 – Gerando uma tabela de consulta
- Especificador consteval
- Resumo
- PARTE IV: Aplicando C++ à solução de problemas no domínio embarcado
- CAPÍTULO 12: Escrevendo uma HAL C++
- Requisitos técnicos
- Periféricos mapeados na memória
- Periféricos mapeados na memória via CMSIS
- Periféricos mapeados na memória em C++
- Periféricos type-safe mapeados na memória em C++
- Timers
- Resumo
- CAPÍTULO 13: Trabalhando com bibliotecas C
- Requisitos técnicos
- Usando a HAL C em projetos C++
- Interface UART para design de software flexível
- A interface UART no padrão Adapter
- Introdução às classes estáticas
- Usando o RAII para encapsular a biblioteca C littlefs
- LittleFS – um sistema de arquivos para microcontroladores
- Introdução ao encapsulador C++ baseado em RAII
- Gerenciamento de arquivos mais limpo com o RAII
- Resumo
- CAPÍTULO 14: Melhorando o superloop com sequenciador
- Requisitos técnicos
- O superloop e a motivação para o uso de um sequenciador
- Projetando um sequenciador
- Armazenando um callable
- Implementando um sequenciador
- Resumo
- CAPÍTULO 15: Padrões práticos – construindo um publicador de temperatura
- Requisitos técnicos
- Padrão Observer
- Implementação no runtime
- Implementação no tempo de compilação
- Usando templates variádicos
- Melhorando a implementação de tempo de compilação
- Resumo
- CAPÍTULO 16: Projetando máquinas de estados finitos escaláveis
- Requisitos técnicos
- FSM – uma implementação simples
- Descrevendo estados e eventos
- Rastreando o estado atual e manipulando eventos – a classe da FSM
- Usando a classe ble_fsm
- Analisando a saída
- FSM – implementação com o uso do padrão State
- Entendendo as interfaces de classe state
- Refatorando a classe ble_fsm
- Implementando o padrão State
- Padrão de projeto State
- Implementação do padrão State usando tag dispatching
- Boost SML
- Resumo
- CAPÍTULO 17: Bibliotecas e frameworks
- Requisitos técnicos
- Biblioteca padrão
- Implementações autônoma e hospedada no GCC
- Cabeçalhos numéricos e matemáticos
- Contêineres e algoritmos
- Metaprogramação com templates
- Partes da biblioteca padrão a serem evitadas em aplicações embarcadas
- Embedded template library
- Contêineres de tamanho fixo
- Armazenando um callable com etl::delegate
- Outros utilitários fornecidos pela ETL
- Pigweed
- Tutorial Sense do Pigweed
- RPC e protocol buffers
- Compile-time Inicialization and Build
- Usando o CIB no exemplo de um publicador de temperatura
- Estendendo o exemplo do publicador de temperatura
- Resumo
- CAPÍTULO 18: Desenvolvimento multiplataforma
- Requisitos técnicos
- Importância de escrever código portável
- Princípios de design SOLID
- Testabilidade
- Resumo
- ÍNDICE REMISSIVO
Livros relacionados
Recursos
Opinião dos leitores
Djan de A d R
Muito bom livro, dicas bem interessantes para quem cogita empregar C++ em sistemas embarcados.




