C ++ vs. a linguagem Arduino?

81

Quais são as vantagens de cada idioma ao usar o Arduino?

Estou pensando que esta é uma boa pergunta geral, mas vou acrescentar um pouco sobre o motivo de perguntar se alguém quer me dar uma dica.

Eu tenho experiência em linguagens pré-processadas como JavaScript, PHP e me diverti com linguagens como Java e Visual Basic. Em outras palavras, conheço técnicas de programação e orientação de objetos clássicos e prototípicos, mas nada sobre a comunicação direta com o hardware.

Estou fazendo um octocóptero e estou pensando que uma abordagem orientada a objetos será a mais fácil. (O software terá muitos recursos ...) No entanto, nunca escrevi em C ++.

Como este é um site de perguntas e respostas que deve ajudar outras pessoas, apenas a pergunta geral apresentada no início é de muita importância, mas eu gostaria de receber comentários sobre a minha situação.

Friend of Kim
fonte
16
Evite o Arduino IDE, pois ele não merece seu nome, é um editor muito ruim: pode ser bom para iniciantes e esboços simples, mas é preciso ir rapidamente para algo melhor.
jfpoilpret
4
Esta é uma análise bastante sucinta do que se entende por (e o que realmente está sob o capô) da "Linguagem de programação do Arduino".
AdjunctProfessorFalcon
10
C++ vs. The Arduino Language?- A "Linguagem Arduino" é C ++. Há um pouco de pré-processamento para poupar você fazendo protótipos de função, mas definitivamente é C ++.
Nick Gammon
2
Não existe linguagem arduino. É simplesmente uma biblioteca.
Overdrivr
2
Não está tão relacionado à pergunta quanto aos comentários: o Atmel studio é gratuito e IMHO é melhor que o visual studio para programação em arduino. Também suporta plug-in do Visual Micro, embora não seja necessário para programar e depurar arduinos.
cyberponk

Respostas:

55

Minha experiência pessoal como professor (programação, mecatrônica) é que, se você tem experiência anterior em programação e conhece conceitos como POO, é melhor optar por C / C ++. O idioma do arduino é realmente ótimo para iniciantes, mas tem algumas limitações (por exemplo, você deve ter todos os seus arquivos na mesma pasta). E é basicamente uma simplificação do C / C ++ (você pode praticamente copiar e colar o código do arduino em um arquivo C / C ++, e ele funcionará). Também faz sentido que você possa usar um IDE bem conhecido como eclipse:

http://playground.arduino.cc/Code/Eclipse

Inicialmente, é necessário um pouco mais de instalação e configuração do seu ambiente de desenvolvimento, mas IMHO vale a pena para programadores com experiência em qualquer outro idioma.

De qualquer forma, não prejudicará você começar a usar a linguagem do arduino e o IDE do arduino por alguns dias para se familiarizar com o hardware do arduino e depois migrar para o C / C ++ com o Eclipse para realmente desenvolver seu projeto.

drodri
fonte
Obrigado por seus pensamentos. Usarei o IDE do Arduino para aprender a controlar todas as diferentes peças de hardware, como sensores e telas de LCD, etc. Você conhece um livro bom e curto para pessoas que conhecem outros idiomas? O "problema" de muitos livros que encontrei é que eles incluem tanto que não preciso porque estou em um pequeno microcontrolador Atmel em vez de em um computador de interface do usuário.
Amigo de Kim
1
Há um belo livro "C Programming for Arduino", de Julien Bayle, que é útil. Não é uma linguagem C ++, mas deve ajudá-lo a entender a base.
fenix688
Esse é um bom pedido: um livro curto e bom com os conceitos básicos de C ++ para programadores de outras linguagens. Desculpe, não posso dar recomendações, não conheço nenhuma boa. Na verdade, escrevi um livro, com um foco prático (desenvolva um videogame) para meus alunos, mas é apenas em espanhol. Para um livro C ++ bom e prático, eu recomendaria o Deitel & Deitel Como programar C ++, você pode pular muitos capítulos avançados.
drodri
1
O C ++ suporta recursos OO, a linguagem C não.
Chris O
1
@FriendofKim Não é exatamente o que eu quis dizer (embora tecnicamente você pudesse, o Due é rápido o suficiente para oferecer suporte a uma solução de software para comunicação serial sem megabit e possui 5 U (S) ARTS no total, enquanto as bibliotecas do Arduino fornecem apenas 4 eles, mas iirc, a placa Due não fornece pinos para um dos USARTs); as bibliotecas do Arduino configuram os USARTs para usar o modo assíncrono, mas eu precisava de síncrono de até 6 Mbps (e eu tinha que usar o modo SPI, pois a entrada tinha que ser tratada como um fluxo de bits bruto, para não interromper bits / etc.), que também envolvia modificando a configuração padrão do controlador PIO.
JAB
48

