My Project
Chargement...
Recherche...
Aucune correspondance
horloge.c
Aller à la documentation de ce fichier.
1
8#include <manux/config.h>
9#include <manux/debug.h>
10#include <manux/intel-8259a.h>
11#include <manux/horloge.h>
12#include <manux/io.h> // outb
13#include <manux/memoire.h> // NULL
14#ifdef MANUX_TACHES
15# include <manux/scheduler.h> // ordonnanceur
16#endif
17#include <manux/printk.h>
18
19/*
20 * Nous allons décompter avec cette variable le nombre d'interruptions d'horloge
21 */
23
24/*
25 * Le calibre pour les attentes courtes actives
26 */
28
29/*
30 * Le handler du timer
31 */
32static
33void handlerHorloge(void * inutile)
34{
35 (void) inutile;
36
38
39#if defined(MANUX_TACHES) && defined(MANUX_PREEMPTIF)
40 if (tacheEnCours) {
42 }
43#endif
44}
45
46/*
47 * Configuration de la fréquence du circuit
48 */
49static
50void setFrequenceHorloge(uint16_t freqHz)
51{
52 uint16_t decompte;
53
54 decompte = 1193200 / freqHz;
55
56 // On initialise la fréquence du timer 0 WARNING a rendre plus propre
57 outb(0x43, 0x34); // Was 36
58 outb(0x40, decompte & 0xFF);
59 outb(0x40, (decompte >> 8) & 0xFF);
60}
61
65NO_OPTIMIZE
66static
67void attenteCalibrer(void)
68{
69 Temps t;
70 uint32_t n = 0;
71
72 t = nbTopHorloge;
73
74 // On attend le prochain top
75 do {
76 } while (t == nbTopHorloge);
78
79 // On compte le nombre de boucles entre deux tops
80 do {
81 n++;
82 } while (nbTopHorloge < t);
83
84 // On a donc fait n boucles entre deux tops soit une durée de
85 // 1000*NB_CYCLES_CALIBRAGE/MANUX_FREQUENCE_HORLOGE ms. Donc pour
86 // une milliseconde il nous faut
88
89 //printk("Calibrage : n = %d, f = %d, c = %d\n", n, MANUX_FREQUENCE_HORLOGE, attenteCalibre);
90}
91
96{
97
98 // Initialisation de la fréquence de l'horloge matérielle
99 setFrequenceHorloge(MANUX_FREQUENCE_HORLOGE);
100
101 // Enregistrement auprès du PIC
102 i8259aAjouterHandler(IRQ_HORLOGE, handlerHorloge, NULL);
103
104 // Autorisation de l'IRQ
106
107 // Calibrage du système d'attente active
108 attenteCalibrer();
109}
110
114NO_OPTIMIZE
116{
117 uint32_t m = n * attenteCalibre;
118 uint32_t c = 0;
119
120 do {
121 c++;
122 } while (c < m);
123}
124
#define MANUX_FREQUENCE_HORLOGE
La fréquence du timer.
Definition base.h:30
#define MANUX_NB_CYCLES_CALIBRAGE
Durée du calibrage des attentes actives en nombre de cycles du timer.
Definition base.h:43
Temps nbTopHorloge
Definition horloge.c:22
uint32_t attenteCalibre
Definition horloge.c:27
NO_OPTIMIZE void attenteMilliSecondes(int n)
Attente active de n millisecondes.
Definition horloge.c:115
void initialiserHorloge(void)
Initialisation du système d'horloge.
Definition horloge.c:95
typedef void(Handler(void))
Définition des fonctions de base d'entrée-sortie du noyau.
#define NULL
Definition stddef.h:10
unsigned long uint32_t
Definition types.h:20
unsigned short uint16_t
Definition types.h:16
int32_t Temps
Definition types.h:71
int i8259aAjouterHandler(int numIRQ, void(*handler)(void *), void *private)
Ajout d'un handler.
void i8259aAutoriserIRQ(uint8_t numIRQ)
Masquage d'une IRQ.
#define outb(port, octet)
Emission d'un octet sur un port.
Definition io.h:13
uint16_t c
#define IRQ_HORLOGE
Definition pc-i386.h:57
Tache * tacheEnCours
: L'identification de la tâche en cours
Definition scheduler.c:91
void ordonnanceur(void)
Basculer vers la prochaine tache à exécuter.
Definition scheduler.c:98