EX02 - Architecture générale des ordinateurs – avec solutions
Exercice 1 : Composants d’un CPU
Dessinez l’architecture générale de l’unité centrale de traitement avec accès au code et aux données. Quelle est la fonction de chacun de ses composants ?
Solution
- Unité de contrôle (CU - Control Unit) : en charge de lire les instructions de la mémoire centrale et de les exécuter à l’aide de l’ALU
- Unité Arithmétique et Logique (ALU - Arithmetic and Logical Unit) : “boîte à outils” (toolbox), elle fournit toutes les opérations logiques et arithmétique nécessaires au traitement des données selon les instructions du programme.
- Registers : banque de registres, mémoire interne au CPU utilisée pour le stockage des données intermédiaires nécessaires au traitement de l’information.
- Bus processeur (µP-Bus) : bus composé d’un bus d’adresses pour identifier/adresser les données en mémoire, bus de données pour le transfert des données entre la banque de registres du CPU et la mémoire (mémoire centrale ou registres des contrôleurs de périphériques)
Exercice 2 : Traitement de l’information
Citez les 3 cycles principaux du traitement de l’information.
Quelles opérations sont effectuées dans chacun de ces cycles ?
Solution
- Fetch: lecture de l’instruction de la mémoire centrale pour la placer dans l’unité de contrôle
- Decode: décodage de l’instruction
- Execute: exécution de l’instruction
Exercice 3 : Classification de Flynn
Quelles sont les caractéristiques principales des quatre architectures selon la classification de Flynn ?
Solution
- SISD: instruction unique, donnée unique (Single Instruction, Single Data)
- SIMD: instruction unique, données multiples (Single Instruction, Multiple Data)
- MISD: instructions multiples, donnée unique (Multiple Instructions, Single Data)
- MIMD: instructions multiples, données multiples (Multiple Instructions, Multiple Data)
Exercice 4 : Performances d’un µP
Quels facteurs influencent les performances d’un processeur (Iron Law) ?
Comment peut-on les influencer ?
Solution
Iron Law:
Les facteurs:
- nombre d’instructions contenues dans le programme
- nombre de cycles d’horloge nécessaires pour exécuter une instruction
- temps d’un cycle d’horloge
Les influenceurs:
- Algorithmique
- Architecture du jeu d’instruction (ISA - RISC vs CISC)
- Fréquence du CPU
Exercice 5 : Représentation de l’information
Comment se représentent des données en mémoire ?
Quelle influence a l’alignement des données en mémoire ?
Que signifie boutisme ?
Solution
La mémoire peut être vue comme un tableau d’octets (8 bits par octet). La taille de la mémoire dépend du nombre de bits utilisé pour l’adresser. Sur des machines 32 bits, c’est généralement 32 bits soit 4GiB.
Une donnée est dite alignée si son adresse est un multiple de sa taille. Si la donnée mal alignée, les performances du processeur se dégrade, car il doit effectuer plusieurs accès pour la lire ou l’écrire. Certains processeurs n’implémentent pas d’accès non alignés. Dans ce cas, le processeur indique une violation d’accès et s’arrête.
Le boutisme (endianness) est la représentation des données en mémoire. 2 types : petit boutisme (little-endian) l’octet de poids faible (LSB - Least Significant Byte) est stocké à l’adresse basse; grand boutisme (big-endian) l’octet de poids fort (MSB Most Significant Byte) est stocké à l’adresse basse.
Exercice 6 : Placement des données en mémoire
Pour la structure C ci-dessous, donnez la représentation en hexadécimale de son instanciation pour une mémoire organisée en octet.
struct S {
int32_t a;
int8_t b;
uint64_t c;
uint16_t d;
char* e;
} s = { .a=1, .b=-2, .c=0xabcdef12345678, .d=0777, .e=0x20004000, };
Solution
Exercice 7 : Caractéristiques des mémoires
Quels types de mémoire centrale existe-t-il et quelles sont leurs principales caractéristiques ?
Quelles différences existe-t-il entre une SRAM et une DRAM et où sont-elles utilisées ?
Quelles différences existe-t-il entre une mémoire Flash NOR et une NAND et où sont-elles utilisées ?
Solution
2 types principaux de mémoires:
- les mémoires volatiles : mémoire vive (RAM - Random Access Memory) - accès direct (aléatoire) et rapide en lecture et écriture à l’information. Les données sont perdues après une coupure de l’alimentation. 2 types principaux de mémoires volatiles: SRAM et DRAM.
- les mémoires non volatiles : mémoire morte (ROM - Read Only Memory) - ne perd pas l’information après une coupure de l’alimentation. Accès à l’information souvent plus compliqué, spécialement en écriture. 4 types principaux: ROM, EEPROM, NVRAM, Flash (NOR et NAND)
SRAM vs DRAM:
- SRAM : mémoire RAM statique, l’alimentation lui suffit pour conserver l’information. Mémoire très rapide (1-2ns on chip, 5-10ns off-chip). Elle s’utilise à l’intérieur des µP comme mémoire cache et des µC comme mémoire centrale. Capacité de quelques kbits à quelques Mbits.
- DRAM: mémoire RAM dynamique, nécessite un rafraîchissement des cellules pour ne pas perdre l’information. Plus lente que les SRAM (Gbit/s). Elle s’utilise sur les µP comme mémoire centrale (off-chip). Capacité entre MiB et GiB.
Flash NOR vs NAND:
- Flash NOR: stockage garanti à 100% sur 20 ans. Accès direct et aléatoire en lecture, permet l’exécution du code directement depuis la Flash NOR. Cycles effacement/écriture: 100‘000. Capacité de quelques KiB à quelques MiB. Elle s’utilise sur les µC pour le stockage du code et des configurations.
- Flash NAND: stockage pas garanti à 100% (bad blocks), nécessite une gestion (HW et/ou SW). Accès par bloc, le code doit être chargé en RAM pour son exécution. Cycles effacement/écriture: 1‘000‘000. Capacité de 100MiB à quelques GiB. Elle s’utilise sur les µP pour le stockage du code et des configurations.
Exercice 8 : Architecture d’un périphérique d’entrées/sorties
Dessinez l’architecture d’un périphérique d’entrées/sorties.
Quels sont les registres principaux d’un contrôleur ?
Quels types d’interfaces existe-t-il avec le CPU ?
Solution
Architecture:
Registres:
- Status: registre d’état - donne des informations sur l’état de fonctionnement du périphérique
- Control: registre de contrôle - permet la gestion du périphérique
- TX/RX: registres pour le transfert des données entre le µP/µP et le système externe
Interfaces:
- MMIO : Memory-Mapped I/O: accès des registres dans l’espace adressable du µP (mêmes accès que la mémoire)
- PMIO : Port-Mapped I/O: accès des registres via un espace dédié aux entrées/sorties (spécialité x86)
- Coprocesseur: accès via un coprocesseur et des instructions spécifiques
Exercice 9 : Pilote de périphérique
Pour s’assurer qu’une application ne reste pas dans une boucle de traitement particulier bloquant le reste du système, les µP modernes disposent de chiens de garde (WDOG - Watchdog Timer). Ces chiens de garde sont des minuteries (timer) qui généralement redémarrent le système s’ils ne sont pas réarmés après un certain laps de temps.
Les processeurs d’applications i.MX7ULP fabriqués par NXP sont équipés de trois de ces chiens de garde. La figure ci-dessus présente sommairement les registres de ces contrôleurs et donne leur emplacement en mémoire.
Questions
- Définissez l’interface C/C++ (structure, constantes, etc.) pour un WDOG
- Déclarez le tableau permettant d’accéder aux registres des 3 WDOG et initialisez-le
- Ecrivez un code pour mettre à 0 le bit
EN
(bit 7) du 2e WDOG, ceci sans modifier les autres bits du registre - Ecrivez un test permettant d’attendre jusqu’à ce que le bit
ULK
(bit 11) du 2e WDOG soit mis à 1 - Ecrivez un code pour effacer (clear) le bit
FLG
(bit 14) du 2e WDOG sans modifier les autres bits du registre
Remarques
- Les registres de ces contrôleurs ne peut être accédés qu’avec des mots de 32 bits
W1C
indique qu’il faut écrire un 1 pour effacer (clear) le bit- Seuls les bits utilisés pour solutionner les questions doivent être déclarés (soit les
bits
FLG
,ULK
etEN
)
Solution
#include <cstdint>
enum WDogs { WDOG_0, WDOG_1, WDOG_2 };
#define CS_FLG (1 << 14)
#define CS_ULK (1 << 11)
#define CS_EN (1 << 7)
struct WDogCtrl {
uint32_t cs;
uint32_t cnt;
uint32_t toval;
uint32_t win;
};
static volatile WDogCtrl* wdogs[] = {
[WDOG_0] = (struct WDogCtrl*)0x41025000,
[WDOG_1] = (struct WDogCtrl*)0x403D0000,
[WDOG_2] = (struct WDogCtrl*)0x40430000,
};
int main()
{
volatile WDogCtrl* wdog = wdogs[WDOG_1];
// effacer le bit EN (mettre à 0)
wdog->cs &= ~CS_EN;
// attendre que le bit ULK soit à 1
while ((wdog->cs & CS_ULK) == 0)
;
// effacer le bit FLG
wdog->cs |= CS_FLG;
}
Exercice 10 : Layout d’un programme
- Quelles sont les sections principales d’une application ?
- Quelle est son organisation pour un système embarqué ?
- Quelle est son organisation pour un système sur puce (SoC) ?
Solution
Les sections principales:
- text : contient tout le code de l’application
- rodata: contient toutes les constantes
- data: contient les données avec une valeur initiale différente de zéro
- bss: contient les données avec une valeur initiale égale à zéro
- heap: zone mémoire entre la fin des .bss et le sommet de la pile (stack) utilisée pour l’allocation dynamique
- stack: pile d’appel
Systèmes embarqués: l’application stockée dans la flash (text, rodata et data) est chargée complètement en RAM pour être exécutée
Systèmes sur puce: l’application stockée dans la flash (text, rodata et data). Le code est exécuté directement depuis la Flash, la section data est copiée dans la RAM.