Em teoria ...
Não existe realmente uma linguagem Arduino como tal. É realmente apenas C ++ com algumas bibliotecas específicas de domínio. Eles adicionam vários recursos, como funções que você pode chamar para controlar o hardware. Se você não tiver essas funções, precisará mexer diretamente com registros especiais para controlar tudo. É assim que a programação embarcada geralmente é feita. É rápido, mas pode ser bastante difícil de aprender e entender.

Além das funções, as bibliotecas adicionam nomes alternativos para alguns tipos. Por exemplo, booleane bytenão estão no padrão C ++. No entanto, eles são diretamente equivalentes a boole unsigned char.

Todas essas coisas significam que você provavelmente pode portar código C ++ geral diretamente para o Arduino sem dificuldade. No entanto, voltar para o outro lado pode exigir algumas edições menores.

Na prática ...
Dito tudo isso, programar para Arduino não é exatamente o mesmo que programação geral em C ++. Muitas das diferenças são comuns a toda a programação incorporada (como memória limitada e poder de processamento).

Também é importante notar que, se você estiver usando o IDE oficial do Arduino, haverá todo tipo de peculiaridades e limitações irritantes sobre como você configura seu código. Existem soluções alternativas em todos os casos (até onde eu saiba), mas às vezes são bastante frustrantes.

Para flexibilidade total, use um IDE de terceiros (como Eclipse) com um plug-in para dar suporte ao Arduino. Isso deve lhe dar todas as vantagens do C ++, juntamente com as bibliotecas do Arduino.

Peter Bloomfield
fonte
25

Quais são as vantagens do C ++ em relação à linguagem do Arduino ao usar o Arduino? Eu tenho experiência em linguagens pré-processadas como JavaScript, PHP e me diverti com linguagens como Java e Visual Basic.

Primeiro, o compilador / IDE do Arduino aceita C e C ++ como está. De fato, muitas das bibliotecas são escritas em C ++. Grande parte do sistema subjacente não é orientada a objetos, mas poderia ser.

Assim, "A linguagem do arduino" é C ++ ou C.

C ++ não é coletado como lixo. Ele gerencia variáveis ​​no escopo - se você escrever:

int led = 13;

void blinkTimes(int value)
{
   int i;

   for(i=0;i<value;i++)
   {
      digitalWrite(led, HIGH);
      delay(1000);
      digitalWrite(led, LOW);
      delay(1000);
   }
}

Então você descobrirá isso lede inão crescerá ou vazará, não importa quantas vezes você ligue blinkTimes.

Se ifosse uma classe, que seria semelhante ser eliminados de uma vez que a função terminou. Portanto, desde que você não esteja usando newfunções de alocação de memória semelhantes ou semelhantes para criar novos objetos, não precisará se preocupar com vazamentos.

Você ainda pode ficar sem memória, se você criar classes enormes e usar um monte deles em funções profundamente aninhadas, mas em geral você não vai ter problemas até que você começar a lidar com newe freefunções.

Se você estiver usando new, precisará ligar deletenos horários apropriados. O C ++ e, por extensão, o Arduino, não possuem coleta automática de lixo, você precisa gerenciar explicitamente sua própria memória.

Adam Davis
fonte
1
Ok, se objetos instanciados (com novos) não forem coletados como lixo, terei que aprender isso também. Suponho que qualquer livro sobre C ++ cubra isso. Obrigado por uma boa resposta!
Amigo de Kim
14

A linguagem do Arduino é C ++, mas é muito diferente da maioria das variedades C ++. A linguagem do Arduino possui muita abstração, especialmente nas interfaces de hardware, o que torna muito simples de usar. Se você possui experiência em Java, C e C ++ devem ser muito semelhantes.

As principais diferenças entre Arduino e C ++ estão no armazenamento de memória. Normalmente, um computador moderno tem mais de 2 GB de RAM, enquanto o Arduino Uno tem 2kB (1 milhão de vezes menos). O Arduino também usa instruções de 8 bits em vez das de 32 bits que um computador usa. Isso afetará principalmente a quantidade de informações que você pode armazenar em uma variável.

Se você é muito novo no mundo do Arduino, deve procurar um tutorial, pois existem muitos bons por aí.

