Será possível escrever código em C ++ para microcontroladores PIC no futuro?

8

Alguma vez será possível usar C ++ para codificar PICs? Existe alguma limitação de hardware que nos impede de usar C ++? Quanto o tamanho do arquivo .hex gerado e o tempo de execução do programa aumentam quando usamos C ++ em vez de C? É praticamente possível usar C ++ para PICs atuais? Existe algum plano futuro ou desenvolvimento contínuo disso?

hkBattousai
fonte
Eu acho que é possível e continuará a ser possível, mas AFAIK não é recomendado, uma vez que implementa estruturas de alto nível e funções que não são adequados para fortemente hardware relacionada com a programação
clabacchio
3
Para o debate de adequação - electronics.stackexchange.com/questions/3027/…
Toby Jaffey
2
Como a resposta é "Sim, já existem compiladores C ++", vou deixar isso para trás, mas no futuro você deve estar ciente de que as perguntas do Stack Exchange devem ser sobre fatos verificáveis, não suposições sobre o futuro.
21712 Kevin Vermeer
2
@clabacchio: Não necessariamente verdade. Em C ++, você paga apenas pelo que usa. Veja minha resposta em: electronics.stackexchange.com/questions/3027/…
Rocketmagnet
"PICs" é uma generalização inútil. Em alguns PICs low-end (pense em 10F200), C é quase impossível de usar. Em alguns PICs de ponta (série 32MX), há rumores de que o C ++ seja usado no momento e certamente não há razão técnica para isso. Portanto, uma melhor focalização pode dar uma resposta mais útil, no momento todo mundo está respondendo a uma pergunta diferente.
Wouter van Ooijen

Respostas:

17

Alguma vez será possível usar C ++ para codificar PICs?

Sim, é possível agora. Para o dsPIC, existe o compilador IAR Systems C ++ (embora seja muito antigo e sem suporte).

Outra opção é usar um conversor de C ++ para C. Usando uma etapa de pré-construção, converta o C ++ em C e, em seguida, dê o C (desagradável) ao seu compilador C normal. Dê uma olhada no LLVM ou no compilador C ++ da Comeau, que ambos fazem isso. O Comeau's custa apenas US $ 50, mas provavelmente será necessário algum esforço para que todo o conjunto de ferramentas e bibliotecas funcione corretamente.

Existe alguma limitação de hardware que nos impede de usar C ++?

Resposta curta, não, não há limitações de hardware. Resposta longa, o C ++ certamente encoraja o uso de uma pilha e / ou pilha, com a qual os MCUs menores com RAM limitada terão dificuldade.

Por que eles lutam com um heap / stack? Por duas razões: A) muitos MCUs têm RAM limitada, não o suficiente para um monte de pilha e apenas o suficiente para uma pilha. B) muitas MCUs não lidam bem com ponteiros; portanto, o uso de variáveis ​​na pilha realmente mata o desempenho.

Quando as pessoas perguntam sobre o uso de C ++ em um MCU, acho construtivo comparar C ++ a C. As mesmas perguntas exatamente foram (e ainda são) feitas sobre C em um MCU. As pessoas costumavam recusar a ideia. Uma linguagem de alto nível, em 256 bytes RAM MCU ?? Impossível. Mas agora todos sabemos que é possível. Eu escrevi C para um PIC12. Sem problemas. É possível porque A) os desenvolvedores de software sabem que precisam ser um pouco cuidadosos: não use malloc () etc. eb) o compilador foi escrito especialmente para o MCU. O compilador também terá um cuidado extra com a alocação de memória, não tentará criar um heap e pode não criar uma pilha. Alguns compiladores C simplesmente não permitem escrever código reentrante (recursivo) que exige absolutamente uma pilha.

