![](https://desbravatech.com/br/wp-content/uploads/2024/07/embedded-systems-1024x585.webp)
Presente em quase todos os lugares onde exista algum tipo de tecnologia, Sistemas Embarcados é uma área de especialização que requer uma profunda compreensão de conceitos, tanto de hardware quanto de software. Faz-se necessário recordar das aulas de Arquitetura e Organização de Computadores, não esquecendo também dos conceitos aprendidos na disciplina de Sistemas Digitais, principalmente sobre circuitos lógicos combinacionais, além das diferenças entre linguagens de programação compiladas e interpretadas.
E por quais motivos? Bom, o hardware nada mais é do que um dispositivo eletrônico que opera sob lógica binária, realizando operações de deslocamento de bits, carregamento em memória, transferência de conjuntos de bytes para a Unidade Lógica e Aritmética e por aí vai… Assim, temos uma máquina eletrônica que opera por estados, afim de executar as instruções determinadas. A forma de escrever essas instruções para o hardware, é também conhecida por linguagem de máquina (lógica binária). Talvez você já tenha ouvido falar na linguagem Assembly. É a linguagem mais próxima dos níveis binários, composta por códigos de operação (OPCODES) que vão dentre outras coisas, orientar o hardware sobre qual é a sua missão. Escrever em código binário é inviável, e, com os avanços nas últimas décadas, incluindo o aumento de complexidade na integração entre aplicações, e, desejo por reduzir a densidade de código, a linguagem Assembly tornou-se pouco utilizada para escrever sistemas complexos.
Buscando facilitar a implementação e trazer flexibilidade aliada a portabilidade, novas linguagens de programação foram surgindo para abstrair as linguagens de mais baixo-nível, porém, também com objetivo de não comprometer os recursos disponíveis, bem como a velocidade de execução. Assim, nos anos 70, a linguagem C foi criada visando também a construção de sistemas operacionais para serem rápidos, flexíveis e portáveis entre diferentes arquiteturas de hardware. Didaticamente, temos basicamente três classes de linguagens de programação, conforme ilustra a Figura 1.
![](https://desbravatech.com/br/wp-content/uploads/2024/07/desbravatech-linguagensMCU.png)
Conforme ilustra a Figura 1, as linguagens de alto-nível, em suas diferentes subcategorias vão apresentar maior facilidade de implementação ao mesmo tempo uma menor densidade de código, sendo também menos performática em termos de velocidade de execução.
Linguagem compilada de alto-nível C/C++
Na prática, quanto mais abstraída do hardware a linguagem for, mais conjuntos de códigos serão necessários processar no hardware para fazer a mesma coisa que faria, por exemplo, com uma única instrução em linguagem de máquina ou poucas instruções em Assembly. Em tese, as linguagens compiladas apresentam uma melhor otimização, resultando em maior desempenho, aproximando o código compilado da linguagem de máquina para a arquitetura em que foi escrito.
A intenção deste post é tratar das linguagens C e C++ em sistemas embarcados. E agora, após uma visão geral sobre o tema, podemos explorar as características de cada uma.
A linguagem C também é conhecida por ser uma linguagem de nível intermediário, uma vez que ela combina os elementos das linguagens de alto nível com o funcionalismo da linguagem a nível de máquina, permitindo, por exemplo, que sejam adicionadas instruções em Assembly no mesmo código.
O C++ (C plus plus ou CPP) é uma extensão da linguagem C, que fornece uma maior abstração, trazendo os conceitos da Orientação a Objetos (OO). Lançada em 1985, o C++ segue evoluindo até os dias atuais. Na sua versão C++20, oferece inúmeros recursos para otimizar ainda mais os serviços por trás de sistemas operacionais como Linux, Windows e base para construção de outras linguagens. Os motores de execução JavaScript, como o V8 do Google, que é usado no Google Chrome e no Node.js, foram implementados em C++. O Python, lançado em 1991 tem o seu núcleo escrito em C, com algumas implementações também em Cpp. O C++ influenciou muitas outras linguagens de programação devido às suas características avançadas e à sua eficiência. A capacidade de C++ para manipulação direta de memória, orientação a objetos, e abstração de alto nível inspirou o desenvolvimento de muitas outras linguagens e ferramentas de programação. Por exemplo, Java, C#, e até mesmo Rust foram influenciados por conceitos e práticas do C++. Ambas estão no top 10 das linguagens mais utilizadas no mundo em 2023.
C/C++ para embarcados
Embora C e C++ compartilhem muitas semelhanças, uma vez que C++ é uma extensão de C, existem diferenças significativas nos processos de compilação de código e na maneira como ambos lidam com recursos e acesso à memória.
Compilação de C:
- Processo de Compilação: O código C passa por pré-processamento, compilação, e linkagem. O pré-processador manipula diretivas como
#include
e#define
. Em seguida, o compilador traduz o código C em código de máquina. Finalmente, o linker une o código objeto em um executável. - Arquivos de Cabeçalho: A inclusão de arquivos de cabeçalho é direta e essencial para definir interfaces entre diferentes módulos do software.
Compilação de C++:
- Processo de Compilação: Similar ao C, mas com etapas adicionais devido aos recursos de OO. Isso inclui a manipulação de templates, classes, e outras funcionalidades orientadas a objetos.
- Templates e Instanciação: A compilação de templates em C++ pode gerar múltiplas instâncias de código, o que pode resultar em um aumento no tamanho do executável.
- Linkagem: C++ exige uma linkagem mais complexa devido às suas funcionalidades de classes, herança, e polimorfismo.
Distribuição de Recursos e Acesso à Memória
C:
- Gerenciamento Manual de Memória: Em C, a alocação e desalocação de memória são geralmente feitas manualmente usando funções como
malloc
efree
. - Baixo Nível: C permite manipulação direta de memória e endereços, facilitando o controle preciso dos recursos de hardware, essencial para sistemas embarcados e aplicações de alta performance.
- Determinismo: Devido à falta de abstrações complexas, o uso de memória em C é altamente previsível, favorecendo ambientes onde o determinismo é crucial.
C++:
- Gerenciamento de Memória com Abstrações: C++ introduz mecanismos como construtores e destrutores, além de smart pointers (
std::unique_ptr
,std::shared_ptr
) para gerenciar a memória de forma mais segura e automatizada. - Abstrações Orientadas a Objetos: Recursos como herança e polimorfismo introduzem abstrações que podem impactar a distribuição de recursos. Essas abstrações facilitam a programação, mas podem adicionar overhead de memória e processamento.
- Templates: Embora poderosos, templates podem aumentar o uso de memória devido à geração de múltiplas instâncias de código, algo que não ocorre em C.
Overhead, eficiência e confiabilidade
- Overhead: O overhead de C++ devido às suas abstrações (como classes, herança, e templates) pode resultar em um uso de memória mais elevado e maior tempo de compilação em comparação a C.
- Eficiência: C é geralmente mais eficiente em termos de uso de memória e velocidade de execução, devido à sua simplicidade e menor abstração.
- Segurança e Confiabilidade: C++ oferece mecanismos que podem aumentar a segurança e confiabilidade do código, como RAII (Resource Acquisition Is Initialization) e smart pointers, reduzindo a chance de vazamentos de memória.
Aplicação em sistemas embarcados
Como podemos observar a partir dos conceitos anteriores sobre as linguagens e as características do C e C++, cada uma tem suas vantagens e desvantagens. Sua aplicação vai depender das características do hardware e complexidade do software.
Embedded com C
O C é recomendado para microarquiteturas limitadas em memória RAM/flash, single-core, onde se tem uma manipulação direta dos periféricos, com máximo desempenho e mínima sobrecarga, podendo mesclar trechos de código em Assembly. É a linguagem ideal quando o objetivo é garantir um comportamento determinístico e confiável em ambientes com recursos limitados. Como exemplo, aplicações com microcontroladores da Renesas, Microchip, Espressif, STMicro e Texas Instruments. Aqui temos produtos como sensores e atuadores IoT, placas de interface e controle para acionamento e comunicação com software de alto-nível (frontend web, mobile app, desktop), além de módulos de controle desenvolvidos para aviação e indústria automotiva, por exemplo.
Embedded com C++
O C++ é recomendado geralmente no desenvolvimento com Linux embarcado, com requisitos robustos de aplicação, maior complexidade e até processamento envolvendo base de dados. Vai oferecer um conjunto de bibliotecas ricas com templates e regras de OO para melhor gerenciar a complexidade do software. Nestes casos, aplicações com microcontroladores de núcleo ARM32-64 bits, single ou multi-core, mega/gigabytes de memória RAM e amplo espaço de armazenamento. Aqui temos produtos como centrais multimídia, cameras IP, porteiro eletrônico, routers e switches de rede, dentre outros. Um exemplo são aplicações para renderizar imagens de radar obtidos via transponder baseados em FPGA de alto desempenho, usado em aeronaves de combate.
Resumo e ideias principais
Neste post, tivemos uma breve noção das linguagens de programação e sua relação com sistemas embarcados.
Embora tanto C quanto C++ sejam linguagens poderosas e bastante versáteis, a escolha entre elas deve ser baseada nas necessidades específicas da sua aplicação. Enquanto C++ oferece ferramentas avançadas que facilitam o desenvolvimento de software complexo, mas ao custo de maior uso de recursos. O C, por outro lado, proporciona um controle mais direto e eficiente dos recursos de hardware, essencial para aplicações onde o desempenho e os recursos limitados são fatores críticos no projeto.
Para seguir obtendo conhecimento mais detalhado, você pode consultar as seguintes fontes:
- https://www.statista.com/statistics/793628/worldwide-developer-survey-most-used-languages
- https://www.freecodecamp.org/news/the-c-programming-handbook-for-beginners/
- https://www.w3schools.com/cpp/cpp_intro.asp
- https://cplusplus.com/
- https://www.edx.org/learn/c-programming/dartmouth-college-c-programming-language-foundations?index=product&queryID=410ce020910ecd7f285d0666710f1d9a&position=3&linked_from=autocomplete&c=autocomplete
- https://www.embedded.com/
- https://www.ieee.org/
![](https://desbravatech.com/br/wp-content/uploads/2024/07/IMG_1107.jpeg)
Engenheiro de Computação (2010), com mestrado em Eng. Elétrica (2013) na área de instrumentação e biomédica, atua desde 2007 com desenvolvimento de software e hardware, processamento de sinais e instrumentação eletrônica. É também professor de nível técnico e superior desde 2008. Um profissional dedicado e entusiasmado com inovação, ciência e integração sw-hw. Tem como hobby estudar, praticar cross-training, apreciar música clássica e filosofia, estudar mitologia, programação e ensino sobre integração SW-HW para jovens entusiastas.