O médico
fonte
Você menciona memória. Eu tenho o Due, que possui 96KB de RAM. Mas a última coisa que quero é que o helicóptero falhe por causa de um vazamento de memória (com uma câmera muito cara montada no helicóptero).
Amigo de Kim
A memória no C ++ é manipulada automaticamente (como o coletor de lixo em Java), se não for especificado de outra forma?
Amigo de Kim
2
O padrão C ++ não garante o tamanho da memória - o c ++ já roda em hardware incorporado sem modificação.
Michael Thorpe
2
Você está descrevendo diferenças entre as plataformas de hardware, mas não o C ++.
Cybergibbons 19/03/14
5
@FriendofKim No C ++, existem duas maneiras diferentes de instanciar variáveis ​​/ objetos. Se você instancia-los localmente (por exemplo int blah = 5;), eles serão destruídos automaticamente quando ficarem fora do escopo (ou seja, no final do loop ou da função). No entanto, se você instancia-los na pilha (por exemplo int *blah = new int(5);), precisará liberá-los você mesmo. Geralmente, não é aconselhável usar dados de heap na programação incorporada.
21413 Peter Bloomfield
14

--- Atualização 170412
Eu escrevi minha resposta original há três anos da perspectiva de existir um "Arduino C ++" distinto. A linguagem usada no IDE é C ++ padrão, porque é implementada pelo compilador GNU C ++. As diferenças "aparentes" surgem porque o IDE fará um pré-processamento para ajudar os recém-chegados à linguagem a evitar algumas 'pegadinhas', preenchendo algumas #includes, f / ex. Mas você pode - e eu faço - escrever C ++ correto e obter exatamente o que você espera obter.
--- finalizar atualização

Limite seu uso dos recursos da linguagem C ++ àqueles cuja implementação você entende completamente. Existem alguns recursos que compilam para um código que consome mais recursos do que é óbvio na leitura do código-fonte. A lista opcionalmente gerada .lss (fonte mesclada e montagem) pode fornecer uma boa visão do que o compilador C ++ fez quando você não estava procurando.

Para sua pergunta sobre memória: C ++ não coleta lixo. Linguagens baseadas em pilha, como C e C ++, alocam armazenamento temporário na pilha para variáveis ​​automáticas na entrada da função, que são liberadas quando a função retorna, mas isso não é uma verdadeira coleta de lixo. Os objetos criados na memória heap ou global permanecem até que você os exclua explicitamente. Saiba onde, quando e por quanto tempo diferentes tipos de objetos serão criados. Você realmente não deseja que seus objetos de entrada newe saída de código sejam queridos ou deletenão. Eles serão criados na memória heap, fragmentando-a e fazendo com que ela cresça na pilha. É quando o seu código - e seu bom 'helicóptero' - falham.

C faz menos por você, para que possa fazer menos com você. Não é uma má escolha. C com alguns dos recursos do C ++ pode ser uma opção ainda melhor, desde que você escolha criteriosamente os recursos extras. C ++, se essas são suas duas opções:

[Resposta original] - C ++ é uma linguagem padronizada. Ele é amplamente implantado em muitos ambientes, incluindo sistemas embarcados e, portanto, é mais amplamente testado do que a linguagem C ++, muito parecida com o "Arduino". Isso é especialmente importante para aplicativos de missão crítica / segurança, como você está planejando. Código caiu significa um helicóptero caiu' e mesmo se ele não machucar alguém, ele vai quebrar a sua máquina cara.

  • Sendo padrão, o C ++ é portátil. Precisa atualizar seu processador? Tudo, exceto o código específico de silício, será portado para o novo. Precisa alterar seu conjunto de ferramentas, sistema de desenvolvimento, sistema operacional host? C ++ será suportado em qualquer lugar. Embora o Arduino IDE seja executado em qualquer lugar que o Java seja suportado, é a única ferramenta que usa o Arduino C ++ e é uma ferramenta muito limitada. Se você deseja usar o Eclipse, as ferramentas do AVR, andar descalço na linha de comando, desenvolver no Emacs ou qualquer outro ambiente que você preferir, o C ++ padrão será suportado.

  • O IDE do Arduino faz coisas pelas suas costas - especificamente, #inclui arquivos .h quando acha que você precisa deles. Mesmo se estiver correto, você realmente deseja escrever, ou pelo menos ver e entender, tudo o que o compilador verá. Linguagens de programação não são feitas para computadores (computadores comem pedaços no café da manhã); eles são feitos para pessoas, especificamente as pessoas que seguem você no projeto, das quais as mais importantes podem ser ... você !, quando 6 meses depois de escrever um módulo, você precisa voltar para aprimorá-lo ou mais provavelmente, conserte-o. Você realmente deseja poder ver tudo o que o compilador vê.

