Développement de firmware: introduction

Bonjour, Habr! Je vous présente la traduction des articles de Chris Svec, l'original est ici . Publié avec la permission de l'auteur sous licence CC-A-NC-ND .

Génie logiciel embarqué 101: introduction


Je lance une série de tutoriels sur le développement de firmware. Nous commencerons par décrire un simple microcontrôleur, et après avoir compris comment il fonctionne, nous le développerons pour comprendre comment il fonctionne en ce qui concerne les systèmes complexes tels que Fitbit ou Nest.
J'ai appelé cette série Embedded Software Engineering 101, et elle commence cette semaine ici même sur ce blog.

Lisez la suite pour plus d'explications et de détails.


Certains blocs de construction sur d'autres blocs de construction.

Je travaille avec des systèmes embarqués et développe des puces électroniques depuis plus de 14 ans. J'aime les systèmes embarqués - le matériel, les logiciels et les limitations qui les relient.
L'électronique amateur et des idées comme Arduino , Adafruit et Sparkfun ont permis de lancer facilement quelque chose à partir de matériel et de logiciels au cours du week-end (ou d'un mois ou d'un semestre), créant quelque chose de nouveau, d'intéressant et peut même être utile.

C'est bien! Donner aux gens la possibilité de créer est une chose incroyable; si je voulais m'exprimer durement, je l'appellerais par aspiration «démocratiser la technologie».

La plupart des projets amateurs sont ponctuels. Vous collectez quelque chose, le rendez aussi bon que vous avez assez de temps ou d'énergie, et vous passez à autre chose.
J'ai passé ma carrière à l'autre bout du spectre - la création de produits qui sont des centaines de milliers ou des millions ou plus d'exemplaires - et cela nécessite une façon de penser complètement différente et une approche systématique.

Je veux enseigner aux gens comment écrire un firmware pour ces types de systèmes. J'ai longtemps nourri cette idée pour le cours / guide / livre / blog Embedded Software Engineering 101, et grâce au blog Embedded.fm, je commence à l'implémenter maintenant.

Je suis une personne de type fondamental, donc mon plan est de commencer par les bases, avec une description simple d'un microprocesseur simple, et de développer cette fondation jusqu'à ce que vous compreniez comment fonctionne un système embarqué relativement complexe.

Mon objectif est qu'à la fin de ce cycle, vous puissiez comprendre comment fonctionne Fitbit, un thermostat Nest ou un système embarqué similaire. Vous pouvez commencer à travailler avec des systèmes logiciels intégrés en utilisant une expérience professionnelle.

Le génie logiciel intégré 101 est conçu pour:

  1. Diplômés universitaires dans le domaine de l'informatique, de l'ingénierie informatique ou de l'électronique, intéressés par les systèmes embarqués.
  2. Les amateurs d'électronique amateur qui veulent comprendre plus en profondeur le fonctionnement de leur système sur Arduino et découvrir comment ils évoluent (et si c'est nécessaire!).
  3. , , .
  4. , , -.

Qu'est-ce que je veux dire en disant que je suis une «personne de type fondamental»? Richard Feynman , physicien lauréat du prix Nobel et excellent conteur, l'a exprimé de la meilleure façon possible: "Ce que je ne peux pas recréer, je ne le comprends pas."

Donc, je ne suis pas Feynman, mais je suis sûr que la meilleure façon de comprendre le système est de commencer par les bases. Fort de cette compréhension, vous pouvez créer des systèmes embarqués simples avec un logiciel simple. Et après avoir compris au départ un programme très simple, vous pouvez le développer en créant des logiciels plus complexes au fur et à mesure que l'expérience grandit.

Les bases en premier lieu - ce n'est bien sûr que ma conviction personnelle. Beaucoup de gens ont fait des choses utiles avec Arduino sans comprendre aucune des bases. Cette série d'articles s'adresse à ceux qui veulent encore comprendre les bases et tout ce qui en découle.

Bien sûr, nous devons nous demander - où est le bon niveau pour commencer avec ces «bases» mêmes? Transistors et portes logiques? Non, c'est trop bas pour commencer avec le firmware. Se connecter à des capteurs communs? Non, c'est un niveau trop élevé, il faut trop de connaissances pour commencer.

Je pense que le bon niveau de base est le microprocesseur intégré. Il n'est pas nécessaire de comprendre la physique ou l'électronique pour utiliser le microprocesseur intégré; il n'est pas non plus nécessaire d'être un expert en programmation.

