Pour clore ces chapitres, il me restait à intégrer la
gestion d’un clavier pour avoir un système totalement autonome. Vu la complexité
de cette gestion car les claviers connectés au Raspberry doivent passer par le
port USB et donc par son protocole, j’ai essayé de trouver sur Internet des
programmes qui avaient développé cette possibilité. J’ai trouvé 2 drivers sur
github écrits en langage C++ mais à ce jour, je ne suis pas arrivé à faire fonctionner
ces drivers sur mon Raspberry. En attendant de trouver une correction je vous
propose de compléter le chapitre précédent en mettant en place une routine qui
dessine sur l’écran une petite image. Puis de déplacer cette image sur l’écran.
Pour faire simple, l’image est décrite sous forme d’une matrice de x,y bytes qui
prennent la valeur 0 ou 1 suivant que la couleur du pixel doit être celle du
fond ou celle de l’image. Avant cette description, on trouve 2 mots indiquant
la largeur et la hauteur de l’image. Voir la description de zImgCroix dans le
module images.s.
Dans le module FrameBuffer.s nous ajoutons une routine pour
afficher l’image et qui consiste en 2 boucles qui balayent la largeur et la
hauteur de l’image. Il faut bien calculer la position du pixel pour le stockage
dans la zone mémoire du FrameBuffer (ne pas oublier que chaque pixel occupe 4
octets dans la mémoire !!).
Dans le module kernel.s, nous ajoutons un appel à l’affichage
de la croix en précisant sa position en pixel et sa couleur.
Puis nous ajoutons une boucle pour montrer le déplacement d’une
autre croix. Dans celle-ci, nous commençons par afficher l’image puis nous
attendons un certain temps, nous effaçons l’image en la redessinant avec la
couleur du fond puis nous bouclons.
Nous pouvons effectuer quelques tests pour varier la
couleur, le sens du déplacement et la vitesse. Vous pouvez aussi dessiner d’autres
formes.
Plusieurs axes d’améliorations sont possibles :
compacter chaque ligne de la table sur un seul mot de 32 bits (mais cela limite
une image à 32 bits de largeur). A chaque déplacement, le pixel du fond est
remplacé par la couleur noire et donc si l’on veut que l’image se déplace sur
une autre image il faut sauvegardé l 'image du fond et la restaurer après
l’effacement !!
Dans cet exemple, j’ai aussi ajouté dans le module util6.s 2
fonctions pour mesurer le nombre de cycles d’un lot d’instructions. Pour cela
nous faisons appel aux fonctions spéciales du microprocesseur mcr et mrc. Je ne
suis pas du tout sûr des résultats car 1) le nombre de cycles trouvé est
variable si on exécute plusieurs fois les mêmes instructions et 2) il me parait
très grand pour certaines exécutions. Tout cela reste à approfondir !!
Voici le projet complet !!
Aucun commentaire:
Enregistrer un commentaire