JRobert
fonte
2
Esta é realmente uma boa resposta. Parece claro que você gosta de C ++ e que eu também deveria gostar! ... Mas, falando sério, vou pular direto para C ++ assim que entender como funciona a "comunicação" com os diferentes sensores etc.
Amigo de Kim
Você conhece algum bom livro sobre o assunto? (Adequado para mim que programa há anos em outras linguagens e só precisa da "parte incorporada" do C ++.) #
Friend of Kim
Você acha que o C ++ acelerado é um bom livro para isso?
Amigo de Kim
2
Eu gostaria de poder ajudá-lo com o livro "certo", mas vim para o C ++ com um monte de C atrás de mim e a linguagem de programação C de Kernighan & Ritchie ainda é o meu livro preferido (trocadilhos) por qualquer coisa que não seja explicitamente C ++ , e The Annotated C ++ Reference Manual for C ++ , de Ellis & Stroustrup . Mas, para escrever no hardware, é bom examinar algumas das bibliotecas de dispositivos contribuídas pelos usuários no Arduino.cc . Comece ajustando portas de E / S com pinMode (), digitalWrite () e digitalRead () funções, então o seu analógico i / o homólogos, e, eventualmente, ...
JRobert
1
... planeja gravar diretamente nos registros de E / S para obter melhorias na velocidade e no espaço na memória. Programas como blinky.cpp e hello.cpp são bons lugares para começar a mexer com o hardware. Adicione um multímetro simples e alguns LEDs com os resistores limitadores de corrente certos soldados permanentemente a uma perna e você poderá ver resultados reais, embora simples, de seus esforços. Depois disso, leia as folhas de dados de qualquer hardware que lhe interesse aprender quais sinais você pode ler / deve escrever para fazê-los tocar. Os sensores de temperatura são fáceis de usar e nem todos precisam de um registrador de geladeira? Diverta-se!
JRobert
10

Na minha experiência, é melhor evitar novas e excluir ao executar em máquinas com memória limitada.

  • O gerenciamento de memória em si utiliza um programa valioso e espaço em RAM
  • Os vetores ISR são definidos na compilação. É difícil (impossível?) Para uma instância de classe reivindicar um ISR em tempo de execução
  • Geralmente você saberá em tempo de compilação de quais instâncias de classe você precisa - por exemplo, depuradores de 3 botões, um driver de vídeo e um driver de vídeo de 2 linhas
  • O gerenciamento de memória introduz atrasos desconhecidos quando você usa novo ou exclui.

Pode haver casos em que se justifique usar a construção e destruição de instâncias dinâmicas, mas suspeito que sejam raras.

kiwiron
fonte
Sendo completamente novo em C ++, tenho uma pergunta de acompanhamento sobre as DST. É uma má idéia usar a memória? Caso contrário, como pode ser adicionado (Eclipse)? Eu configurei o compilador AVR e está funcionando bem.
Amigo de Kim
1
Tudo o que você diz está correto, mas não vejo como essa é uma resposta à pergunta do OP. newe também deleteestão disponíveis no IDE do Arduino.
Jfpoilpret 31/03
Não é uma resposta, mas informações muito úteis que eu realmente aprecio.
Amigo de Kim
8

Conforme mencionado em várias respostas, se você estiver programando um sistema incorporado em geral, evite novas, a menos que esteja gerenciando seu próprio heap de memória e realmente saiba qual será o ciclo de vida do seu objeto. Alocação estática ou variáveis ​​de pilha são muito mais seguras. Dito isso, um truque comum para gerenciar itens como buffers de comprimento variável alocados para a duração de uma função é ter uma variável automática (na pilha) que é um objeto que chama de novo em seu construtor e, em seguida, coloca a exclusão no destruidor portanto, quando o objeto sai do escopo, o buffer é liberado de volta para o heap. Novamente, isso geralmente é de uso limitado em pequenos micros, mas é um bom padrão para se lembrar.

bd2357
fonte
6

Além dos comentários acima, gostaria de enfatizar ainda mais os problemas com a RAM de trabalho que você possui nas placas Arduino, particularmente com o Uno (e outros que compartilham o mesmo microcontrolador). Recentemente, escrevi um jogo simples do Space Invaders rodando em uma matriz de LED 32x32 e encontrei repetidamente problemas causados ​​por pouca memória.

O Uno possui apenas 2048 bytes de RAM. A biblioteca da minha matriz ocupou mais de 3/4 dessa quantidade, deixando-me cerca de 400 bytes para o jogo. Como é minha intenção "atualizar" o projeto em algum momento para executar vários jogos com a mesma base de programa no Due, mais poderoso, eu projetei o código com os diretores de OO e muita herança de classe. (A classe do jogo foi herdada com atualização virtual e chamadas de empate, as entidades do jogo foram todas herdadas).

