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.
fonte
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 ++.Respostas:
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.
fonte
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,
boolean
ebyte
não estão no padrão C ++. No entanto, eles são diretamente equivalentes abool
eunsigned 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.
fonte
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:
Então você descobrirá isso
led
ei
não crescerá ou vazará, não importa quantas vezes você ligueblinkTimes
.Se
i
fosse uma classe, que seria semelhante ser eliminados de uma vez que a função terminou. Portanto, desde que você não esteja usandonew
funçõ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
new
efree
funções.Se você estiver usando
new
, precisará ligardelete
nos 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.fonte
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í.
fonte
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 exemploint *blah = new int(5);
), precisará liberá-los você mesmo. Geralmente, não é aconselhável usar dados de heap na programação incorporada.--- 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
new
e saída de código sejam queridos oudelete
nã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ê.
fonte
Na minha experiência, é melhor evitar novas e excluir ao executar em máquinas com memória limitada.
Pode haver casos em que se justifique usar a construção e destruição de instâncias dinâmicas, mas suspeito que sejam raras.
fonte
new
e tambémdelete
estão disponíveis no IDE do Arduino.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.
fonte
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.
fonte
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:
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.
fonte