Beaucoup de projets électroniques actuels utilisent une puce à microprocesseur en raison de la flexibilité offerte par le contrôle logiciel. Mais quel microprocesseur choisir ? Quels langages de programmation faut-il utiliser ? Ce sont des questions importantes pour tout concepteur de projet. Les microprocesseurs RISC-V offrent une flexibilité matérielle supplémentaire. Les coûts des fabricants sont réduits puisqu'ils n'ont pas à se soumettre à des licences et des restrictions en matière de propriété intellectuelle. Sans ces restrictions, les fournisseurs peuvent ajouter des fonctions personnalisées à leur CPU, offrant ainsi des avantages spécifiques aux projets. La spécification RISC-V, bien conçue, est organisée en catégories de fonctionnalités (appelées extensions). Cela permet au fournisseur de choisir de mettre en œuvre uniquement les fonctions requises par l'application. La réduction du nombre de transistors sur une puce a pour conséquence de réduire les besoins en énergie et le coût.

Les amateurs comme les vendeurs bénéficient de la disponibilité de la chaîne d'outils gratuite du compilateur Gnu C/C++. Ce que l'on oublie parfois, c'est que l'assembleur est inclus dans la chaîne d'outils. Dans la plupart des cas, C/C++ continuera à être le langage de programmation le plus productif. Cependant, il reste parfois nécessaire d'utiliser des fonctions grandement optimisées que seule la programmation en langage assembleur permet d'obtenir. Le domaine de prédilection à ce sujet sera le développement de routines courtes de service d'interruption.
 
RISC-V in action
Module RISC-V sur le bureau.

Pourquoi choisir le RISC-V pour votre projet ?

De nombreuses architectures d'instructions existantes ont été étendues pendant des décennies pour que les logiciels existants restent compatibles. Cela oblige le développeur de logiciels à suivre une courbe d'apprentissage abrupte pour maîtriser l'architecture. C'est fastidieux et cela peut entraîner des temps de débogage plus longs et des échéances retardées. La spécification RISC-V a fait table rase du passé et a conçu un nouveau jeu d'instructions.

L'enthousiasme des fournisseurs, y compris Intel, pour RISC-V suggère que l'architecture est une force avec laquelle il faut compter. Cela fait de l'architecture un bon investissement. En vous familiarisant avec le langage assembleur RISC-V, vous pouvez développer directement des fonctions optimisées. Vous pouvez également vérifier les constructions C/C++ au niveau des instructions pour voir ce que le compilateur optimisé a produit pour vous. Parfois, l'optimisation de haut niveau d'un compilateur donne lieu à un code erroné. Par conséquent, l'identification de tels problèmes permet de gagner du temps.
 

De quoi parle ce livre ?

Le livre RISC-V Assembly Language Programming using ESP32-C3 and QEMU est un tutoriel pour vous aider à démarrer. Il est conçu pour être un tutoriel abordable. Chaque chapitre présente quelques notions de base afin que vous n'ayez pas à en apprendre trop d'un coup. Les chapitres suivants s'appuient sur ce que vous avez déjà appris. Chaque projet commence par un programme principal en langage C faisant appel à un ou plusieurs sous-programmes en langage assembleur. Cela démontre l'utilité d'utiliser le langage C/C++ là où il est utile, et d'exploiter en même temps le langage assembleur.
 
RISC-V Book

