2010-09-13 31 views
1

Sorte d'une extension de Converting to ASCII in C, je me demandais exactement comment les divisions sont gérées sur un PIC18X.Comment les divisions sont traitées dans le PIC18 ISA

Si j'effectue une opération DIV, combien d'instructions le compilateur interprète-t-il? Combien de cycles d'horloge faut-il pour que l'opération se termine? Le nombre de cycles dépend-il de mon dividende, de mon diviseur ou des deux? Comme une question secondaire moins importante: Quelle était la première CPU à inclure le matériel de division dédié?

Répondre

1

Les diviseurs sont lancés de façon lâche dans la programmation de nos jours, mais je suis toujours sensible à leur faire beaucoup de projets de microcontrôleur. Avec une photo, vous avez déjà une main et une jambe attachée derrière votre dos pour commencer, faire une division est effrayant. J'ai essayé de faire la même chose (binaire à ascii décimal) sur un PIC16 et c'était douloureux. Donc, mon compteur de vitesse homebrew était en hexadécimal ou je faisais un horrible if-then-else. Les compilateurs C gratuits pour la photo n'étaient pas disponibles à ce moment-là.

Quoi qu'il en soit, le 8086 avait une division. Le 8085 ne semble pas. Mais l'ENIAC a fait, et une racine carrée il apparaît. Maintenant, alu compte-t-il comme un processeur pour répondre à votre exigence «premier processeur avec une division»? Les machines mécaniques antérieures à l'ENIAC pourraient également se diviser. Le PDP-11 ne semble pas en avoir un. Ne pas en voir un sur le z80/8080, non sur le 6502. 6800 non mais 68000 oui. 8051 oui étonnamment et le 8031. Certains des plus anciens, 6502, 8088/86 je sais en particulier, avaient des calculs BCD. Donc, au lieu de faire vos calculs en binaire et en essayant de faire un tas de diviser par 10 pour mettre un format ASCII décimal humain, vous faites votre calcul en bcd depuis le début, puis il s'agit plus d'une conversion en hex sans la partie supérieure. lettres, Maj droite 4 et avec 0xF ajouter 0x30, et avec 0xF ajouter 0x30, répéter.

1

Normalement, le nombre de cycles pour l'opération DIV varie (la feuille de données fournit généralement un cycle maximum #). Un compilateur correct ne se soucie pas vraiment du nombre de cycles que prend l'instruction, mais fait plutôt une optimisation différente (c'est-à-dire que la division par la puissance de 2 est traitée comme des décalages).

Vous voudrez peut-être vérifier this website pour divers routines pour PIC.

1

Dépend de la longueur variable. Vérifiez Microchip page Web: AN614

De AN614 ...

 Clocks 
FXD3232S 630 32 bit/32 bit -> 32.32 signed fixed point divide 
FXD3232U 683 32 bit/32 bit -> 32.32 unsigned fixed point divide 
FXD3231U 588 32 bit/31 bit -> 32.31 unsigned fixed point divide 
FXD3131U 579 31 bit/31 bit -> 31.31 unsigned fixed point divide 
FXD3224S 529 32 bit/24 bit -> 32.24 signed fixed point divide 
FXD3224U 584 32 bit/24 bit -> 32.24 unsigned fixed point divide 
FXD3223U 489 32 bit/23 bit -> 32.23 unsigned fixed point divide 
FXD3123U 481 31 bit/23 bit -> 31.23 unsigned fixed point divide 

Donc, pour 32 bits/32 bits est nécessaire 630 cycles CPU.