Pourquoi les microcontrôleurs ont-ils besoin d'une horloge


31

Pourquoi les instructions doivent-elles être traitées à des intervalles de temps définis (c'est-à-dire avec l'utilisation d'une horloge)? Ne peuvent-ils pas être exécutés séquentiellement - immédiatement après la fin de l'instruction précédente?

Une analogie avec la nécessité des horloges dans les microcontrôleurs s'avérerait particulièrement utile.


6
Il existe des processeurs asynchrones.
Leon Heller

6
Comment détermineriez-vous «lorsque l'instruction précédente sera terminée»? Si vous y réfléchissez, vous devez savoir quand le message "L'instruction précédente s'est-elle terminée?" le calcul est terminé, et lorsque le "Le calcul" a-t-il terminé l'instruction précédente? "Le calcul" est terminé, et ........ Il est beaucoup plus facile de dire simplement "Il faut 0,4 nanosecondes pour terminer une instruction".
user253751

4
Les portes logiques ne disent pas quand elles sont terminées. Le signal est simplement indéterminé pendant un certain temps avant de se fixer sur une valeur stable. L'horloge permet essentiellement à la conception de savoir quand la logique s'est établie sur une valeur correcte. Les stratégies avancées telles que les micro-instructions aident à diviser les instructions de la machine en petits morceaux, de sorte qu'un ADD peut prendre 4 ticks d'horloge, tandis que l'accès à la mémoire peut prendre des centaines de ticks.

Réponses:


31

Un exemple illustratif ou deux peut aider ici. Jetez un œil au circuit hypothétique suivant:

schématique

simuler ce circuit - Schéma créé à l'aide de CircuitLab

Supposons que les démarrages A et B soient élevés (1). La sortie de l'AND est donc 1, et comme les deux entrées du XOR sont 1, la sortie est 0.

Les éléments logiques ne changent pas leur état instantanément - il y a un retard de propagation petit mais significatif lorsque le changement d'entrée est géré. Supposons que B baisse (0). Le XOR voit instantanément le nouvel état sur sa deuxième entrée, mais la première entrée voit toujours le «périmé» 1 de la porte ET. En conséquence, la sortie passe brièvement à l'état haut - mais uniquement jusqu'à ce que le signal se propage à travers la porte ET, ce qui rend les deux entrées vers le XOR bas et provoque une nouvelle baisse de la sortie.

Le pépin n'est pas une partie souhaitée du fonctionnement du circuit, mais des pépins comme cela se produiront à chaque fois qu'il y a une différence de vitesse de propagation à travers différentes parties du circuit, en raison de la quantité de logique, ou même de la longueur des fils .

Un moyen très simple de gérer cela est de mettre une bascule déclenchée par le bord sur la sortie de votre logique combinatoire, comme ceci:

schématique

simuler ce circuit

Maintenant, tous les défauts qui se produisent sont cachés du reste du circuit par la bascule, qui ne met à jour son état que lorsque l'horloge passe de 0 à 1. Tant que l'intervalle entre les fronts d'horloge montant est suffisamment long pour que les signaux se propagent tous les chemin à travers les chaînes logiques combinatoires, les résultats seront sûrement déterministes et sans pépins.


6
Merci d'avoir mentionné le délai de propagation presque immédiatement, c'est probablement 99% de la réponse.

1
Un exemple concret de ceci en action peut être observé sur les périphériques d'E / S numériques des microcontrôleurs Microchip (et autres). Si vous utilisez les registres PORT pour mettre à jour les sorties (plutôt que le LATCH) à l'aide d'instructions consécutives de lecture-modification-écriture, il est possible de lire l'état de la broche pendant qu'elle change d'état. Voir la section 10.2.2 de la documentation dsPIC33E / 24E pour plus de détails.
Evil Dog Pie

Dois-je comprendre que les circuits séquentiels ont un besoin critique d'horloge non seulement parce qu'ils obtiendront des défauts, mais aussi parce que, à cause de ce problème, certaines bascules peuvent finir par stocker la mauvaise valeur?
Lakesare

20

Je pense que beaucoup de ces réponses ne touchent pas exactement à la question centrale. Le microcontrôleur a une horloge simplement parce qu'il exécute (et est piloté par) une logique séquentielle .

Dans la théorie des circuits numériques, la logique séquentielle est un type de circuit logique dont la sortie dépend non seulement de la valeur actuelle de ses signaux d'entrée mais de la séquence des entrées passées, l'historique des entrées. Ceci contraste avec la logique combinatoire, dont la sortie est fonction uniquement de l'entrée actuelle. C'est-à-dire que la logique séquentielle a un état (mémoire) alors que la logique combinatoire n'en a pas. Ou, en d'autres termes, la logique séquentielle est une logique combinatoire avec la mémoire.

Ainsi que:

Le principal avantage de la logique synchrone est sa simplicité. Les portes logiques qui effectuent les opérations sur les données nécessitent un temps limité pour répondre aux modifications de leurs entrées. C'est ce qu'on appelle le retard de propagation. L'intervalle entre les impulsions d'horloge doit être suffisamment long pour que toutes les portes logiques aient le temps de répondre aux changements et leurs sorties se "stabilisent" à des valeurs logiques stables, avant que l'impulsion d'horloge suivante ne se produise. Tant que cette condition est remplie (en ignorant certains autres détails), le circuit est garanti stable et fiable. Ceci détermine la vitesse de fonctionnement maximale d'un circuit synchrone.


15

Réponse courte: les gestionnaires veulent une preuve de fonction simple et testable avant de s'engager à des millions (ou plus) de dollars dans une conception. Les outils actuels ne donnent tout simplement pas ces réponses aux conceptions asynchrones.

Les micro-ordinateurs et microcontrôleurs utilisent généralement un schéma de synchronisation pour assurer le contrôle de la synchronisation. Tous les coins de processus doivent maintenir la synchronisation à travers tous les effets de tension, température, processus, etc. sur les vitesses de propagation du signal. Il n'y a pas de portes logiques actuelles qui changent instantanément: chaque porte commute en fonction de la tension qui lui est fournie, du lecteur qu'elle reçoit, de la charge qu'elle pilote et de la taille des appareils qui sont utilisés pour la fabriquer, (et bien sûr le nœud de processus (taille de l'appareil) dans lequel il est fabriqué, et à quelle vitesse CE processus se déroule réellement --- CECI passe par le fab). Pour passer à la commutation "instantanée", vous devez utiliser la logique quantique, ce qui suppose que les appareils quantiques peuvent basculer instantanément; (Je ne suis pas sûr).

