jeudi 15 novembre 2018

Chapitre 51 : Baremetal afficher une icone dans écran externe. Comptage de cycles machines


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