cs_Blackhorn
Messages postés23Date d'inscriptiondimanche 22 août 2004StatutMembreDernière intervention25 mai 2006
-
21 mai 2006 à 00:36
_dune2_
Messages postés141Date d'inscriptionmercredi 19 juillet 2006StatutMembreDernière intervention20 avril 2011
-
29 juil. 2006 à 00:15
Bonjour je voudrais savoir comment faire en assembleur( de base sans
windows et tout le tralala :)) une fonction sleep (en ms sa serait bien)
cs_Nasman
Messages postés202Date d'inscriptionmardi 17 mai 2005StatutMembreDernière intervention29 septembre 20083 19 juin 2006 à 10:26
Bonjour Blackhorn,
Pour occuper le processeur il y a toujours la méthode bestiale : crééer une ou plusieurs boucles imbriquées dont le temps d'exécution dépendra d'une part du nombre de fois que la boucle sera exécutée et du temps d'exécution d'une boucle élémentaire. Pour connaitre ce temps il te faut bien connaitre ton microprocesseur avec fréquence horloge et nombre de cycles horloge pour chacune des instructions.
Dans le principe ce n'est pas bien compliqué mais un peu fastidieux.
Autre désavantage: le code ne sera pas du tout portable. Les délais risquent de varier énormément d'un PC à un autre. Tu pourras toujours corriger en introduisant la fréquence horloge du micro mais selon le microprocesseur la même instruction peut être exécutée avec un nombre de cycles horloge différent.
Si tu ne part plus de rien, tu pourras peut être bénéficier de timers (interruptions dos par exemple).
_dune2_
Messages postés141Date d'inscriptionmercredi 19 juillet 2006StatutMembreDernière intervention20 avril 2011 29 juil. 2006 à 00:15
salut,
Je suis d'accord avec Nasman et Patalo.
Tout d'abord, la solution de faire une boucle précalculée en cycles d'horloge est peu envisageable. Car avec les processeurs modernes (Pentium, Athlon ...), le cache et la parallélisation des instructions dans les pipelines d'exécution, rendent trés difficile l'estimation exacte en terme de cycles d'horloge. Seule une méthode empirique par essais successifs peut permettre de s'en sortir.
Ensuite, cette méthode de boucle ne peut être valide que si on invalide toute interruption, car on a de forte chance d'être préempté par le scheduler de tâches (que ce soit sous windows ou linux) pendant la boucle et donc fausser notre timing. Mais le fait d'invalider les IT pendant notre 'sleep' va geler notre OS.
Puis il y a la solution de l'interruption du timer qui semble plus élégant. Mais sans passer par l'OS, c'est à dire en utilisant le timer hardware, on va interferer avec les interruptions périodiques du timer servant à l'ordonnanceur de tâches (scheduler) de l'OS. On ne peut donc pas vraiment considerer cette solution comme envisageable sauf si on accepte de 'geler' le système pendant notre chrono.
Pour terminer, reste la solution qui consiste à 'endormir notre tâche jusqu'à la prochaine periode de l'ordonnanceur de tâche. Mais on devient alors, trés lié à l'OS puisqu'on utilise la gestion du multitâche pour rescheduler notre process.
Je ne pense pas qu'il y ait de solution vraiment simple .... sauf à réaliser l'opération sur microcontrolleur type PIC16Cxx et sans OS et seul au monde .