Sabendo que é possível escrever C para um MCU, as mesmas respostas se aplicam à questão de escrever C ++ em um MCU. Enquanto o compilador entender as limitações do dispositivo de destino e o usuário entender o idioma também, não haverá realmente nenhum problema. Em C ++, você paga apenas pelo que usa. É perfeitamente possível escrever C ++ (com objetos e tudo) que produza a saída ASM exata que você teria se tivesse usado C.

Agora, os PIC32s certamente podem lidar com C ++. Eles têm até 64kB de RAM e são baseados no núcleo MIPS, que é um processador de 32 bits adequadamente desenvolvido. Pode lidar com ponteiros e uma pilha, bem como um PC. De fato, existem PCs baseados no MIPS (ou pelo menos costumavam existir).

Infelizmente, há muito mal-entendido em torno de C ++. Até codificadores muito experientes parecem não ter idéia de como a linguagem funciona. Veja minha resposta sobre por que o C ++ é adequado em CPUs incorporadas.

Quanto o tamanho do arquivo .hex gerado e o tempo de execução do programa aumentam quando usamos C ++ em vez de C?

Como eu disse, pode não haver diferença. Bjarne Stroustrup fez uma comparação de vários compiladores C / C ++ para comparar o desempenho de tempo e espaço em várias operações. Os resultados variaram amplamente. Em alguns casos, o C ++ saiu mais lento e maior, alguns casos mais lento e menor, ou mais rápido e maior, e ainda mais rápido e menor! Portanto, a resposta para sua pergunta é que depende muito do compilador, mas, em geral, não precisa fazer nenhuma diferença. Para mais detalhes, consulte o Relatório Técnico sobre Desempenho em C ++

Existe algum plano futuro ou desenvolvimento contínuo disso?

Isso eu não sei. Eu sei que o compilador Microchip C32 é de código aberto e você pode fazer o download do código-fonte. Também sei que alguém com quem trabalhei encontrou algumas instruções online e conseguiu que o compilador compilasse o código C ++. Mas ele deixou a empresa antes que pudesse me montar uma cadeia de ferramentas adequada.


ATUALIZAR

A Microchip agora tem um compilador C ++ disponível para sua linha PIC32 de MCUs incorporadas.


Rocketmagnet
fonte
da página da IAR na Web: "Produto herdado: IAR Embedded Workbench para dsPIC é um produto herdado. A IAR Systems não o atualiza e não é possível comprar um Contrato de Suporte e Atualização para ele."
Jason S
Eu sei que os produtos IAR são ótimos, mas infelizmente muito caros e parecem "antigos". Eu sei que o C ++ é viável em qualquer plataforma, desde que você não use todos os recursos. No entanto, adiciona a possibilidade de uma camada extra de abstração com classes. Não uso modelos frequentemente, nem alocações de memória dinâmica. Alguém conhece outro concorrente para C ++ no PIC24 / PIC32?
Hans
Sim, desculpe, não foi realmente um ótimo achado. Deixe-me acrescentar mais algumas coisas à minha resposta.
Rocketmagnet
11
Eu consideraria C um concorrente de C ++ em um microcontrolador. Não consigo pensar em nada que eu queira fazer em C ++ que não possa fazer em C e há menos chamadas de função invisíveis (construtores, destruidores, etc.). Torna o código mais determinístico e simples. Quais recursos do C ++ são essenciais e não podem ser confundidos com o C?
precisa saber é o seguinte
11
Alguém poderia perguntar: "Quais são as características essenciais de C que não podem ser confundidas no ASM?" Responda, "Nada". Os benefícios são uma maior capacidade para o designer especificar o design e fazer com que o compilador verifique se a implementação está correta. Veja minha resposta electronics.stackexchange.com/questions/3027/… para obter uma lista dos benefícios reais e imediatos do C ++ a esse respeito.
Rocketmagnet
5

Quanto o tamanho do arquivo .hex gerado e o tempo de execução do programa aumentam quando usamos C ++ em vez de C?

