Chaque ligne de microcontrôleur a-t-elle son propre langage / syntaxe de programmation?

10

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?

Minh Tran
la source
2
Le langage de programmation pour Arduino est C ++ (pas (seulement) C) - ou peut-être juste un sous-ensemble de C ++ (ou même Processing ). Ce n'est pas tout à fait clair, mais c'est certainement plus que C; par exemple, il a des classes et un opérateur définissable par l'utilisateur + = .
Peter Mortensen
1
C'est du C ++, il se compile en utilisant g ++ - avr. Techniquement, ce serait une implémentation C ++ indépendante, et elle n'inclut pas la bibliothèque standard C ++ (en raison de choses comme l'allocation dynamique de mémoire et des exceptions étant nécessaires). Vous pouvez utiliser des fonctionnalités de langage comme les classes et les modèles, j'ai vu un remplacement digitalWrite () basé sur un modèle qui atteint les mêmes performances que l'accès direct aux registres, la méthode Arduino a tout à fait le surcoût.
r_ahlskog
1
La langue est la même. C'est l'API qui est différente. Si vous vous éloignez des microcontrôleurs et commencez à écrire des applications de bureau, vous rencontrerez exactement les mêmes problèmes lors de l'écriture de programmes C pour Windows, Linux et Mac. Même si vous utilisez uniquement l'API POSIX (prise en charge par les 3 plates-formes), vous rencontrerez toujours des différences spécifiques à la plate-forme lorsque vous souhaitez enregistrer les paramètres / préférences de l'utilisateur.
slebetman

Réponses:

3

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.

crasic
la source
14

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).

alex.forencich
la source
4
Arduino n'est pas tout simplement C (en fait, C ++) - il a un préprocesseur qui fait quelques changements avant de le charger dans le compilateur C.
Nick Johnson
En fait, pour Arduino, c'est plus que C. C'est C ++ (ou peut-être un sous-ensemble de C ++).
Peter Mortensen
Est-ce juste du C ++ natif avec des bibliothèques Arduino, ou quelque chose de plus?
kayleeFrye_onDeck
L'IDE Arduino fait apparemment un peu de prétraitement supplémentaire en plus du C ++ par ailleurs standard. La plupart des IDE ne le font pas.
alex.forencich
C'est fondamentalement C ++ mais avec main()prédéfini pour vous. Au lieu de cela, vous obtenez deux points d'entrée: init()et loop()(corrigez-moi si je me trompe, mais je n'ai touché Arduino qu'avec un poteau de 20 pieds)
slebetman
5

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.

Olin Lathrop
la source
1
L'assembleur résout également les étiquettes des instructions de saut, ce qui est très sujet aux erreurs lorsqu'il est fait à la main.
Pete Becker
2

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.

MrSmith42
la source
En fait, c'est plus que C. C'est C ++ (ou peut-être un sous-ensemble de C ++).
Peter Mortensen
2

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.

  1. Des bibliothèques d'encapsuleurs de haut niveau peuvent être disponibles auprès du fabricant ou d'un tiers
  2. Certains compilateurs peuvent ne pas émettre de code conforme aux normes

Prenons ces points tout en observant la plate-forme Arduino.

  • La communauté Arduino fournit des bibliothèques C ++ très abstraites pour les puces d'architecture AVR. Ces bibliothèques suggèrent un flux de contrôle différent de ce que l'on pourrait attendre d'un programme C ++ typique (par exemple, le masquage de main ()).
  • Sous le capot, Arduino compile son code en utilisant avr-gcc, qui émet du code C / C ++. Cependant, les exceptions ne sont pas bien prises en charge sur les puces AVR et sont presque toujours désactivées. Avec une telle fonctionnalité manquante, le programme résultant pourrait ne pas agir comme le ferait un programme C ++ «normal».

Sachant cela, comment décidez-vous comment programmer un microcontrôleur arbitraire? Vous avez plusieurs options:

  1. Recherchez des bibliothèques et des IDE créés par la communauté pour votre puce spécifique. Les puces AVR sont parfois développées en utilisant uniquement C, mais le projet Arduino offre une expérience plus conviviale pour les amateurs.
  2. Trouvez des compilateurs capables de compiler pour votre puce spécifique. Avec le bon compilateur, les fiches techniques de votre puce et un peu de patience, vous pourrez écrire du code très proche du métal.

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.

Étrange
la source
1

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.

old_timer
la source
En fait, pour Arduino, c'est plus que C. C'est C ++ (ou peut-être un sous-ensemble de C ++).
Peter Mortensen
1

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:

  1. É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).

  2. Fournissez des fonctions intrinsèques (par exemple __ror () et __rol () pour la rotation).

  3. 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).

  4. 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? :-)

Adam Haun
la source
1

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.

Euan M
la source