Introduction

Contexte

1970 vs aujourd'hui

L'informatique personnelle a commencé dans les années 1970, l'Apple II était l'un des premiers produits grand public.

Steve Wozniak qui tient l'un des premiers ordinateurs personnels d'Apple.

1970 (Apple II)2023
CPU1 MHz3 GHz
Coeurs116
RAM4 KB32 GB
Stockage140 KB1 TB
Architecture8 bits64 bits
VRAM08 GB

Loi de Moore

La loi de Moore est une observation empirique qui dit que le nombre de transistors dans un circuit intégré double tous les deux ans.

Un regard critique

Loi de Wirth: Software is getting slower more rapidly than hardware becomes faster.

Loi de May: Software efficiency halves every 18 months, compensating Moore's law.

Les développeurs se sont peu à peu éloigné des aspects "bas niveau" de leur machine

Performance vs confort des développeurs

La montée en puissance des ordinateurs n'a pas forcément eu que des effets positifs sur les logiciels. Les développeurs privilégient souvent la simplicité et la rapidité de développement à la performance.

Désenchantement logiciel

Quelques constats fréquents:

  • Les logiciels sont lents
    • Windows 10 pouvait prendre 30 minutes à se mettre à jour...
    • Le temps de réécrire 5 fois le SSD entièrement
    • Pourquoi un smartphone met de 30 à 60 secondes à démarrer ?
  • Les logiciels sont énormes
    • Windows 95 pesait 30 Mo...
    • ... l'application clavier de Google utilise 150 Mo de RAM
  • Les logiciels sont vite obsolètes

Billet de blog complet (Nikita Tonsky, 2018)

Motivation

L'embarqué

Système Embarqué: Système informatique qui est intégré à un objet, un appareil ou un système plus complexe.

Un système embarqué vient en général avec des contraintes, de taille, de puissance, de consommation, de coût, de fiabilité...

Pourquoi faire de l'embarqué ?

On peut mentionner plusieurs raisons pour informaticien d'apprendre à faire de l'embarqué:

  • Reprendre contact avec le matériel et le bas niveau,
  • Meilleure compréhension du fonctionnement des ordinateurs et des systèmes d'exploitation,
  • Possibilité de fabriquer des objets physiques intégrant du code,
  • Prise de conscience des performances et de la consommation de nos logiciels (avec 2KB de RAM, on peut quand même faire beaucoup de choses !).

Déroulé du cours

Nous allons partir à l'aventure dans les tréfonds des l'informatique, et nous allons apprendre à programmer des microcontrôleurs.

Ce cours développera vos compétences en:

  • Compréhension de l'électronique (schémas, composants, bus bas niveau etc.),
  • Programmation C bas niveau,
  • Capacité à lire et comprendre les documentations techniques des composants,
  • Compréhension du fonctionnement d'un microcontrôleur.

Le cours sera essentiellement illustré autour de l'ATmega328P, un microcontrôleur 8 bits très répandu dans le monde de l'embarqué.

Arduino

Nous utiliserons des cartes Arduino Uno rev3, mais nous n'utiliserons pas l'IDE Arduino, de manière à découvrir les aspects bas niveau de la programmation d'un microcontrôleur.

Nous vous invitons à tester Arduino en dehors de ce cours si vous en avez l'occasion!

Architecture

Tout commence par du sable

Les circuits intégrés sont fabriqués à partir de silicium, un matériau très abondant dans la nature. Ils sont gravé sur des disques de silicium appelés wafers.

Ce processus optique se nomme la photolithographie.

Ces galettes sont ensuite découpées en puces qui sont ensuite encapsulées dans des boîtiers:

Avec un même wafer, le même circuit peut être vendu sous différentes formes (avec des boîtiers différents).

Le boîtier montré ci-dessus est "gros", ce qui peut être pratique pour le prototypage.

Ces composants sont alors soudés sur des cartes électroniques, que l'on appelle PCB (Printed Circuit Board):

Types de circuits intégrés

Il existe plusieurs types de circuits intégrés:

  • Microprocesseurs: CPU seul, sans mémoire, ni périphériques
  • Microcontrôleurs: CPU + mémoire + périphériques,
  • ASIC: Circuit intégré conçu pour une application spécifique,
  • FPGA: Circuit intégré reconfigurable.

Mémoire

Un microcontrôleur est composé de plusieurs types de mémoire:

ROM (Read Only Memory)

Stockage permanent (typiquement le programme), Nécessite un effacement par bloc, Limité en nombre d'écritures.
ATmega328p: 32KB

RAM (Random Access Memory)

Mémoire volatile (perd son contenu à l'extinction), Stockage temporaire (variables, pile, etc.), Accès rapide,
ATmega328p: 2KB

EEPROM (Electrically Erasable Programmable Read-Only Memory)

Stockage permanent (typiquement configuration, numéros de série, etc.), Peut être effacée par octet, Limité en nombre d'écritures.
ATmega328p: 1KB

Von Neumann vs Harvard

Il existe deux approches classiques pour l'architecture d'un microcontrôleur:

Von Neumann

Les données et le programme sont stockés dans la même mémoire.

Harvard

Les données et le programme sont stockés dans des mémoires séparées.
Architecture de l'ATmega328p

Programmation

Avant toute chose, il est nécessaire de disposer de la documentation technique du microcontrôleur, que l'on appelle datasheet:

Datasheet de l'ATmega328P

Il s'agit de la documentation technique du microcontrôleur que nous allons utiliser.

Architecture de l'ATmega328P

Le programme que nous écrirons sera stocké dans la mémoire flash du microcontrôleur (ROM). Un programme destiné à être embarqué sur un microcontrôleur est appelé firmware. (Nous verrons plus tard comment programmer la mémoire flash).

À chaque couple d'horloge (ou cycle d'horloge), le microcontrôleur exécute une instruction décodée à partir de la mémoire flash.

L'Atemga328P est un microcontrôleur 8 bits, ce qui signifie qu'il peut traiter 8 bits de données à la fois.

Par exemple, une addition de deux nombres de 8 bits nécessite 1 cycle d'horloge.

Le microcontrôleur est architecturé autour d'un bus de données de 8 bits, qui permet de transférer des données entre les différents composants du microcontrôleur:

Datasheet de l'ATmega328P, Page 9

Registres

Datasheet de l'ATmega328P, Page 18

Les adresses mémoires inférieures à 0x0100 sont réservées aux registres du microcontrôleur. Ces adresses se comportent comme de la mémoire, mais ont des fonctions spécifiques.

La RAM commence à l'adresse 0x0100.

Un exemple: les broches d'entrée/sortie

Afin d'écrire notre premier firmware, nous pouvons par exemple choisir de contrôler les broches du microcontrôleur.

Ces dernières sont regroupées par lot de 8 dans des ports (PORTB, PORTC, PORTD). La LED de la carte Arduino est par exemple connectée à la broche PB5.

Les registres DDRx permettent de configurer les broches d'un port en entrée ou en sortie, et les registres PORTx permettent de configurer les broches d'un port en niveau haut ou bas.

Datasheet de l'ATmega328P, Page 72

Dans la partie suivant, nous découvrirons comment écrire et charger un firmware sur le microcontrôleur à l'aide du langage C.