Depende dos recursos que você usa. Se você usar os principais recursos orientados a objetos (classe + métodos), provavelmente terá muito pouco efeito (nomes de variáveis ​​/ funções desconfigurados por mais tempo, portanto a tabela de símbolos provavelmente aumentará um pouco). Os modelos também não devem adicionar muito com um bom compilador.

Se você enlouquecer e usar coisas como a Biblioteca de modelos padrão e usar alocação de memória dinâmica e exceções, é provável que você se depare com um inchaço de código.

Jason S
fonte
Apenas como um aviso para o OP, tenha muito cuidado com a alocação de memória em pequenas arquiteturas de memória e em sistemas sempre em execução incorporados.
Kenny
o "-1" er pode comentar por que ele / ela não concorda?
Jason S
Eu não sou o -1er, mas os modelos são um recurso que deve ser usado com muito cuidado para evitar o inchaço do código. Você pode facilmente acabar com muitas cópias de um algoritmo quando um for suficiente.
Peter Green
Para fazer isso, você realmente teria que usar o modelo com vários tipos de dados diferentes, e uma cópia NÃO seria suficiente, a menos que você esteja usando código polimórfico que possui uma classe base comum. (Nesse caso, há um custo de tempo de execução.) Os modelos não fazem com que seu código inche magicamente, eles apenas causam código inchado quando você os usa com vários tipos de dados quando não está ciente das conseqüências.
Jason S
1

Generalizando um pouco a sua pergunta, existem processadores ARM criados para o mercado incorporado que contêm uma MMU (unidade de gerenciamento de memória). O tamanho e a alocação da memória criaram linguagens como java e c ++ más opções incorporadas. À medida que os processadores embarcados continuam a ficar mais rápidos e poderosos, e à medida que a memória se torna mais densa e barata, as opções de idioma disponíveis para os engenheiros embarcados mudam drasticamente. Um processador ARM de 32 bits e 600 MHz com MMU e um cartão Flash de 64G é um ótimo candidato para aplicativos c ++. Se ele se encaixa na definição do processador embutido clássico é outra questão.

Spearson
fonte
0

Provavelmente sim ... mas você não deveria mesmo assim ... C é a linguagem do incorporado e não há vantagens em usar C ++. Ou melhor, as vantagens do C superam em muito as vantagens do C ++ para incorporado. Não perca seu tempo.

  • se você souber usar ponteiros de função, etc. Você pode codificar como C ++, não há nenhum problema.
Ktc
fonte
5
Eu peço desculpa mas não concordo. Você pode usar muitos recursos do C ++ (classes, modelos, sobrecarga de operador, referências) com pouco ou nenhum custo de tempo de execução. Sim, você pode fazer todas essas coisas em C simples com construções hackeadas, mas é uma chatice no seu cérebro, e eu prefiro usar C ++. (é claro que eu preferiria muito mais estar usando uma linguagem melhor, mas eu escolheria um compilador C ++ num piscar de olhos sobre C. simples)
Jason S
11
Classes = structs (sem métodos internos, mas se desejar, você pode armazenar um ponteiro de função na estrutura e chamar isso). Templates = você usa esses ??? Sobrecarga de operador = sim, eu também gostaria disso. Referências = ponteiros, não? Com C, pelo menos, você usa apenas os 'recursos' de C ++ que deseja, sem se preocupar com excesso de geração de código ou sem incluir uma biblioteca grande aleatória apenas para obter algo para compilar.
precisa saber é o seguinte
11
Eu também imploro para diferir.
Rocketmagnet
3
Sim, os modelos são uma maneira extremamente poderosa de gerar código confiável e de alto desempenho. As referências são um ponteiro mais confiável. Com o C ++, você também paga apenas pelos recursos que usa. Eu acho que você realmente precisa entender mais o C ++.
Rocketmagnet
3
Não sei o que você quer dizer com "C é a linguagem do incorporado". Claro, é muito popular. Você está dizendo que é o melhor idioma possível? Certamente não.
Rocketmagnet