Un registre commande le matériel
Un registre est une petite case de mémoire de la puce, large de 8 bits, que le programme lit et écrit pour commander le matériel. Changer un seul de ses bits sans toucher aux sept autres est le geste de base de tout système embarqué.
Dans un lave-linge, un registre dit quelle lampe est allumée, un autre si la porte est fermée. Aucun écran, aucun clavier : seulement des nombres que l’on lit et que l’on écrit.
À la fin de cette leçon
Remarque
Je peux lire un registre en binaire et dire ce que fait la mise à 1, l’effacement ou la bascule d’un bit.
Mots-clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Registre | une petite case de mémoire dans la puce, ici de 8 bits | |
| Bit | un chiffre binaire, 0 ou 1 | 1 |
| Masque | un nombre qui choisit les bits à changer | 0b00000100 |
| Mettre à 1 | forcer un bit à 1 sans toucher aux autres | |
| Effacer | forcer un bit à 0 sans toucher aux autres | |
| Basculer | passer un bit de 0 à 1, ou de 1 à 0 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Chaque bit d’un registre a son sens
Un registre de 8 bits contient un nombre de 0 à 255. On l’écrit en binaire, car chaque bit commande une chose précise : une broche, un voyant, un mode.
Les bits se numérotent de la droite vers la gauche, du bit 0 au bit 7. Attention : cette puce est un simulateur d’une puce inventée. Une vraie puce a d’autres registres, d’autres noms et beaucoup plus de règles. Seules les idées sont communes.
Exemple : un registre lu bit par bit
| Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|
| Valeur du registre PORT | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
| Poids du bit | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
| Bit à 1 ? | non | non | non | non | oui | non | oui | non |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Les scripts du labo parlent anglais
Le labo contient un seul conteneur, jupyter, avec la puce simulée dans mcu.py. Le terminal atteint son Python avec docker exec jupyter, qui lance une commande à l’intérieur.
Les scripts du dossier steps affichent des mots anglais, comme registers after reset. Les nombres et les colonnes se lisent pareil : le nom du registre, le nombre en binaire, en hexadécimal, puis en décimal.
Afficher les sept registres
docker exec jupyter python3 steps/registers.pyAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Un masque change un seul bit
Écrire un nombre dans un registre remplace les 8 bits d’un coup. Pour en changer un seul, on lit le registre, on applique un masque, puis on réécrit.
Le masque du bit 2 vaut 1 << 2, soit 0b00000100. Un OU (|) met à 1. Un ET avec le contraire du masque (& ~) efface. Un OU exclusif (^) bascule.
Exemple : trois opérations sur PORT
| Opération | Écriture | Avant | Après |
|---|---|---|---|
| Mettre le bit 0 à 1 | port | (1 << 0) | 0b00001010 | 0b00001011 |
| Effacer le bit 1 | port & ~(1 << 1) | 0b00001011 | 0b00001001 |
| Basculer le bit 3 | port ^ (1 << 3) | 0b00001001 | 0b00000001 |
| Basculer le bit 3 encore | port ^ (1 << 3) | 0b00000001 | 0b00001001 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Changer des bits de PORT
docker exec jupyter python3 steps/bits.pyAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Essayer les masques en Python
# Un registre de 8 bits, ici un volet roulant : le bit 0 monte, le bit 1 descend.
port = 0b00001010
port = port | (1 << 0) # mettre le bit 0 à 1
print("après mise à 1 :", format(port, "08b"))
port = port & ~(1 << 1) # effacer le bit 1
print("après effacement :", format(port, "08b"))
port = port ^ (1 << 3) # basculer le bit 3
print("après bascule :", format(port, "08b"))
# Changez le numéro du bit dans la première ligne, puis relancez.
Une erreur fréquente
Attention
On croit souvent qu’écrire 1 dans un registre ne change que le bit 0. En réalité on remplace l’octet entier : les sept autres bits passent à 0. Pour changer un seul bit, lisez le registre, appliquez un masque, puis réécrivez le résultat.
Lire un bit ou quelques bits
Pour lire le bit n, on décale le registre de n places vers la droite et on garde le dernier bit : (valeur >> n) & 1. On obtient 0 ou 1.
Pour garder les quatre bits de droite, on utilise un ET avec 0b00001111, écrit aussi 0x0F. Les autres bits tombent à 0.