C'est donc là que nous commencerons dans le prochain article.

Avertissement sur les préjugés: dans une vie antérieure, j'étais un développeur architecte / processeur. Commencer ce cycle en comprenant le fonctionnement du CPU n'est peut-être pas le meilleur moyen de comprendre les systèmes embarqués, mais c'est ainsi que fonctionne mon cerveau. Assurez-vous d'essayer d'autres cours / manuels, etc., si vous ne comprenez pas cela après plusieurs articles.

Génie logiciel embarqué 101: bases du microcontrôleur


Nous entamerons notre parcours d'Embineering 101 avec un microcontrôleur modeste. Un microcontrôleur (ou microprocesseur) est la pierre angulaire de tous les systèmes informatiques, embarqués et autres.

MK semble assez compliqué, mais il se compose de trois choses simples: instructions, registres et mémoire. Les instructions sont ces choses que le microcontrôleur sait comment exécuter. Un simple MK est capable d'exécuter moins - il peut avoir, par exemple, 20 ou 30 instructions. Plus tard dans ce cycle, j'utiliserai le microcontrôleur MSP430 de Texas Instruments, qui ne contient que 27 instructions.


Juste une photo de MK (TI MSP430F5529)

Ces 27 instructions sont les seules choses que le MSP430 peut faire. Il peut ajouter deux nombres, soustraire un autre d'un numéro, déplacer des numéros d'un endroit à un autre ou effectuer 24 autres opérations simples. 27 opérations peuvent ne pas sembler suffisantes pour faire quoi que ce soit d'utile, mais en réalité elles seront suffisantes en excès pour mener à bien tout programme envisageable.

Eh bien, cela signifie que le microcontrôleur a des instructions qui font quelque chose avec les chiffres. Mais où sont ces chiffres? Registres et mémoire! Les instructions fonctionnent avec des nombres qui sont stockés dans des registres et de la mémoire.

Les registres sont un référentiel très rapide contenant des nombres qui fonctionnent sur des instructions. Vous pouvez les considérer comme un bloc-notes utilisé par des instructions. MK contient peu de registres, généralement 8-32. Par exemple, le MSP430 possède 16 registres.

La mémoire est également un stockage de nombres, mais elle est beaucoup plus grande et plus lente que les registres. Le microcontrôleur peut avoir 64 Ko, 256 Ko ou même plus de 1 Mo de mémoire. Le MSP430F5529 possède environ 128 Ko de mémoire; c'est plus de 8 000 fois le nombre de ses registres!

Avant de commencer à examiner des exemples, je vous exhorte à vous procurer un morceau de papier et un stylo ou un crayon et à étudier ces exemples pendant que vous lisez. Il est plus difficile de les étudier sur papier que de simplement lire ce que j'ai écrit. Ainsi, vous aborderez soigneusement le processus, et les chances de mémoriser les savants seront plus élevées.

Regardons un exemple fictif mais caractéristique d'un microcontrôleur.

Disons que notre MK possède 4 registres et 8 cellules mémoire. Les registres sont généralement appelés de manière créative, par exemple, «R0», «R1», etc., et nous ferons de même. Les cellules de mémoire sont généralement référencées par leurs nombres, également appelés adresses de mémoire, commençant à la numérotation 0. Voici à quoi ressembleront nos registres et notre mémoire:



Et maintenant je vais y mettre quelques valeurs:



Maintenant, notre microcontrôleur fictif a besoin de quelques instructions.
L'ensemble d'instructions que MK connaît est appelé son ensemble d'instructions. Supposons que dans le jeu, il y aura trois instructions: ADD (ajouter), SUB (abréviation de "soustraire" - soustraire) et MOVE (déplacer). Les instructions doivent obtenir les numéros à partir desquels elles opèrent quelque part, et également placer leurs résultats quelque part, de sorte que certaines d'entre elles contiennent des informations sur l'emplacement des données d'entrée et de sortie.

Par exemple, laissez notre instruction ADD avoir deux sources et un récepteur de données, et tous doivent être des registres. Le manuel peut décrire cette instruction comme ceci:
ADD regist, regPrm
L'instruction ADD ajoute la valeur du registre regGist à la valeur du registre regPrm et enregistre le résultat dans le registre regPrm
Résumé: regPrm = regGist + regPrm
Exemple: ADD R1, R2 effectue l'opération R2 = R1 + R2
Il est généralement accepté dans les instructions d'utiliser également l'une des sources comme récepteur, comme le fait l'instruction ADD, en utilisant regPrm comme source et récepteur de données.