La logique cadencée permet de prouver que la synchronisation sur l'ensemble du processeur fonctionne sur les variables de tension, de température et de traitement attendues. Il existe de nombreux outils logiciels disponibles qui permettent de mesurer ce timing, et le processus net est appelé «fermeture du timing». La synchronisation peut (et, selon mon expérience, le fait ) prendre entre 1/3 et 1/2 de la puissance utilisée dans un microprocesseur.

Alors, pourquoi pas une conception asynchrone? Il existe peu ou pas d'outils de fermeture de synchronisation pour prendre en charge ce style de conception. Il existe peu ou pas d'outils automatisés de localisation et de routage qui peuvent gérer et gérer une grande conception asynchrone. Si rien d'autre, les gestionnaires n'approuvent rien qui n'a pas de preuve de fonctionnalité simple et générée par ordinateur.

Le commentaire selon lequel la conception asynchrone nécessite "une tonne de" signaux de synchronisation, ce qui nécessitait "beaucoup plus de transistors", ignore les coûts de routage et de synchronisation d'une horloge globale, ainsi que le coût de toutes les bascules qu'exige le système d'horloge. Les conceptions asynchrones sont, (ou devraient être), plus petites et plus rapides que leurs homologues synchronisées. (On prend simplement le chemin de signal ONE le plus lent, et l'utilise pour renvoyer un signal "prêt" à la logique précédente).

La logique asynchrone est plus rapide, car elle n'a jamais à attendre une horloge qui a dû être étendue pour un autre bloc ailleurs. Cela est particulièrement vrai dans les fonctions de registre à logique à registre. La logique asynchrone n'a pas de multiples problèmes de "configuration" et de "maintien", car seules les structures réceptrices terminales (registres) ont ces problèmes, contrairement à un ensemble logique de pipelines avec des bascules entrecoupées pour espacer les délais de propagation de la logique jusqu'à l'horloge limites.

