Programei o Arduino e comecei a programar o Teensy. Eles são semelhantes a C, mas existem pequenas nuances na linguagem de programação.
Por exemplo, no C do Arduino, você chama uma função pinMode (pino #, Saída / Entrada) para designar um pino digital para emitir ou receber sinais. No C de Teensy, você define o registro "DDR" associado a uma das quatro portas (cada uma representando uma coleção de pinos) que você designa coletivamente como entrada ou saída ( sintaxe do Teensy IO ).
Gostaria de saber se, ao usar um microcontrolador novo para você, você precisa aprender efetivamente um novo "idioma". Coloquei a palavra "linguagem" entre aspas porque, apesar das nuances na sintaxe, os componentes e como eles são configurados no software são fundamentalmente equivalentes. sinais.
Do mesmo modo: existem microcontroladores que não estão programados em software ou sempre haverá uma camada de software usada para programar o uController? Se este último, quem escreve / fornece documentação para eles?
fonte
Respostas:
Microprocessadores e microcontroladores normalmente usam uma arquitetura compartilhada entre diferentes linhas de produtos e fabricantes. Essas arquiteturas geralmente definem um conjunto de comandos de baixo nível ( conjunto de instruções ) comum a todas as implementações. O compilador AC ou C ++ poderá gerar bytecode executável em todos os processadores ARM, por exemplo.
No entanto, a arquitetura é apenas metade da imagem. Como existem muitos endereços de memória específicos, periféricos internos, gerenciamento de memória e outros detalhes de implementação que a arquitetura não aborda
Um fabricante ou terceiro normalmente fornece uma coleção de arquivos de origem (um HDK ) que fornece definições, mapeamentos de portas e código de exemplo. Normalmente, o HDK é para C e C ++ . Normalmente, o HDK terá uma placa de demonstração associada (pense em $ 500 arduino). Muitas vezes, é necessário muito trabalho de configuração detalhada para ajustar a plataforma de desenvolvimento / amostra ao dispositivo que você está projetando
O Arduino é baseado na arquitetura do AVR e é suportado principalmente pelo Atmel. O Arduino criou um carregador de inicialização da plataforma e uma biblioteca de funções e objetos C ++ simplificados para você usar a plataforma com o mínimo esforço. A plataforma Arduino e o IDE foram projetados para entusiastas com equipamento mínimo. Antes do arduino, o PIC desempenhava um papel semelhante com um ambiente BASIC fácil de usar e barato.
Em um ambiente profissional, normalmente esse suporte é fornecido pelo fornecedor / fabricante ou terceirizado. Eles fornecem o código e os cabeçalhos de baixo nível e você escreve seu aplicativo com esse HDK; em organizações maiores, isso pode ser feito internamente. Existe uma tendência recente para os fabricantes criarem um ecossistema aberto de API / Software em torno de sua plataforma, o que os torna tão fáceis de usar como o arduino. Ainda existem inúmeros chips com muito pouco suporte à programação e a maioria dos conhecimentos de plataforma bloqueados no mundo corporativo.
fonte
O idioma neste caso é exatamente o mesmo. O ambiente do Arduino possui algumas bibliotecas extras (apenas mais código C) que 'envolvem' o acesso aos registros de hardware reais (DDRx, PORTx, INx, etc.) com funções um pouco mais amigáveis. Isso aumenta a sobrecarga (mais instruções precisam ser executadas para a mesma operação), mas aumenta a flexibilidade, pois é "simples" escrever um programa que use apenas essas chamadas e, em seguida, redirecioná-lo para um chip diferente (por exemplo, um mega do arduino) e a biblioteca manipulará o mapeamento adequado internamente.
Não há realmente APIs 'padrão' para acesso realmente de baixo nível através de chips de diferentes fornecedores. No entanto, todo o acesso de baixo nível é feito da mesma maneira - lê e grava em endereços de memória fixos -, portanto, o método geral de acesso será semelhante entre partes diferentes, apenas os detalhes e nomes serão diferentes. Talvez alguém apenas forneça aos arquivos de cabeçalho listas enormes de #defines endereços de registro convertidos em ponteiros. Ou talvez os arquivos de cabeçalho usem estruturas para manter as coisas organizadas com um pouco de hierarquia. Alguns fabricantes também podem fornecer APIs de nível superior. Isso pode ser muito útil para periféricos complexos e difíceis de configurar. O GPIO é muito simples, mas algo como um controlador USB com suporte a DMA pode ter centenas de registros.
Portanto, a conclusão é que sim, você precisará aprender alguns novos nomes de registro, mas o idioma ainda é C ++ (ou C, assembly ou talvez algo mais esotérico).
fonte
main()
pré-definido para você. Em vez disso você tem dois pontos de entrada:init()
eloop()
(me corrija se eu estiver errado, mas eu só tocou Arduino com um pólo de 20 pés)Você está confundindo microcontroladores e compiladores. As linguagens de alto nível nas quais você pode programar qualquer micro específico é uma função de quais compiladores estão disponíveis para esse micro.
No nível baixo, o micro executa instruções da máquina, que um compilador obtém para o arquivo de texto que você considera ser o "programa". Você está realmente especificando alguma lógica para executar, e o compilador descobre como usar as instruções de máquina disponíveis para implementar essa lógica. Nesse caso, o que você programa é uma função do compilador, não o conjunto de instruções nativas do micro.
Você pode programar um micro especificando diretamente instruções nativas. Isso é feito usando a linguagem assembly. Como um compilador, o assembler é um tradutor que pega um arquivo de texto que você escreve e produz instruções de máquina como resultado. A diferença é que, neste caso, você está especificando diretamente essas instruções da máquina. Cada instrução recebe um nome e você os escreve em vez dos códigos binários, mas ainda está especificando as instruções diretamente. O montador apenas faz o trabalho pesado de descobrir a codificação binária exata de cada instrução a partir do nome e das opções que você escreve no arquivo de texto.
Embora uma linguagem de alto nível possa ser a mesma em micros muito diferentes, as instruções da máquina geralmente são semelhantes apenas em uma família de micros relacionados. Por exemplo, todos os Microchip PIC 18 têm o mesmo conjunto de instruções (principalmente), que é diferente do PIC 16 básico e novamente diferente das partes de 16 bits, como o PIC 24 e o dsPIC 30 e 33.
fonte
A linguagem de programação ainda é C. Mas a biblioteca do fabricante para acessar o hardware é diferente. Até onde eu sei, não existe um padrão, portanto cada fabricante tem sua própria API. Se você deseja ser portável entre diferentes fabricantes, pode introduzir sua própria API abstrata para acessar o hardware com implementações específicas que mapeiam sua API para os métodos específicos do fabricante.
fonte
Outras respostas fizeram a distinção entre linguagens de alto nível (como C ++) e código de máquina, embora eu não acredite que isso invalide sua afirmação de que cada microcontrolador tem uma 'linguagem' associada.
As diferenças de implementações de idiomas não são grandes o suficiente para serem classificadas como idiomas diferentes, embora eu não hesite em diferenciá-las em 'dialetos'. Duas camadas de mudança podem existir aqui.
Vamos considerar esses pontos enquanto observamos a plataforma Arduino.
Sabendo disso, como você decide como programar qualquer microcontrolador arbitrário? Você tem várias opções:
Para referência, aqui está uma lista de backends suportados pelo GCC. Você notará que há suporte para ARM, AVR, MIPS e alguns outros.
Sobre chips que não são programados com 'software' ...
Você pode querer olhar para matrizes de portas programáveis em campo (FPGAs)! Os FPGAs são controlados alterando os valores das tabelas de consulta para emular portas lógicas. Isso não possui uma forma de software correspondente, mas ainda é desenvolvido usando linguagens de descrição de hardware como VHDL e Verilog.
fonte
Olho para uma placa de circuito impresso e vejo alguns dispositivos de montagem em superfície, alguns resistores, capacitores e leds. Isso significa que, como uma dessas placas é uma placa de vídeo, todas as placas com resistores e capacitores e várias camadas e traços são todas placas de vídeo? Não.
Aqui está outro exemplo: esta página da web usa o alfabeto e as palavras em inglês. O site do New York Times também o torna no New York Times? Não, eles apenas compartilham o mesmo alfabeto e idioma, mas são completamente diferentes.
C é uma linguagem de programação de uso geral que abstrai as instruções definidas abaixo. Pode ser usado para bare metal, pode criar sistemas operacionais diferentes e incompatíveis entre si, pode criar videogames etc. Todos os quais usam a mesma linguagem C básica, algumas funções e construções C comuns, bem como chamadas de função que eles criaram, específicas para o aplicativo de destino. Para cada uma dessas plataformas mencionadas ou outras, pode haver um conjunto de funções que alguém escolheu criar. Assim como um punhado de pessoas até agora, inclusive eu, lhe dei a mesma resposta, mas a escrevi de uma maneira diferente. Pegue 100 programadores, isole-os um do outro e dê-lhes uma tarefa de programação para resolver um problema específico, sem restringir completamente sua liberdade de programação, e você terá de 1 a 100 soluções diferentes, incompatíveis entre si, provavelmente não 1, mas vários temas comuns, dependendo de seu treinamento e experiência, e nomes de variáveis e nomes de funções que, como conjunto, provavelmente são exclusivos para cada indivíduo. Pegue as mesmas placas que você já está falando e você descobrirá que certamente tenho meu próprio código C incompatível (com as funções do arduino) para rodá-las, como em muitas outras, e incompatível com outras plataformas. Essa é a beleza da programação incorporada bare metal, você não é limitado de forma alguma, não precisa viver dentro das chamadas de biblioteca padrão dos sistemas operacionais ou do conjunto limitado de regras do guis, etc. liberdade total. provavelmente não 1, mas vários temas comuns, dependendo de seu treinamento e experiência, e nomes de variáveis e nomes de funções que, como conjunto, provavelmente são exclusivos para cada indivíduo. Pegue as mesmas placas que você já está falando e você descobrirá que certamente tenho meu próprio código C incompatível (com as funções do arduino) para rodá-las, como em muitas outras, e incompatível com outras plataformas. Essa é a beleza da programação incorporada bare metal, você não é limitado de forma alguma, não precisa viver dentro das chamadas de biblioteca padrão dos sistemas operacionais ou do conjunto limitado de regras do guis, etc. liberdade total. provavelmente não 1, mas vários temas comuns, dependendo de seu treinamento e experiência, e nomes de variáveis e nomes de funções que, como conjunto, provavelmente são exclusivos para cada indivíduo. Pegue as mesmas placas que você já está falando e você descobrirá que certamente tenho meu próprio código C incompatível (com as funções do arduino) para rodá-las, como em muitas outras, e incompatível com outras plataformas. Essa é a beleza da programação incorporada bare metal, você não é limitado de forma alguma, não precisa viver dentro das chamadas de biblioteca padrão dos sistemas operacionais ou do conjunto limitado de regras do guis, etc. liberdade total. Pegue as mesmas placas que você já está falando e você descobrirá que certamente tenho meu próprio código C incompatível (com as funções do arduino) para rodá-las, como em muitas outras, e incompatível com outras plataformas. Essa é a beleza da programação incorporada bare metal, você não é limitado de forma alguma, não precisa viver dentro das chamadas de biblioteca padrão dos sistemas operacionais ou do conjunto limitado de regras do guis, etc. liberdade total. Pegue as mesmas placas que você já está falando e você descobrirá que certamente tenho meu próprio código C incompatível (com as funções do arduino) para rodá-las, como em muitas outras, e incompatível com outras plataformas. Essa é a beleza da programação incorporada bare metal, você não é limitado de forma alguma, não precisa viver dentro das chamadas de biblioteca padrão dos sistemas operacionais ou do conjunto limitado de regras do guis, etc. liberdade total.
Você pode escolher, e uma alta porcentagem de pessoas, jogar na caixa de areia de alguém em vez de construir a sua própria, ou seja, usar o arduino gui e suas bibliotecas C.
Você pode pegar o mesmo PC e executar versões diferentes do Windows it, linux, bsd e uma lista de outros sistemas operacionais que em algum nível estão usando C, mas cujas chamadas de função são incompatíveis entre si. O mesmo hardware e o C incompatível, que se estende a um hardware diferente, no mesmo idioma, podem ter código compatível ou incompatível. O idioma de forma alguma os torna compatíveis.
C é usado nessas plataformas incorporadas porque essa é a prática comum, não há outro idioma que possa substituir C por isso. O primeiro passo para um novo processador é a montagem, é claro, quase sempre é o C, depois talvez outros se for poderoso o suficiente para executar um sistema operacional (linux, bsd, etc). C foi inventado e esperava resolver o problema no momento de portar código entre plataformas, e desde que você tenha um sistema operacional, é o caso de um compilador compatível com C que cria código que EXECUTAR EM UM SISTEMA OPERACIONAL, executará o arquivo C padrão operações e impressão e coisas assim. Mas o bare metal é uma história diferente: não existe sistema operacional; geralmente não existe noção de sistema de arquivos nem exibição, mas, na prática comum, provavelmente existe um compilador C que, em suas raízes, transforma C em linguagem assembly específica de destino.
fonte
Para responder à sua segunda pergunta, o termo "microcontrolador" implica que o chip possui uma CPU e RAM (e provavelmente ROM) a bordo. Todos os microcontroladores executam software - é por isso que gostamos deles.
Aprofundando-se na primeira pergunta, observe que, embora (quase?) Todas as MCUs possuam um compilador C, a linguagem C básica não suporta todas as instruções em todos os processadores. Por exemplo, C possui operadores de deslocamento esquerdo / direito, mas nenhum operador de rotação esquerdo / direito. O sistema de ponteiros do C não suporta naturalmente espaços separados de programa e endereço de dados (como em algumas arquiteturas de Harvard). C não tem suporte direto ao SIMD.
Os compiladores têm algumas opções para lidar com esses recursos:
Estenda o idioma base, geralmente com novas palavras-chave (por exemplo, local e remota para memórias paginadas).
Forneça funções intrínsecas (por exemplo, __ror () e __rol () para rotação).
Trabalhe-os no otimizador para que sequências de operações C sejam compiladas em uma instrução eficiente (por exemplo, uma multiplicação / acumulação).
Ignore-os e faça com que o usuário escreva o código do assembly, se desejar recursos fora do padrão C.
O próximo nível é os arquivos de cabeçalho fornecidos pelo fabricante que definem principalmente todos os registros para você. Você pode fazer isso sozinho, mas é uma grande dor, a menos que você seja um especialista nesse MCU.
Por fim, existem funções de biblioteca fornecidas pelo fabricante, que lidam com as poucas coisas como gravações de registro para você.
Seu exemplo combina dois níveis. DDR é uma macro que se refere a um registro. É implementado como um acesso de ponteiro ou uma função intrínseca do compilador (eu esqueço qual). pinMode () é uma função que grava no registro DDR para você.
Quando você passa de uma linha MCU para outra, precisará aprender novos registros e novas peculiaridades do compilador. Se você permanecer na mesma empresa, poderá obter uma API semelhante. Empresas diferentes não compartilham APIs; por que ajudá-lo a mudar para nossos concorrentes? :-)
fonte
Os microcontroladores geralmente têm microcódigos diferentes no nível do hardware. Para nos impedir de inserir código de máquina (isto é, instruções na forma de números - cada um representando o microcódigo bruto do microcontrolador) ou em assembler simbólico (que fornece uma etiqueta mnemônica para cada instrução de código de máquina), são usadas linguagens portáteis de alto nível.
C e Forth são projetados deliberadamente para serem facilmente portáveis em diferentes conjuntos de códigos de máquina.
Portanto, se você usa C no Arduino e C no Teensy, está usando C nos dois casos.
Se você usasse o Forth no Arduino e o Forth no Teensy, usaria o Forth nos dois casos.
Às vezes, recursos de hardware adicionais solicitam que a pessoa (ou grupo) que está portando o idioma no novo hardware escreva algum código pré-fabricado para permitir que você acesse os novos recursos da plataforma de hardware, sem precisar escrever muito código de baixo nível você mesmo.
Essas bibliotecas (em C) ou dicionários (em adiante) podem ter algumas funções ou palavras específicas de hardware.
fonte