L'ESP32-C3 a été choisi en raison de son faible coût pour les amateurs et les étudiants. Pourtant, l'unité est très fonctionnelle, avec notamment des fonctions USB, Wi-Fi, SPI,I2C, et d'autres encore. L'ESP32-C3 est une excellente plate-forme pour l'apprentissage de l'ISA RISC-V RV32 (architecture à jeu d'instructions 32 bits). Le système de développement ESP-IDF d'Espressif est utilisé pour l'ESP32-C3. Il n'y a pas de dépendances logicielles Arduino requises.

L'émulateur QEMU permet à l'étudiant d'utiliser son ordinateur de bureau pour exécuter Fedora Linux dans l'ISA RISC-V RV64 (architecture 64 bits). De plus, cet environnement permet à l'étudiant de s'exercer à l'utilisation des extensions à virgule flottante de RISC-V.
 
RISC-V
 
RISC-V
 

Alors, quels sont les avantages avec un CPU RISC-V ?

Le tableau 1 présente les 32 registres entiers de base que le processeur met à la disposition du programmeur. Ils peuvent être appelés x0 à x31 ou par des noms ABI (application binary interface) plus conviviaux, comme a0 pour l'argument zéro. Pour les plates-formes RV32 comme l'ESP32-C3, il s'agit de registres 32 bits. Pour les plates-formes RV64, les registres ont à la place une largeur de 64 bits.

Table 1: Registres de base RISC-V.
Registre Nom ABI  Description
x0 zero Câblé pour envoyer un zero
x1 ra Adresse retour
x2 sp Pointeur de pile
x3 gp Pointeur global
x4 tp Pointeur de fil d'exécution
x5-x7 t0-t2 Registres temporaires
x8 s0/fp Registre sauvegardé / pointeur de pile
x9 s1 Registre sauvegardé
x10-x11 a0-a1 Arguments de fonction / valeur de retour
x12-x17 a2-a7 Arguments de fonction (suite)
x18-x27 s2-s11 Registres sauvegardés
x28-x31 t3-t6 Registres temporaires
 
Avec un aussi grand nombre de registres, une fonction bien construite peut éviter d'accéder entièrement à la mémoire, ce qui permet une exécution plus rapide. Les registres offrent un accès immédiat aux données, alors que l'accès à la mémoire nécessite des cycles d'horloge supplémentaires. Tous les processeurs RISC-V fournissent ces 32 registres, à une exception près. L'extension E pour RISC-V a été développée pour permettre aux fabricants de créer un CPU avec seulement 16 registres. Ceux-ci sont destinés aux microcontrôleurs à très bas prix.

Tous les registres ont les mêmes capacités, à l'exception de x0, qui a un talent particulier. Lorsque x0 est spécifié comme registre source, il fournit la valeur entière zéro. Lorsqu'il est spécifié comme destination du résultat, ce résultat est rejeté. Même si les autres registres sont égaux en fonction, la convention d'appel Gnu réserve des groupes de registres à des fins spécifiques. Les exemples sont a0 à a7, qui sont utilisés pour porter des arguments, t0 à t6 pour contenir des valeurs temporaires et le registre ra (x1) pour recevoir une adresse de retour.

En plus de ces registres, les extensions F, D ou Q du RISC-V ajoutent les registres à virgule flottante suivants, comme indiqué dans le tableau 2.

Tableau 2 : Registres à virgules flottantes et leurs noms ABI.
Registre Nom ABI Description
f0-f7 ft0-ft7 Registres temporaires à virgule flottante
f8-f9 fs0-fs1 Registres sauvegardés à virgule flottante
f10-f11 fa0-fa1 Arguments/valeurs de retour à virgule flottante
f12-f17 fa2-fa7 Arguments à virgule flottante 
f18-f27 fs2-fs11 Registres sauvegardés à virgule flottante
f28-f31 ft8-ft11 Registres temporaires à virgule flottante
 
La largeur de ces registres dépend des extensions prises en charge. L'extension F prend en charge le type flottant du langage C, tandis que l'extension D prend en charge le type double. Enfin, l'extension Q prend en charge le format quadruple à virgule flottante.

Le lecteur attentif aura peut-être remarqué qu'il manque quelque chose. Il n'y a pas de bits d'indicateur d'état, tels que Carry, Overflow, Negative, etc. et donc pas de registre d'état combiné. Les concepteurs de l'architecture RISC-V ont décidé qu'il était préférable de les omettre. Cela réduit la surcharge de la routine du service d'interruption car les indicateurs d'état n'ont plus besoin d'être sauvegardés et restaurés. Le RISC-V répond à ce besoin par d'autres moyens, décrits dans le livre.
 

Remarque finale

Le processeur RISC-V est comme une machine d'état bien huilée. Un jeu d'instructions facile à comprendre vous permet, en tant que programmeur, de diriger chaque étape du processus. Perfectionner ce niveau de contrôle procure une grande satisfaction. Pourquoi ne pas vous amuser en suivant ce tutoriel ?

Traduction : Laurent RAUBER