Peut-on le faire? Certainement, même sur un milliard de transistors. Est-ce plus difficile? Oui, mais seulement parce que prouver qu'il fonctionne sur une puce entière (ou même un système) est beaucoup plus impliqué. Obtenir le timing sur papier est raisonnablement direct pour n'importe quel bloc ou sous-système. Il est beaucoup plus difficile de contrôler ce chronométrage dans un système automatisé de localisation et d'itinéraire, car l'outillage n'est PAS configuré pour gérer l'ensemble potentiel de contraintes de chronométrage beaucoup plus important.

Les microcontrôleurs ont également un ensemble potentiellement important d' autres blocs qui s'interfacent avec des signaux externes (relativement) lents, ajoutés à toute la complexité d'un microprocesseur. Cela rend le timing un peu plus compliqué, mais pas beaucoup.

La réalisation d'un mécanisme de signal de «verrouillage» du premier arrivé est un problème de conception de circuit, et il existe des moyens connus pour y faire face. Les conditions de course sont un signe de 1). mauvaise pratique de conception; ou 2). signaux externes entrant dans le processeur. La synchronisation introduit en fait une condition de concurrence signal / horloge qui est liée aux violations de "configuration" et de "maintien".

Personnellement, je ne comprends pas comment une conception asynchrone pourrait entrer dans une situation de blocage ou dans toute autre condition de concurrence. Cela pourrait bien être ma limitation, mais à moins que cela ne se produise lors de l'entrée de données dans le processeur, cela ne devrait JAMAIS être possible dans un système logique bien conçu, et même alors, puisque cela peut se produire lorsque les signaux entrent, vous concevez pour y faire face.

