Pourquoi y a-t-il une horloge dans mon arduino?

9

Bien sûr, je sais qu'il est utile de contrôler le temps d'un retard, mais toute autre utilisation?

Avec une horloge 16Mhz, chaque ligne de mon programme prendra 1/16000000 seconde, non?

même une très très grande ligne ne prendra que 1/16000000 de seconde?

Avec une horloge à 8 MHz, chaque ligne prendra le double du temps, non? Donc toute la "boucle principale" prendra le double temps aussi, non?

n0tis
la source
3
Vous confondez les instructions C et les instructions de la machine (assemblage). Mais même si vous avez écrit directement en assembleur, vous pourriez en trouver bon usage car le programme n'est PAS linéaire. Je veux dire, les interruptions, comme son nom l'indique, interrompent le flux de code normal en passant à une autre instruction, puis en reprenant. Alors peut-être qu'entre une ligne et la suivante, il est obligé d'exécuter l'ISR, qui peut être très long
frarugi87
2
Si vous synchronisez votre puce à huit millihertz, même la ligne de code la plus simple prendra une éternité. Je vous suggère d'utiliser une horloge dans la gamme méga hertz (MHz).
Edgar Bonet
Le nombre de cycles nécessaires pour exécuter chaque instruction machine est indiqué dans le manuel d'instructions .
Edgar Bonet
Merde, je devrais aller dormir;), édité merci
n0tis

Réponses:

13

Pourquoi y a-t-il une horloge dans mon arduino?

Parce que c'est ainsi que fonctionnent les ordinateurs et les microcontrôleurs, etc.

Avec une horloge de 16 MHz, chaque ligne de mon programme prendra 1/16000000 seconde, non?

Non.

même une très très grande ligne ne prendra que 1/16000000 de seconde?

Non.

L'horloge définit à quelle vitesse les instructions du code machine sont extraites de la mémoire et exécutées. La plupart des instructions prennent 1 cycle d'horloge, mais certaines en prennent plus.

Une ligne de code C peut être compilée en un nombre quelconque d'instructions d'assemblage, qui sont ensuite converties en code machine (nombres bruts). Cela peut aller de 1 instruction d'assemblage à des milliers d'instructions d'assemblage, selon ce que fait la ligne.

Avec une horloge de 8 MHz, chaque ligne prendra le double du temps, non? Donc toute la "boucle principale" prendra le double temps aussi, non?

Chaque opération dans la puce est régie par l'horloge. Si l'horloge est à la moitié de la vitesse, la puce fonctionne à la moitié de la vitesse, donc chaque opération prendra deux fois plus de temps, oui.

Majenko
la source
aussi, interrompt.
njzk2
1
Nitpick mineur: Devrait être "... n'importe où parmi 0 instructions d'assemblage ...", même sans optimiseur, mais encore plus après optimisation.
Peter
2
Ne confondez pas le pauvre garçon. Il a déjà assez de mal.
Majenko
@Majenko: la confusion est une nécessité. C'est difficile.
intelfx
@intelfx "IT"? Ceci est la programmation, pas ....
BalinKingOfMoria Réintégrer CMs
10

Pas de réponse dans le post de @ Majenko: Oui, avec une horloge à 8 MHz, chaque ligne prendra le double du temps. A moins que la ligne n'attende quelque chose qui n'est pas piloté par horloge - par exemple une entrée externe.

En plus de la réponse de @ Majenko, un processeur dispose d'une horloge pour s'assurer que les instructions sont complètes, avant le début de l'étape suivante. Un CPU est fait de beaucoup de transistors (j'ai trouvé une référence qui indiquait que l'AtMega était dans la gamme des millions bas, donner ou prendre un ordre de grandeur).

Pendant un cycle, l'électricité circule à travers la puce, activant / désactivant des transistors, dont les résultats activeront / désactiveront plus de transistors, etc. Pendant que cela se produit, certaines parties de la puce ont une "mauvaise" valeur - vous pouvez la considérer comme étant à mi-chemin d'un calcul (vous avez ajouté la colonne un et la colonne 10s, et vous êtes sur le point de commencer le Colonne des années 100). Vous ne voulez pas que cela affecte le monde extérieur, donc (par exemple) vos broches de sortie sont verrouillées - quelle que soit leur valeur - jusqu'à ce que l'instruction soit terminée. Le temps nécessaire pour terminer une instruction varie, mais le fabricant élabore l'instruction la plus lente dans les pires circonstances.

Pour l'AtMega (qui est la puce de l'Arduino), Atmel (qui a conçu la puce) a déclaré que c'était 1/20 000 000 de seconde - c'est 20 MHz.

Notez que tous les microprocesseurs n'exécutent pas toutes leurs instructions à 1 instruction par cycle - certaines instructions peuvent prendre 1, 2 ou 10 cycles. Le pipelining rend les choses encore plus compliquées - un processeur peut effectuer une partie du travail (par exemple, récupérer l'instruction suivante) dans un cycle, l'exécuter dans le suivant - mais pendant qu'il exécute l'instruction 1, il peut également extraire l'instruction suivante. Pour ce faire, il faudra peut-être deviner quelle instruction vient ensuite (dans le cas de l'équivalent du code machine d'un "goto" - tel est utilisé pour les boucles), et s'il devine mal, il doit faire face à cette; jetez l'instruction récupérée et récupérez la suivante en perdant un cycle.

La page Wikipédia sur le pipelining d'instructions montre un exemple de pipelining de puce RISC en 5 étapes - récupération des instructions, décodage des instructions, exécution, accès à la mémoire et réécriture. Ainsi, vous pouvez avoir 5 instructions à un certain stade d'exécution, qui se chevauchent. Jusqu'à la phase de "réécriture", les instructions n'ont aucun effet réel. Vous pouvez considérer cela comme une chaîne de montage - il faut 7 minutes pour assembler un widget, mais il peut être décomposé en 5 étapes, la plus longue étape prenant 2 minutes. Une fois toutes les deux minutes, chaque widget partiellement terminé est déplacé par la chaîne de montage vers la station suivante. Vous obtenez un widget toutes les deux minutes - l '"horloge" ne peut que cocher aussi vite que l'étape la plus lente. Si vous poussez le widget plus rapidement, le "goulot d'étranglement" aura de plus en plus de widgets mis en file d'attente.

AMADANON Inc.
la source
L'AVR a un pipeline très superficiel: uniquement récupérer et exécuter. Ensuite, les sauts conditionnels prennent un cycle (saut non effectué) ou deux cycles (saut effectué).
Edgar Bonet
Complication supplémentaire: cache raté.
Martín-Blas Pérez Pinilla
Il y a beaucoup de choses que je n'ai pas mentionnées: cache (de tout type), multi-threading, multi-core ... Je suis probablement déjà allé trop loin dans mon post.
AMADANON Inc.