Lorsque nous vous avions parlé ici même de Linux sur AVR, il y a deux semaines, nous ne nous attendions pas à ce que Dmitry remette le couvert aussi vite. Cette fois-ci, pas de Linux à l'horizon mais de nouveau une réalisation impressionnante : un émulateur Cortex-M0 sur ATTiny85.


D'abord écrit en C puis en assembleur (3x plus rapide), le coeur de l'émulateur tient en 1300 instructions. Côté RAM, l'état de l'émulateur est stocké sur seulement 61 octets et Dmitry nous dit qu'on peut même économiser 4 octets si l'on est prêt à accepter une diminution de 3 % des performances.


Un des problèmes qu'il a rencontrés est l'implantation de la routine de multiplication ; les ATTiny, contrairement à leurs grands frères de la série Mega, sont dépourvus d'instruction mul. Aussi Dmitry a dû écrire une routine complète. Au final, comptez 500 cycles pour multiplier deux entiers sur 32 bits sur un ATTiny, ou 34 cycles sur un ATMega.


Les périphériques de l'AVR sont accessibles au code émulé et, il y a même ajouté des instructions spéciales permettant d'appeler des routines de l'émulateur. Côté vitesse, on est bien loin des 10 kHz de la dernière fois puisque l'ATTiny cadencé à 16 MHz permet d'émuler un Cortex-M0 à 200 kHz.


Mais ce qui est le plus impressionnant, c'est la simplicité et la facilité de lecture du code source. En quelques minutes on comprend comment l'émulateur fonctionne. Une fois de plus, chapeau bas Dmitry.


La prochaine fois, ça sera quoi ? Un Atom Intel simulé sur un unique transistor ? Nous lui souhaitons, en tout cas, de faire des émules.