(J'espère que ça aide).

Cela dit, si vous avez de l'argent ...


Bien sûr, cela dépend de la puce que vous créez - par exemple, le matériel de réseau neuronal a tendance à être asynchrone, car c'est en fait la chose la plus simple - la chose qu'ils émulent est asynchrone . Nous construisons principalement du matériel séquentiel synchrone, car le logiciel / micrologiciel est également principalement synchrone et séquentiel (en particulier sur la partie "séquentielle" - le code asynchrone est de plus en plus utilisé). En fait, il est beaucoup plus facile d'enrouler la tête autour d'un système séquentiel et synchrone, surtout lorsque la plupart de la programmation est effectuée dans des langages qui encouragent le code séquentiel.
Luaan

Les événements dans le monde réel se produisent à des moments imprévisibles. Si un appareil a un bouton, et est censé exécuter un chemin de code s'il est poussé "assez tôt" et exécuter un autre chemin de code s'il ne l'est pas, alors en l'absence de limitations quantiques-mécaniques, entre un moment où vous appuyez sur le bouton où une pression sur un bouton se produirait assez tôt pour déclencher le chemin de code alternatif, et un moment où une pression sur un bouton serait "trop ​​tard", il y aurait un moment précis où une pression sur un bouton provoquerait un comportement "entre" les deux (par exemple provoquant la modification de quelques bits du compteur de programmes ...
supercat

... mais pas les autres). En l'absence de limitations quantiques de la mécanique quantique, le temps entre le dernier moment où la poussée provoquerait la branche, et le premier moment où une poussée échouerait proprement à le faire, pourrait être arbitrairement réduit mais non réduit à zéro. Les limites de la mécanique quantique peuvent faire en sorte que toute pression sur un bouton se produise soit assez tôt pour s'enregistrer soit suffisamment tard pour échouer proprement, mais prouver qu'il n'y aura jamais un état quantique qui permettrait une pression sur un bouton dans le temps intermédiaire mortel serait généralement impossible.
supercat

L'utilisation de la logique synchrone simplifie considérablement l'analyse des situations dans lesquelles le système devra répondre à un événement véritablement asynchrone en garantissant que les conditions de concurrence auront une très faible probabilité d'échapper à une très petite partie du dispositif global. Analyser cette petite partie de l'appareil pour s'assurer que les conditions de course sont peu susceptibles de s'échapper est susceptible d'être un problème beaucoup plus traitable que de permettre aux conditions de course de se produire presque n'importe où et d'essayer d'analyser leurs effets pour prouver qu'il est peu probable qu'ils causent des problèmes.
supercat

10

Les microcontrôleurs doivent utiliser une horloge car ils doivent être en mesure de répondre aux événements qui peuvent survenir à tout moment, y compris presque simultanément avec d'autres événements externes ou des événements générés par les contrôleurs eux-mêmes, et auront souvent plusieurs circuits qui doivent savoir si un événement X précède un autre événement Y. Peu importe que tous ces circuits décident que X a précédé Y, ou tous ces circuits décident que X n'a ​​pas précédé Y, mais il sera souvent critique que si l'un des circuits décide que X a précédé Oui, alors tout le monde doit le faire. Malheureusement, il est difficile de garantir que les circuits parviendront dans un délai limité à un consensus garanti quant à savoir si X précède Y, ou même à atteindre un consensus sur le fait qu'ils aient ou non atteint un consensus. La logique synchrone peut énormément aider à cela.

L'ajout d'une horloge à un circuit permet de garantir qu'un sous-système ne rencontrera aucune condition de concurrence sauf si une entrée du système change dans une très petite fenêtre par rapport à l'horloge, et garantit également si la sortie d'un appareil est alimentée dans un autre , la sortie du premier périphérique ne changera pas dans la fenêtre critique du deuxième périphérique, sauf si l'entrée du premier périphérique change dans une fenêtre critique encore plus petite. L'ajout d'un autre périphérique avant ce premier périphérique garantira que l'entrée du premier périphérique ne changera pas dans cette petite fenêtre, à moins que l'entrée du nouveau périphérique ne change dans une fenêtre vraiment très petite. D'un point de vue pratique, à moins que l'on essaie délibérément de provoquer un échec du consensus,

Il est certainement possible de concevoir des systèmes entièrement asynchrones qui fonctionnent "aussi vite que possible", mais à moins qu'un système ne soit extrêmement simple, il sera difficile d'éviter qu'une conception ne soit déclenchée par une condition de concurrence. Bien qu'il existe des moyens de résoudre les conditions de course sans nécessiter d'horloges, les conditions de course peuvent souvent être résolues beaucoup plus rapidement et facilement en utilisant des horloges que ce ne serait le cas sans elles. Bien que la logique asynchrone soit souvent en mesure de résoudre les conditions de concurrence plus rapidement que la logique cadencée, les occasions où elle ne peut pas le faire posent un problème majeur, en particulier compte tenu de la difficulté à ce que certaines parties d'un système parviennent à un consensus pour savoir si elles l'ont atteint ou non.. Un système qui peut constamment exécuter un million d'instructions par section sera généralement plus utile qu'un système qui peut parfois exécuter quatre millions d'instructions par seconde, mais qui pourrait potentiellement se bloquer pendant quelques millisecondes (ou plus) à la fois en raison des conditions de concurrence.


Il convient de noter que les états décidés peuvent également être internes - comme le résultat d'une opération arithmétique. Les retards dus à la longueur de ligne peuvent faire en sorte qu'une partie du MCU voit le résultat - et, sans horloge, agisse dessus - avant les autres parties.
Nick Johnson

@NickJohnson: Si la séquence dans laquelle les opérations sont effectuées ne dépend jamais de choses qui ne sont pas encore calculées, ces problèmes peuvent être résolus sans difficulté si chaque section comme une ALU a des entrées "valides" et une sortie "valide", et des choses peut être organisé de manière à se produire dans un ordre déterministe. Lorsque les roues tombent, c'est lorsque l'ordre dans lequel les opérations se déroulent doit dépendre du moment (par exemple, si l'une a un certain nombre d'opérations parallèles qui doivent utiliser un bus de mémoire partagée et que deux d'entre elles émettent des demandes presque simultanées, l'arbitrage dont l'une devrait aller en premier ...
supercat

... et que l'on devrait attendre peut être insoluble. Si l'on décide à l'avance lequel va aller en premier, de tels problèmes peuvent être évités, mais s'il s'avère que l'unité qui a été désignée pour aller en premier n'est prête que longtemps après l'autre, les performances peuvent en souffrir gravement. .
supercat

C'est pourquoi aller dans l'espace est si difficile, les probabilités changent défavorablement.
Magic Smoke

6

Les MCU ne sont qu'un exemple très complexe de circuit logique séquentiel synchrone. La forme la plus simple est probablement la bascule D synchronisée (D-FF), c'est-à-dire un élément de mémoire synchrone à 1 bit.

Il y a des éléments de mémoire qui sont asynchrones, par exemple le verrou D, qui est (dans un sens) l'équivalent asynchrone du D-FF. Un MCU n'est rien de plus qu'un tas de millions de ces éléments de mémoire de base (D-FF) collés ensemble avec des tonnes de portes logiques (je simplifie trop).

Venons-en maintenant au fait: pourquoi les MCU utilisent-ils des D-FF au lieu des D-loquets comme éléments de mémoire en interne? C'est essentiellement pour la fiabilité et la facilité de conception: les verrous D réagissent dès que leurs entrées changent et leurs sorties sont mises à jour le plus rapidement possible. Cela permet des interactions indésirables indésirables entre différentes parties d'un circuit logique (boucles et courses de rétroaction involontaires). La conception d'un circuit séquentiel complexe utilisant des blocs de construction asynchrones est intrinsèquement plus difficile et sujette aux erreurs. Les circuits synchrones évitent de tels pièges en limitant le fonctionnement des blocs de construction aux instants temporels lorsque les fronts d'horloge sont détectés. Lorsque le front arrive, un circuit logique synchrone acquiert les données à ses entrées, mais ne met pas encore à jour ses sorties. Dès que les entrées sont acquises, les sorties sont mises à jour. Cela évite le risque qu'un signal de sortie soit renvoyé à une entrée qui n'a pas été complètement acquise et gâche les choses (dit simplement).

Cette stratégie de «découplage» de l'acquisition des données d'entrée de la mise à jour des sorties permet des techniques de conception plus simples, qui se traduisent par des systèmes plus complexes pour un effort de conception donné.


5

Ce que vous décrivez s'appelle la logique asynchrone . Il peut fonctionner, et lorsqu'il le fait, il est souvent plus rapide et utilise moins d'énergie que la logique synchrone (cadencée). Malheureusement, la logique asynchrone a quelques problèmes qui l'empêchent d'être largement utilisée. Le principal que je vois est qu'il faut beaucoup plus de transistors à mettre en œuvre, car vous avez besoin d'une tonne de signaux de synchronisation indépendants. (Les microcontrôleurs font beaucoup de travail en parallèle, tout comme les processeurs.) Cela va augmenter les coûts. Le manque de bons outils de conception est un gros obstacle de départ.

Les microcontrôleurs auront probablement toujours besoin d'horloges car leurs périphériques doivent généralement mesurer le temps. Les temporisateurs et les PWM fonctionnent à des intervalles de temps fixes, les taux d'échantillonnage ADC affectent leur bande passante et les protocoles de communication asynchrones comme CAN et USB ont besoin d'horloges de référence pour la récupération d'horloge. Nous voulons généralement que les processeurs fonctionnent aussi vite que possible, mais ce n'est pas toujours le cas pour les autres systèmes numériques.


3

En fait, vous voyez le MCU comme une unité complète, mais la vérité est qu'il est lui-même composé de différentes portes et de logiques TTL et RTL, souvent un tableau FF, tous ont besoin du signal d'horloge individuellement,

pour être plus précis, pensez simplement à accéder à une adresse à partir de la mémoire, cette tâche simple peut elle-même impliquer plusieurs opérations comme la mise à disposition du BUS pour les lignes de données et les lignes d'adresse.
La meilleure façon de dire est, l'instruction se produisent dans de petites unités de fonctionnement nécessitant des cycles d'horloge, ces combinés pour les cycles de la machine , qui représentent diverses propriétés MCU comme la vitesse (FLOPS ** MCU est compliqué), doublure de tuyau , etc.

Réponse à Commentaire de l'OP

Pour être très précis, je vous donne un exemple, il y a une puce appelée ALE(Activation du verrouillage d'adresse) généralement dans le but de multiplexer le bus d'adresse inférieur pour transmettre à la fois l'adresse et les données sur les mêmes broches, nous utilisons des oscillateurs (l'Intel 8051 utilise un oscillateur local à 11,059 MHz comme horloge) pour récupérer l'adresse, puis les données.

Comme vous savez peut-être que les parties de base du MCU sont le CPU, l'ALU et le registre interne et ainsi de suite, le CPU (contrôlant s / g) envoie l'adresse à toutes les broches d'adresse 16 dans le cas de 8051, cela se produit à l'instant T1 et après l'adresse est la matrice correspondante de stockage de condensateur (charge comme signal) ( * mappage de mémoire * ) est activé et sélectionné.

Après la sélection, le signal ALE est activé, c'est-à-dire que la broche ALE est élevée à l'horloge suivante, dites T2 ( généralement un signal élevé mais change selon la conception de l'unité de traitement ), après quoi les bus d'adresse inférieurs agissent comme des lignes de données, et les données sont écrites ou lues (en fonction de la sortie sur la broche RD / WR du MCU).
Vous pouvez clairement voir que tous les événements sont séquentiels en temps opportun

Que se passerait-il si nous n'utilisions pas d'horloge Ensuite, nous devrons utiliser la méthode de synchronisation asynchrone ASQC, cela rendrait chaque porte dépendante de l'autre et pourrait entraîner des pannes matérielles.Cela tue également la tuyauterie de l'instruction impossible, dépendante de la longue et irrégulière temps pour terminer la tâche.
C'est donc quelque chose de indésirable


Ce genre de sens. Mais pourquoi ces différents compartiments du MCU ont-ils besoin du signal d'horloge pour fonctionner? Que se passerait-il théoriquement s'ils n'utilisaient pas d'horloge?
MR

1
@Martin, les portes logiques changent d'état immédiatement lorsque leur entrée change. La logique séquentielle cadencée n'évalue ses entrées que lors d'un événement d'horloge. C'est le principe de base qui pilote les circuits de mémoire numérique. Il nous donne la possibilité de déplacer sélectivement des données d'un endroit à un autre avec un contrôle absolu, permettant la création de matériel à usage général qui peut être programmé via softaware pour faire - enfin, n'importe quoi.
Sean Boddy

3
@SeanBoddy: Les portes logiques ne se déclenchent pas immédiatement, il y a un court décalage qui est visible sur un oscilloscope. Si nous n'utilisions pas d'horloge, les différences de ces synchronisations entre les composants pourraient entraîner des conditions de course produisant des résultats incorrects.
BlueRaja - Danny Pflughoeft

@BlueRaja - bien de bonbons gingembre, que diriez-vous de cela. Peut-être que je vais revenir sur 4 ans de notes sur l'électronique de puissance et 8 ans de formation dans la marine pour savoir où j'ai raté une chose.
Sean Boddy

2

Le problème fondamental qu'une horloge résout est que les transistors ne sont pas vraiment des appareils numériques: ils utilisent des niveaux de tension analogiques sur les entrées pour déterminer la sortie et prennent un temps limité pour changer d'état. À moins que, comme cela a été mentionné dans une autre réponse, vous n'entrez dans les appareils quantiques, il y aura une période de temps pendant laquelle l'entrée passera d'un état à un autre. Le temps que cela prend est affecté par la charge capacitive, qui sera différente d'un appareil à l'autre. Cela signifie que les différents tranisistors qui composent chaque porte logique répondront à des moments légèrement différents. L'horloge est utilisée pour «verrouiller» les sorties des appareils composants une fois qu'ils se sont tous stabilisés.

Par analogie, considérons la couche de transport des communications SPI (Serial Peripheral Interface). Une implémentation typique de ceci utilisera trois lignes: Data In, Data Out et Clock. Pour envoyer un octet sur cette couche de transport, le maître définit sa ligne de sortie de données et affirme la ligne d'horloge pour indiquer que la ligne de sortie de données a une valeur valide. Le périphérique esclave échantillonnera sa ligne Data In uniquement lorsque le signal d'horloge vous le demandera. S'il n'y avait pas de signal d'horloge, comment l'esclave saurait-il quand échantillonner la ligne Data In? Il pourrait l'échantillonner avant que la ligne ne soit établie par le maître ou pendant la transition entre les états. Les protocoles asynchrones, tels que CAN, RS485, RS422, RS232, etc. résolvent ce problème en utilisant un temps d'échantillonnage prédéfini, un débit binaire fixe et des bits de trame (overhead).

En d'autres termes, il existe une sorte de connaissance commune requise pour déterminer quand tous les transistors d'un ensemble de grilles ont atteint leur état final et que l'instruction est terminée. Dans le casse-tête (100 yeux bleus) indiqué dans le lien ci-dessus, et expliqué en détail dans cette question sur Maths Stack Exchange, `` l'oracle '' agit comme l'horloge pour les habitants de l'île.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.