Uso de C++ em sistemas embarcados.

575 views
Skip to first unread message

Lucas Augusto

unread,
Aug 23, 2015, 7:52:03 PM8/23/15
to sis_embarcados
Boa noite a todos,
Gostaria de saber o opinião dos senhores sobre o uso do C++ (orientação a objetos) em vez da linguagem C em sistemas embarcados (bare-metal por exemplo), sendo que alguns compiladores como o Keil uvision oferece essa suporte a C++ e os novos microcontroladores (ARM principalmente) tem uma quantidade considerável de memórias RAM e ROM a um preço baixo. Quais são os prós e contras e se não deveríamos quebrar esse paradigma. O que acham a respeito disso?

Flavio Castro Alves Filho

unread,
Aug 23, 2015, 9:30:16 PM8/23/15
to sis_emb...@googlegroups.com
C++ também é bare-metal, não?

Se eu não me engano, o que pega mesmo no C++ embarcado (principalmente
no bare-metal) são os recursos avançados do C++, como polimorfismo
(esse é o único que me lembro agora).

De resto, evitando bare-metal com alocação dinâmica de memória, vá com fé :-)

A resposta desta pergunta é com os profissionais ... onde eu não me
incluo nessa :-)


Em 23 de agosto de 2015 20:52, Lucas Augusto
<lucas.dem...@gmail.com> escreveu:
> Boa noite a todos,
> Gostaria de saber o opinião dos senhores sobre o uso do C++ (orientação a objetos) em vez da linguagem C em sistemas embarcados (bare-metal por exemplo), sendo que alguns compiladores como o Keil uvision oferece essa suporte a C++ e os novos microcontroladores (ARM principalmente) tem uma quantidade considerável de memórias RAM e ROM a um preço baixo. Quais são os prós e contras e se não deveríamos quebrar esse paradigma. O que acham a respeito disso?
>
> --
> Você está recebendo esta mensagem porque se inscreveu no grupo "sis_embarcados" dos Grupos do Google.
> Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para sis_embarcado...@googlegroups.com.
> Para postar neste grupo, envie um e-mail para sis_emb...@googlegroups.com.
> Visite este grupo em http://groups.google.com/group/sis_embarcados.
> Para obter mais opções, acesse https://groups.google.com/d/optout.



--
Flavio de Castro Alves Filho

flavio...@gmail.com
www.linuxembarcado.com
Twitter: http://twitter.com/#!/fraviofii
LinkedIn profile: www.linkedin.com/in/flaviocastroalves

Jerônimo Lopes

unread,
Aug 24, 2015, 7:56:06 AM8/24/15
to sis_emb...@googlegroups.com
Tenho usado C++ para embarcados, inclusive bare-metal.

Quando usar C ou C++? Na minha opinião, depende muito da aplicação e dos desenvolvedores. 

As vantagens de C++ são fazer uso de abstrações, encapsulamento, herança, polimorfismo na tentativa de criar código com maior qualidade, menor acoplamento, re-uso de código, etc. 

C++ te da mais 'ferramentas' mas desde que utilizado de forma correta. Não adianta criar um monte de classes com código espaguete.

Você tem um overhead 'natural' de uso de memória de programa, uma vez que começa a construir códigos mais genéricos e segmentados.

Também acho que o uso de alocação dinamica pode ser evitado no sentido de ficar alocando e desalocando memória. Se bem utilizado pode ser algo muito bom, mas te também te dá bastante corda pra se enforcar. Agora o uso de alocação dinamica sem desalocação é algo interessante, por exemplo em um firmware que é bastante 'customizável' em tempo de execução você pode inicializar somente determinados componentes do firmware, para isso o uso de alocação dinamica é bem importante. 

Jerônimo Lopes

unread,
Aug 24, 2015, 8:19:09 AM8/24/15
to sis_emb...@googlegroups.com
Lembrando a mais famosa discussão entre C e C++:

Lucas Augusto

