FAQ : Quelle différence y a-t-il entre un µC 8 bits RISC (PIC16) et un CISC (HC08)
Une structure interne complexe et … aussi très limitée
Voilà la structure interne d’un PIC récent (16F88) (image jointe)
On y constate déjà que l’adressage de la RAM se fait sur 9 bits, les 7 premiers venant du registre d’instruction et les deux derniers venant du registre « status » et donc « positionnant » les banques. C’est le petit (1) en exposant du « RAM Addr »
Donc, un pic aura comme maximum absolu de mémoire 2^9 soit 512 octets RAM. Ne cherchez donc pas un pic avec plus de mémoire, cela n’existe pas. De même pas question de trouver un PIC avec plus de 8k Mots de programme, l’adressage de cette zone se faisant sur 13 bits.
Enfin, il est amusant de constater les différentes « largeurs de bus » sur cette figure : 3,7,8,9,13,14 bits . mais 35 instructions seulement ? oui mais déjà 5 largeurs de bus. Chez Freescale (HC08), une donnée, c’est un octet et une adresse c’est deux octet. La mémoire s’adresse de manière linéaire sur tous les 64Ko. Des données peuvent être stockées en Flash ou en ram, des programmes peuvent être stockes et exécutés depuis la RAM ou la Flash. Des HC08 avec 32 ou 64 K de flash sont courants.
Un code « spaghetti », pas à la vitesse que l’on croit..
J’ai failli m’y faire prendre !
Entre un PIC16F à 20 Mhz qui exécute une instruction par cycle et un HC08 à 8Mhz dont chaque instruction prend 2 à 3 cycles, quel est le plus rapide ?? Le P.. évidemment ?
La réponse n’est pas ce que l’on croit, en effet : les 20Mhz du PIC sont à diviser par 4 pour avoir le temps de cycle d’une instruction. C’est cette valeur (5Mhz) qui est à comparer aux 8Mhz du Freescale où il est conventionnel de parler de fréquence donnant le temps de cycle. En effet, à quoi sert d’avoir une horloge à 100Mhz, si elle est divisée par 1000 ? Mais nous verrons également plus loin qu’une seule instruction Freescale exécute l’équivalent de 2 à 3 instructions PIC. Donc si une instruction CISC prend de 1 à 4-5 cycles à s’effectuer (3 en moyenne), elle est donc au minimum deux fois plus rapide du fait de la vitesse de la clock CPU.
Même pour l’horloge interne d’un PIC 16F628 qui est à 4Mhz, soit 1 Mhz « cycle » elle reste trois fois plus lente que celle d’ un 908 de base type QY4 ou QB8 avec une horloge interne de 3,2 Mhz.
Voici un petit exemple d’utilisation des « banques » : c’est la procédure d’initialisation du PORTC d’un PIC16F690 :
BCF STATUS,RP0 ;Bank 0
BCF STATUS,RP1 ;
CLRF PORTC ;Init PORTC
BSF STATUS,RP1 ;Bank 2
CLRF ANSEL ;digital I/O
BSF STATUS,RP0 ;Bank 1
BCF...
Donc, il est amusant de constater que sur six instructions, quatre de celles –ci ne servent à rein, si ce n’est à positionner la bonne « banque ».
En assembleur CISC Freescale, ce bout de code s’écrirait en deux lignes :
CLR PORTC
CLR ANSEL
Comparons donc les deux bouts de code du point de vue :
Occupation de la mémoire
PIC : 6x14 bits : 84 bits (soit plus de 10 octets)
MOT : 2x2 octets : 4 octets
Vitesse d’exécution
PIC : 6 cycles
Motorola :
3x3 cycles = 6 cycles
Donc ; en occupant deux fois moins de mémoire, à vitesse de bus égales, la durée serait identique, mais le Freescale est plus rapide » : Son bus, à 8MHZ,équivaudrait à une horloge PIC à 32 MHz….donc de fait deux fois plus rapide que les PIC 16F à 20Mhz.
Ceci confirme d’ailleurs ce qui est généralement constaté et admis (et démontré plus loin) , à savoir que pour une même application, le code PIC est en moyenne DEUX à TROIS fois plus long (et d’autant moins lisible), d’où son appellation « code spaghetti »
Donc, si une instruction CISC occupe en moyenne 2,5 octets .. la même chose en RISC fait aussi environ 2,5 à 3 mots de 14 bits soit au minimum 34 bits ou 4 octets d’ instructions. Occupation de la mémoire programme moindre pour faire la même chose en CISC…EN plus du fait que le PIC16F NE PEUT PAS adresser plus de 8K-mots (voir ci-après).
Les pages.
La structure de longueur fixe des instructions PICs 16 (14 bits) fait que, une fois que l’on retire les trois premiers pour le code instruction, il en reste … 11 pour l’adresse de l’instruction . 11bits .. ne permettrent pas d’adresser plus de 2K. Donc re-bellotte. Pour les Pics avec 8K instructions (le maximum, rappelons le), gros problèmes en perspective pour passer d’une page (de 2K) à une autre (de 2K). Mais microchip a trouvé une « astuce ». Il faut utiliser deux bits d’un registre appelé « PCLATH » Heureusement également , note ami Big… nous a préparé une macro de son goût. Ceci dit, outre le fait que trois instructions supplémentaires (encore de la place mémoire et du temps perdu) sont exécutées à chaque goto, n’est pas ce que l’on peut appeler d’une simplicité et d’une clarté exemplaires (pas pour moi en tous cas).
« Il n’y a que 35 instructions à apprendre » :
un peu d’assembleur CISC comparé au RISC (tiré d’une note microchip TB071)
Voici la manière d’activer les interruptions
CISC : CLI (Clear Interrupt Mask) ; RISC : BCF INTCON,GIE (Bit Clear File …etc.)????
Branchement conditionnel :
CISC : CBEQ Compare and Branch if Equal
En RISC PIC 16 :
SUBWF M,W
BTFSC STATUS,Z
GOTO addr 3 4
A condition que M soit dans la bonne “Banque », sinon, il faut rajouter 2 à 4 “BCF status ..”, “BSF status.. » pour se (re)positionner dans la bonne « banque »
Encore aussi de la mauvaise fois PIC, puisque l’instruction CBEQ ne modifie pas les opérandes, contrairement à la soustraction. Donc, si il fallait vraiment « simuler » un CBEQ, il faudrait une ou plusieurs instructions supplémentaire qui sauvegardent et remettent M à sa valeur initiale !!
D’autre part, l’instruction CBEQ possède un mode d’adressage indirect (indexé) avec post incrément, qui nécessiterait encore x instructions PIC si on voulait réellement le « simuler »
Quelque exemples qui parlent d’eux même :
DAA (Decimal ajust Accumulator, ajustement décimal) instruction d ‘un octet … n’existe pas en PIC 16 , la routine équivalente fait 9 instructions et s’exécute en 10 cycles.
Le « saut » JMP se « traduit(rait) » GOTO en assembleur RISC .. oui, sauf que le « goto ne permet de se déplacer que dans un espace de 2K ; contre 64K pour JMP.
SBC (substract with Carry) soustraction avec retenue s’écrit en RISC PIC 16 :
BTFSS STATUS,C
INCF M,F
SUBWF M,F
Pour terminer un peu de calcul :
Les instructions de multiplication : MUL (8bitsx8bits) et de division DIV (16/8 bits) natives dans les HC08 et qui s’exécutent respectivement en 5 et 7 cycles (sur un bus deux fois plus rapide) n’existent pas chez PIC 16F. Elles doivent être exécutées par des routines respectivement en 74 et 269 cycles.
* * * * * * * * * * * * * * * *
-----