"ADD R1, R2" est un langage assembleur pour un microcontrôleur, c'est un langage de programmation natif MK.

Définissons SUB dans le même style:
Registres SUB, regrpm
L'instruction SUB soustrait la valeur du registre regist de la valeur du registre regprm et stocke le résultat dans le registre regprm
Résumé: regPrm = regPrm - registres
Exemple: SUB R3, R0 exécute l'opération R0 = R0 - R3
Enfin, laissez l'instruction MOVE avoir une source et un récepteur, et soit:

  • les deux arguments sont des registres, soit
  • l'un est un registre et l'autre est un emplacement mémoire.

Le guide du jeu d'instructions se lira comme suit:
1. Registre MOVE, registre
2. Registre MOVE, reg
3. Registre MOVE, rem
L'instruction MOVE copie les données de l'argument East dans l'argument Prm.
Résumé: Il existe trois types d'instructions MOVE
1. regPrm =
regist 2.regPm = memist
3. memPm = reg
Exemple: Je montrerai des exemples de l'instruction MOVE plus loin dans ce post.
Une remarque sur le mot «déplacer» utilisé pour cette instruction: la plupart des jeux d'instructions l'utilisent, bien qu'en réalité les données soient copiées et non déplacées.

Le nom «move» peut donner l'impression que l'opérande source de l'instruction est détruit ou effacé, mais en fait il reste seul, seul le récepteur est modifié.
Passons en revue quelques exemples en utilisant notre microcontrôleur fictif.
Au début, nos registres et notre mémoire ressemblent à ceci:



Maintenant, nous exécutons l'instruction suivante sur le MK:

ADD R1, R2

Il prend la valeur de R1, l'ajoute à la valeur de R2 et stocke le résultat dans R2. Le processeur exécute la plupart des instructions en une seule opération, mais je diviserai l'exécution de chaque instruction ADD, SUB et MOVE en plusieurs étapes avec la flèche "=>" passant par les remplacements (registre / mémoire => valeur):

R2 = R1 + R2 =>
R2 = 37 + 100 =>
R2 = 137

Après avoir exécuté cette instruction, la mémoire est inchangée, mais les registres se présentent maintenant comme suit, avec la valeur modifiée écrite en rouge:



Notez que R1 est inchangé; seul le registre récepteur R2 a changé.
Essayons maintenant l'instruction SUB:

SUB R3, R0

Elle prend la valeur de R3, la soustrait de la valeur de R0 et stocke le résultat dans R0:

R0 = R0 - R3 =>
R0 = 42 - 2 =>
R0 = 40

Après avoir exécuté cette instruction, la mémoire est inchangée, mais les registres ressemblent maintenant à ceci:



Enfin, essayons quelques versions de l'instruction MOVE:

MOVE R2, R0

Cette instruction MOVE copie la valeur de R2 à R0:

R0 = R2 =>
R0 = 137

Et maintenant, les registres ressemblent à ceci:



Ensuite, nous copions le registre dans la mémoire:

MOVE R3, [3]

Cette instruction MOVE copie R3 dans l'emplacement de mémoire 3. Les crochets dans notre jeu d'instructions sont les cellules de mémoire.

[3] = R3 =>
[3] = 2

Les registres sont inchangés, mais la mémoire change:



Et pour notre dernier exemple, nous copions la valeur de la mémoire à enregistrer:

MOVE [6], R0

Ici, la valeur de la cellule mémoire 6 est copiée dans le registre R0:

R0 = [6] =>
R0 = 1

La mémoire est immuable et les registres ressemblent maintenant à ceci:



croyez-le ou non, mais si vous comprenez la plupart de ce que nous venons de discuter sur les instructions, les registres et la mémoire, vous comprenez les bases des microcontrôleurs et du langage d'assemblage.

Bien sûr, j'ai omis de nombreux détails. Par exemple, comment MK obtient-il les instructions à exécuter?

Y a-t-il des instructions plus intéressantes que de simples instructions mathématiques et de copie? La mémoire est-elle la même que la RAM ou le flash, ou non?

Nous répondrons à ces questions dans le prochain article.

All Articles