unread,
Aug 24, 2015, 1:47:40 PM8/24/15
to sis_embarcados
A minha dúvida surgiu porque sempre programei em C para microcontroladores e atualmente estou aprendendo C++ para aplicativos (Visual Studio e QT).
Achei o C++ muito melhor para estruturar o algoritmo, fácil de dar manutenção e ainda é possível usar as vantagens da orientação a objetos :). É bom demais para ser verdade. Hahaha... 
E como na maioria das empresas que trabalhei só é usado o C em sistemas embarcados, talvez tivesse algo de errado em fazer isso. Dai a minha dúvida. 

Toda vez que escrevo um código para PIC ou 8051 em minhas brincadeiras sempre tenho o cuidado para não ter um "overhead" de memória, mas com os ARM's com memória sobrando e bem baratos, achei que isso não seria mais um problema grave.
Pretendo continuar os meus estudos e minha experiências com C++ para sistemas embarcados, quem sabe aprendendo boas práticas de programação e cuidado com a alocação dinâmica de memória esse paradigma não possa ser quebrado?
Imagino a mesmas dúvidas a 30 ou 20 anos atrás quando o Assembly era a linguagem mais usada e cogitaram usar a linguagem C em embarcados. Hahaha...

Muito obrigado pelas dicas e por esse debate construtivo.

Um grande abraço a todos.

Rafael Dias

unread,
Aug 24, 2015, 1:59:00 PM8/24/15
to sis_emb...@googlegroups.com

Nada impede de você usar OOP em C. O padrão C99 (suportado por alguns compiladores C para arm) possui algumas construções que são muito semelhantes às construções de C++. É possível fazer abstração, polimorfismo e encapsulamento de forma simples e direta.

Bom, tudo é questão de saber o que a linguagem tem para oferecer de melhor.

Sobre c++ eu só tomaria cuidado com alocação de memória, uso de bibliotecas como a STL, os construtores (que podem ser chamados antes da sua função main) e outras coisinhas....

De resto, vai fundo.

--
Você recebeu essa mensagem porque está inscrito no grupo "sis_embarcados" dos Grupos do Google.

Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para sis_embarcado...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para sis_emb...@googlegroups.com.
Acesse esse grupo em http://groups.google.com/group/sis_embarcados.
Para mais opções, acesse https://groups.google.com/d/optout.

marcelo martins

unread,
Aug 24, 2015, 1:59:34 PM8/24/15
to sis_emb...@googlegroups.com
O C é recomendado quando se tem pouca memória, exemplo micro controladores, para micro processadores, exemplo raspberry ai não há limitação.

A diferença do c e do c++, é que o codigo gerado em c++ é mais pesado, justamente porque leva consigo um conjunto de classes que as vezes nem é utilizada.
No c, isso já é mais amenizado. não que nao exista


--

Diego Sueiro

unread,
Aug 24, 2015, 2:06:55 PM8/24/15
to sis_emb...@googlegroups.com

Abraços,

--
*dS
Diego Sueiro

Administrador do Embarcados
www.embarcados.com.br

/*long live rock 'n roll*/

Gustavo Melo

unread,
Aug 24, 2015, 4:06:42 PM8/24/15
to sis_emb...@googlegroups.com
Eu tenho usado C++ para sistemas embarcados desde 2011, mas só utilizo microcontroladores ARM.
Realmente foi a melhor coisa que eu já fiz. Como eu tinha muita experiência em desenvolvimento Java e também C (embarcado), C++ caiu como uma luva.
Orientação objeto ajuda na modelagem e arquitetura do software de forma a aproveitar melhor o reuso e também portabilidade. O poder de processamento dos microcontroladores mais modernos fazem o overhead das chamadas de métodos (funções) se tornarem irrelevantes. A manutenção do código é muito melhor por causa da modelagem de alto nível de abstração. Os ganhos são muitos.
Entretanto, eu procuro evitar os recursos runtime da linguagem. Instanciação dinâmica (new, malloc, ...), tratamento de exceções e etc eu não uso para deixar tudo o mais determinístico possível. Instancio tudo que preciso de forma estática.

Alain Mouette

unread,
Aug 24, 2015, 4:11:44 PM8/24/15
to sis_emb...@googlegroups.com
Gostei da resposta... Se usar C++ "com moderação" pode ter muitos benefícios.
Claro que em uC não tão pequenos como PIC16 ou 8051...

