J'ai programmé l'Arduino et j'ai commencé à programmer le Teensy. Ils sont similaires à C mais il y a de légères nuances dans le langage de programmation.
Par exemple, dans le C d'Arduino, vous appelez une fonction pinMode (broche #, sortie / entrée) pour désigner une broche numérique pour émettre ou recevoir des signaux. Dans C Teensy, vous définissez le registre "DDR" associé à l'un des quatre ports (chacun représentant une collection de broches) que vous désignez collectivement comme entrée ou sortie ( syntaxe Teensy IO ).
Je voudrais savoir s'il est vrai que lorsque vous utilisez un microcontrôleur nouveau pour vous, vous devez apprendre efficacement une nouvelle "langue". Je mets le mot «langue» entre guillemets car malgré les nuances de syntaxe, les composants et la façon dont ils sont configurés dans le logiciel sont fondamentalement équivalents, par exemple, la notion de ports et de broches fait toujours référence à un terminal à partir duquel vous pouvez sortir / entrer du numérique signaux.
Dans le même vain discours: existe-t-il des microcontrôleurs qui ne sont pas programmés dans le logiciel ou y aura-t-il toujours une couche logicielle utilisée pour programmer l'uController? Dans ce dernier cas, qui rédige / fournit la documentation pour eux?
la source
Réponses:
Les microprocesseurs et microcontrôleurs utilisent généralement une architecture partagée entre différentes gammes de produits et de fabricants. Ces architectures définissent généralement un jeu de commandes de bas niveau ( jeu d'instructions ) commun à toutes les implémentations. Le compilateur AC ou C ++ pourra générer un exécutable de bytecode sur tous les processeurs ARM par exemple.
Cependant, l'architecture n'est que la moitié de l'image. Comme il existe de nombreuses adresses mémoire spécifiques, des périphériques embarqués, la gestion de la mémoire et d'autres détails d'implémentation que l'architecture ne traite pas
Un fabricant ou un tiers fournira généralement une collection de fichiers source (un HDK ) qui fournira des définitions, des mappages de ports et des exemples de code. En règle générale, le HDK est pour C et C ++ . En règle générale, le HDK aura une carte de démonstration associée (pensez à 500 $ arduino). De nombreux travaux de configuration détaillés sont souvent nécessaires pour ajuster la plate-forme de développement / exemple à l'appareil que vous concevez
L'Arduino est basé sur l'architecture AVR et est principalement pris en charge par Atmel. Arduino a créé un chargeur de démarrage de plateforme et une bibliothèque de fonctions et d'objets C ++ simplifiés pour que vous puissiez utiliser la plateforme avec un minimum d'effort. La plate-forme Arduino et IDE est conçue pour les amateurs avec un équipement minimal. Avant l'arduino, le PIC remplissait un rôle similaire avec un environnement BASIC facile à utiliser et bon marché.
Dans un environnement professionnel, cette assistance est généralement fournie par le fournisseur / fabricant ou sous-traitée à un tiers. Ils fournissent le code de bas niveau et les en-têtes et vous écrivez votre application avec ce HDK, dans les grandes organisations, cela pourrait être fait en interne. Il y a une tendance récente pour les fabricants à construire un écosystème API / logiciel ouvert autour de leur plate-forme qui les rend aussi faciles à utiliser dès la sortie de la boîte que l'arduino. Il existe encore d'innombrables puces avec très peu de support de programmation, et la plupart des connaissances de la plateforme sont enfermées dans le monde de l'entreprise.
la source
Dans ce cas, la langue est exactement la même. L'environnement Arduino possède des bibliothèques supplémentaires (juste plus de code C) qui `` enveloppent '' l'accès aux registres matériels réels (DDRx, PORTx, INx, etc.) avec des fonctions légèrement plus conviviales. Cela augmente la surcharge (plus d'instructions doivent être exécutées pour la même opération) mais augmente la flexibilité car il est "simple" d'écrire un programme qui utilise uniquement ces appels, puis de le recibler pour une puce différente (par exemple, un méga Arduino) et la bibliothèque gérera le mappage approprié en interne.
Il n'y a pas vraiment d'API «standard» pour un accès de très bas niveau sur les puces de différents fournisseurs. Cependant, tous les accès de bas niveau se font de la même manière - lit et écrit dans des adresses de mémoire fixes - de sorte que la méthode d'accès globale sera similaire entre les différentes parties, seuls les détails et les noms seront différents. Peut-être qu'on fournira simplement des fichiers d'en-tête avec d'énormes listes d'adresses de registre #defines castées en pointeurs. Ou peut-être que les fichiers d'en-tête utiliseront des structures pour garder les choses organisées avec un peu de hiérarchie. Certains fabricants peuvent également fournir des API de niveau supérieur. Cela peut être très utile pour les périphériques complexes et difficiles à configurer. GPIO est très simple, mais quelque chose comme un contrôleur USB avec prise en charge DMA pourrait avoir des centaines de registres.
Donc, l'essentiel est oui, vous devrez apprendre de nouveaux noms de registre, mais le langage est toujours C ++ (ou C, assembly, ou peut-être quelque chose de plus ésotérique).
la source
main()
prédéfini pour vous. Au lieu de cela, vous obtenez deux points d'entrée:init()
etloop()
(corrigez-moi si je me trompe, mais je n'ai touché Arduino qu'avec un poteau de 20 pieds)Vous confondez microcontrôleurs et compilateurs. Les langages de haut niveau dans lesquels vous pouvez programmer un micro particulier sont fonction des compilateurs disponibles pour ce micro.
Au niveau bas, le micro exécute les instructions machine, qu'un compilateur dérive pour le fichier texte que vous lui donnez et que vous considérez comme le "programme". Vous spécifiez vraiment une logique à exécuter, et le compilateur explique comment utiliser les instructions machine disponibles pour implémenter cette logique. Dans ce cas, ce que vous programmez est une fonction du compilateur, pas le jeu d'instructions natif du micro.
Vous pouvez programmer un micro en spécifiant directement des instructions natives. Cela se fait en utilisant le langage d'assemblage. Comme un compilateur, l'assembleur est un traducteur qui prend un fichier texte que vous écrivez et produit des instructions machine en conséquence. La différence est que dans ce cas, vous spécifiez directement ces instructions machine. Chaque instruction reçoit un nom, et vous écrivez ces noms au lieu des opcodes binaires, mais vous spécifiez toujours les instructions directement. L'assembleur ne fait que le gros travail de déterminer le codage binaire exact de chaque instruction à partir du nom et des options que vous écrivez dans le fichier texte.
Alors qu'un langage de haut niveau peut être le même sur des micros très différents, les instructions de la machine ne sont généralement similaires que dans une famille de micros apparentés. Par exemple, tous les Microchip PIC 18 ont le même jeu d'instructions (la plupart du temps), ce qui est différent du PIC de base 16, et encore différent des parties 16 bits comme le PIC 24 et dsPIC 30 et 33.
la source
Le langage de programmation est toujours en C. Mais la bibliothèque du constructeur pour accéder au matériel diffère. Pour autant que je sache, il n'y a pas de norme, donc chaque fabricant a sa propre API. Si vous souhaitez être portable entre différents fabricants, vous souhaiterez peut-être introduire votre propre API abstraite pour accéder au matériel avec des implémentations spécifiques qui mappent votre API aux méthodes spécifiques du fabricant.
la source
D'autres réponses ont fait la distinction entre les langages de haut niveau (tels que C ++) et le code machine, bien que je ne pense pas que cela invalide votre affirmation selon laquelle chaque microcontrôleur a un «langage» associé.
Les différences d'implémentation des langues ne sont pas suffisamment importantes pour être classées comme différentes langues, mais je n'hésiterais pas à les différencier en «dialectes». Deux couches de changement peuvent exister ici.
Prenons ces points tout en observant la plate-forme Arduino.
Sachant cela, comment décidez-vous comment programmer un microcontrôleur arbitraire? Vous avez plusieurs options:
Pour référence, voici une liste des backends pris en charge pour GCC. Vous remarquerez que ARM, AVR, MIPS et quelques autres sont pris en charge.
À propos des puces qui ne sont pas programmées avec un «logiciel» ...
Vous voudrez peut-être examiner les matrices de portes programmables (FPGA)! Les FPGA sont contrôlés en modifiant les valeurs des tables de recherche pour émuler des portes logiques. Cela n'a pas de forme logicielle correspondante en soi, mais est toujours développé à l'aide de langages de description matérielle tels que VHDL et Verilog.
la source
Je regarde un panneau et je vois des appareils de montage en surface, des résistances, des condensateurs et des LED. Est-ce à dire que parce que l'une de ces cartes est une carte vidéo, toutes les cartes avec résistances et condensateurs et plusieurs couches et traces sont toutes des cartes vidéo? Nan.
Voici un autre exemple, cette page Web utilise l'alphabet anglais et les mots anglais. Le site Web de New York Times fait-il donc de ce site Web le New York Times? Non, ils partagent simplement le même alphabet et la même langue mais sont par ailleurs complètement différents.
C est un langage de programmation à usage général qui résume l'ensemble d'instructions ci-dessous. Peut être utilisé pour le métal nu, peut être utilisé pour créer des systèmes d'exploitation différents et incompatibles les uns avec les autres, peut être utilisé pour créer des jeux vidéo, etc. Tous utilisent le même langage C de base, certaines fonctions et constructions C courantes ainsi que les appels de fonction qu'ils ont créés et qui sont spécifiques à l'application cible. Pour chacune de ces plateformes que vous mentionnez ou pour d'autres, il peut y avoir un ensemble de fonctions que quelqu'un a choisi de créer. Tout comme une poignée de personnes jusqu'à présent, y compris moi-même, vous ont donné la même réponse mais l'ont écrite d'une manière différente. Prenez 100 programmeurs et isolez-les les uns des autres et donnez-leur une tâche de programmation pour résoudre un problème particulier, sans restreindre complètement leur liberté de programmation, et vous obtiendrez de 1 à 100 solutions différentes, incompatibles les unes avec les autres, probablement pas 1 mais plusieurs thèmes communs en fonction de leur formation et de leur expérience, puis des noms de variables et des noms de fonctions qui, en tant qu'ensemble, sont probablement uniques à chaque individu. Prenez les mêmes planches dont vous parlez déjà et vous constaterez que j'ai certainement mon propre code C qui est incompatible (avec les fonctions Arduino) pour fonctionner dessus, comme avec beaucoup d'autres, ainsi qu'incompatible avec d'autres plates-formes. C'est la beauté de la programmation embarquée bare metal, vous n'êtes pas contraint en aucune façon, vous n'avez pas à vivre dans les appels de bibliothèque standard des systèmes d'exploitation ou l'ensemble de règles limité, etc., une liberté totale. probablement pas 1 mais plusieurs thèmes communs en fonction de leur formation et de leur expérience, puis des noms de variables et des noms de fonctions qui, en tant qu'ensemble, sont probablement uniques à chaque individu. Prenez les mêmes planches dont vous parlez déjà et vous constaterez que j'ai certainement mon propre code C qui est incompatible (avec les fonctions Arduino) pour fonctionner dessus, comme avec beaucoup d'autres, ainsi qu'incompatible avec d'autres plates-formes. C'est la beauté de la programmation embarquée bare metal, vous n'êtes pas contraint en aucune façon, vous n'avez pas à vivre dans les appels de bibliothèque standard des systèmes d'exploitation ou l'ensemble de règles limité, etc., une liberté totale. probablement pas 1 mais plusieurs thèmes communs en fonction de leur formation et de leur expérience, puis des noms de variables et des noms de fonctions qui, en tant qu'ensemble, sont probablement uniques à chaque individu. Prenez les mêmes planches dont vous parlez déjà et vous constaterez que j'ai certainement mon propre code C qui est incompatible (avec les fonctions Arduino) pour fonctionner dessus, comme avec beaucoup d'autres, ainsi qu'incompatible avec d'autres plates-formes. C'est la beauté de la programmation embarquée bare metal, vous n'êtes pas contraint en aucune façon, vous n'avez pas à vivre dans les appels de bibliothèque standard des systèmes d'exploitation ou l'ensemble de règles limité, etc., une liberté totale. Prenez les mêmes planches dont vous parlez déjà et vous constaterez que j'ai certainement mon propre code C qui est incompatible (avec les fonctions Arduino) pour fonctionner dessus, comme avec beaucoup d'autres, ainsi qu'incompatible avec d'autres plates-formes. C'est la beauté de la programmation embarquée bare metal, vous n'êtes pas contraint en aucune façon, vous n'avez pas à vivre dans les appels de bibliothèque standard des systèmes d'exploitation ou l'ensemble de règles limité, etc., une liberté totale. Prenez les mêmes planches dont vous parlez déjà et vous constaterez que j'ai certainement mon propre code C qui est incompatible (avec les fonctions Arduino) pour fonctionner dessus, comme avec beaucoup d'autres, ainsi qu'incompatible avec d'autres plates-formes. C'est la beauté de la programmation embarquée bare metal, vous n'êtes pas contraint en aucune façon, vous n'avez pas à vivre dans les appels de bibliothèque standard des systèmes d'exploitation ou l'ensemble de règles limité, etc., une liberté totale.
Vous pouvez choisir, et un pourcentage élevé de gens le font, de jouer dans le bac à sable de quelqu'un d'autre plutôt que de construire le vôtre, ce qui signifie utiliser l'arduino gui et leurs bibliothèques C.
Vous pouvez prendre le même PC et exécuter différentes versions de Windows it, linux, bsd et une liste de blanchisserie d'autres systèmes d'exploitation qui à un certain niveau utilisent C mais dont les appels de fonction sont incompatibles entre eux. Le même matériel et le C incompatible, qui s'étend à différents matériels, même langage, peuvent avoir du code compatible ou incompatible. La langue ne les rend en aucun cas compatibles.
C est utilisé sur ces plates-formes embarquées car c'est la pratique courante, aucun autre langage ne peut remplacer C pour cela. La première étape pour un nouveau processeur est l'assemblage bien sûr, puis presque toujours le C suivant, puis peut-être d'autres s'il est suffisamment puissant pour exécuter un système d'exploitation (linux, bsd, etc.). C a été inventé et espérait résoudre le problème de portage de code sur toutes les plates-formes, et tant que vous avez un système d'exploitation, c'est le cas d'un compilateur compatible C qui fait du code qui FONCTIONNE SUR UN SYSTÈME D'EXPLOITATION, fera le fichier C standard opérations et printf et autres choses. Mais le bare metal est une autre histoire, il n'y a pas de système d'exploitation, il n'y a souvent pas de notion de système de fichiers ni d'affichage, mais selon la pratique courante, il existe probablement un compilateur C qui, à sa racine, transforme C en langage d'assemblage cible spécifique.
la source
Pour répondre à votre deuxième question, le terme «microcontrôleur» implique que la puce possède un CPU et une RAM (et probablement une ROM) à bord. Tous les microcontrôleurs exécutent des logiciels - c'est pourquoi nous les aimons.
En approfondissant la première question, notez que même si (presque?) Tous les MCU ont un compilateur C, le langage C de base ne prend pas en charge toutes les instructions sur chaque processeur. Par exemple, C a des opérateurs de décalage gauche / droite, mais aucun opérateur de rotation gauche / droite. Le système de pointeur de C ne prend pas naturellement en charge des espaces d'adressage de programme et de données séparés (comme dans certaines architectures Harvard). C n'a pas de support SIMD direct.
Les compilateurs ont quelques options pour gérer ces fonctionnalités:
Étendez la langue de base, généralement avec de nouveaux mots clés (par exemple, près et loin pour les mémoires paginées).
Fournissez des fonctions intrinsèques (par exemple __ror () et __rol () pour la rotation).
Travaillez-les dans l'optimiseur afin que les séquences d'opérations C soient compilées en une seule instruction efficace (par exemple, une multiplication / accumulation).
Ignorez-les et demandez à l'utilisateur d'écrire le code d'assembly s'il souhaite des fonctionnalités non standard C.
Le niveau suivant est celui des fichiers d'en-tête fournis par le fabricant qui définissent principalement tous les registres pour vous. Vous pouvez les fabriquer vous-même, mais c'est une grande douleur à moins que vous ne soyez un expert de ce MCU.
Enfin, il existe des fonctions de bibliothèque fournies par le fabricant, qui gèrent pour vous les écritures de registre faibles.
Votre exemple mélange deux niveaux. DDR est une macro qui fait référence à un registre. Il est implémenté soit comme un accès pointeur soit comme une fonction intrinsèque du compilateur (j'oublie lequel). pinMode () est une fonction qui écrit pour vous dans le registre DDR.
Lorsque vous passez d'une ligne MCU à une autre, vous devrez apprendre de nouveaux registres et de nouvelles bizarreries du compilateur. Si vous restez dans la même entreprise, vous pourriez obtenir une API similaire. Différentes entreprises ne partagent pas les API; pourquoi voudrions-nous vous aider à passer à nos concurrents? :-)
la source
Les microcontrôleurs ont souvent différents microcodes au niveau matériel. Pour nous éviter de saisir du code machine (c'est-à-dire des instructions sous forme de nombres - chacun représentant le microcode brut du microcontrôleur) ou dans un assembleur symbolique (qui fournit une étiquette mnémonique pour chaque instruction de code machine), des langages portables de haut niveau sont utilisés.
C et Forth sont délibérément conçus pour être facilement portables sur différents jeux de codes machine.
Donc, si vous utilisez C sur l'Arduino et C sur le Teensy, vous utilisez C dans les deux cas.
Si vous utilisiez Forth sur l'Arduino et Forth sur le Teensy, vous utiliseriez Forth sur les deux cas.
Parfois, des installations matérielles supplémentaires inviteront la personne (ou le groupe) à porter la langue sur le nouveau matériel pour écrire du code préfabriqué pour vous permettre d'accéder aux nouvelles installations de la plate-forme matérielle, sans avoir à écrire beaucoup de code de bas niveau toi même.
Ces bibliothèques (en C) ou dictionnaires (en Forth) peuvent contenir des fonctions ou des mots spécifiques au matériel.
la source