Eu fiquei sem memória apenas adicionando os invasores. Tentei economizar memória colocando em campo suas variáveis ​​de membro, mas acabei novamente ao adicionar os objetos de escudo. Depois de um pouco mais de raspagem, acabei adicionando as bombas / balas. Nesse ponto, vasculhei o código e removi todas as tags "virtuais" (todos os meus protótipos de classe são criados a partir de um snippet do Visual Assist e os destruidores são todos virtuais automaticamente). Isso reduziu pela metade o uso da minha memória instantaneamente, liberando o suficiente para poder concluir o código.

Para encurtar a história, o resultado final é o código C ++ que realmente não usa nenhum recurso de C ++. Você pode estar aderindo ao C e estar ciente do uso da memória. Você não recebe ajuda se exceder os 2 KB - principalmente se estiver usando alguma alocação dinâmica, o código simplesmente para de funcionar e você fica coçando a cabeça por um tempo até considerar a possibilidade de excesso de memória.

PS - As variáveis ​​de campo de bits estão incorretas. Muito mal. Além de adicionar sobrecarga de processamento, perdi a noção do número de vezes que adicionaria um novo estado ao jogo, mas o código não funcionava e não conseguia entender o porquê. Minha variável de estado não era grande o suficiente para conter o novo valor do estado, então eu estava obtendo um estado inesperado.

Mick Waites
fonte
4

A linguagem do Arduino é C ++ (embora geralmente implementada em um estilo mais parecido com "C com classes", o que é realmente bastante comum no mundo dos microcontroladores de sistemas embarcados). Fim da história. Chega de pessoas pensando que já é um idioma diferente! Ele usa o compilador g ++.

Prova:

Habilite a saída detalhada durante a compilação nas Preferências e no upload e você aprenderá muito apenas lendo essas linhas.

Aqui estão algumas dicas adicionais:

Minhas próprias palavras:

O código do Arduino é C ++. As funções principais do Arduino são simplesmente um conjunto de classes e bibliotecas C ++ que você pode usar. É construído e compilado usando o compilador GNU gcc / g ++ . Suas funções setup () e loop () são simplesmente colocadas na função main () obrigatória ( bem aqui na verdade - observe que o arquivo é "main.cpp", que é um arquivo de origem C ++) automaticamente para você e há alguns extras pré-processamento feito para garantir que seja um programa C ++ válido (por exemplo: varredura de todos os protótipos de função [aka: declarações] para você, para que você possa usar uma função mesmo que seu protótipo ocorra posteriormente no arquivo .ino). Grande parte do Arduino é escrito em um "estilo C", no entanto, e, portanto, requer o # extern "C" {}suporte para impedir que o C ++ sejaA função "name-mangling" (também conhecida como "decoração de nome / decoração de nome" ) chama as funções C implementadas pelo AVR-libc , que é a implementação C do ATmega328 e de outros microcontroladores da arquitetura AVR .

Palavras do Arduino:

" Posso programar a placa do Arduino em C?
Na verdade, você já é; a linguagem do Arduino é apenas um conjunto de funções C / C ++ que podem ser chamadas pelo seu código. Seu esboço passa por pequenas alterações (por exemplo, geração automática de protótipos de funções) e depois é passado diretamente para um compilador C / C ++ (avr-g ++). Todas as construções C e C ++ padrão suportadas pelo avr-g ++ devem funcionar no Arduino. Para obter mais detalhes, consulte a página no processo de criação do Arduino . "

Fonte: https://www.arduino.cc/en/Main/FAQ#toc13

Quando usar a biblioteca do Arduino vs C ou C ++ puro?

Portanto, use a linguagem Arduino onde simplifica as coisas e escreva suas próprias funções onde precisar de mais especialização. Eu recomendo me afastar rapidamente do IDE para escrever código - use-o para compilar. Defina as preferências do IDE para usar o "Editor Externo". Em seguida, use um editor de código-fonte profissional / IDE, como Sublime Text 3 , Atom , Visual Studio Code ou Eclipse CDT para escrever seu código. Você pode clicar novamente no IDE do Arduino para compilar e fazer upload. Se você optar pelo Eclipse, existem maneiras de fazer isso no Eclipse (consulte as outras respostas aqui e o artigo Eclipse do playground do Arduino aqui também). Portanto, considere usar essas técnicas também.

Gabriel Staples
fonte