Alain Mouette
=== Projetos especiais: <http://lnkd.in/dEu8cNq> ===

Jerônimo Lopes

unread,
Aug 25, 2015, 6:39:20 AM8/25/15
to sis_emb...@googlegroups.com
"We’ve all heard the stories of the C++ program that runs horribly slow, uses tons of
memory, or leaks memory like a sieve. C++ is not the problem; it’s the use of C++ that is
the problem. C++ is a big, complex and powerful language. With that power comes the
responsibility to wield the power safely and effectively. C++ does not cause bad
programs, bad programming does." 

Vale lembrar que o Arduino é em C++

Euripedes Rocha Filho

unread,
Aug 25, 2015, 6:48:37 AM8/25/15
to sis_emb...@googlegroups.com
Livro, com licença apache 2.0 que encontrei por esses dias. Ainda estou no início da leitura, portanto sem maiores comentários.
https://www.gitbook.com/book/arobenko/bare_metal_cpp/details

Luis Filipe Rossi

unread,
Aug 25, 2015, 7:08:00 AM8/25/15
to sis_emb...@googlegroups.com

2015-08-24 17:06 GMT-03:00 Gustavo Melo <gustav...@gmail.com>:
Eu tenho usado C++ para sistemas embarcados desde 2011, mas só utilizo microcontroladores ARM.
Realmente foi a melhor coisa que eu já fiz. Como eu tinha muita experiência em desenvolvimento Java e também C (embarcado), C++ caiu como uma luva.
Orientação objeto ajuda na modelagem e arquitetura do software de forma a aproveitar melhor o reuso e também portabilidade. O poder de processamento dos microcontroladores mais modernos fazem o overhead das chamadas de métodos (funções) se tornarem irrelevantes. A manutenção do código é muito melhor por causa da modelagem de alto nível de abstração. Os ganhos são muitos.
Entretanto, eu procuro evitar os recursos runtime da linguagem. Instanciação dinâmica (new, malloc, ...), tratamento de exceções e etc eu não uso para deixar tudo o mais determinístico possível. Instancio tudo que preciso de forma estática.

Meus 2 cents..

O que o Gustavo mencionou é um cenário bem razoável. Usar C++ apenas para a abstração pode ser bem benéfico em questão de rendimento. 

Por outro lado é uma questão sua de controle de código. Por C ser uma linguagem extremamente simplista, você tem uma boa noção de o que está acontecendo do baixo nível. No C++ isso nem sempre é tão transparente. No fundo o que existe no C (a mais que o básico do básico) são ponteiros, ponteiros de funções, estrutura de dados. O resto é tudo mágica que se faz em cima disso. A própria alocação dinâmica de memória no fundo é uma região da memória que você explicitamente reservou para ficar trocando de uso e controla o que ta ocupado e o que não tá.. nada mais. Então no fundo você sabe muito bem o que se passa no baixo nível por que não nem nada além disso, ponteiros são endereços de memória alocados em uma variável e estrutura de dados são variáveis armazenadas juntas com uma regra definida no momento da compilação.. e acabou. 

Ja em C++ o céu é o limite e até coisas básicas como Classes tem suas formas de implementação no baixo nível de forma nem tão transparente e com passos escondidos. Exemplo básico é você chamar um método de uma classe .. no fundo isso se abstraí com uma função onde uma das variáveis é um ponteiro para a própria instância da classe. Essa variável a mais acaba indo escondida na chamada.

Não estou dizendo que é ruim e que é perigoso, porém é uma questão de conforto que acaba fazendo as aplicações mais chatas tendendo para C. 


--
Luís Filipe Rossi

Luciano Campos

unread,
Aug 25, 2015, 8:55:43 AM8/25/15
to sis_embarcados

Helio coragem

unread,
Aug 25, 2015, 6:02:52 PM8/25/15
to sis_embarcados
Luciano,

Grato por compartilhar. Nunca ri tanto.

COOL!
Reply all
Reply to author
Forward
0 new messages