[SOS] frequence timer - QEMU

free mail lebre.adrien at free.fr
Jeu 6 Nov 20:17:18 CET 2008


Salut,

je lance mon kernel (à cette étape de l'explication d'un OS aux  
étudiants seulement le driver ecran est ok) et je vais leur faire  
afficher l'heure.
Pour cela j'initialise le 8254, puis j'exploite un handler ticTac qui  
me permet de compter les secondes.

#define FREQ 1000
int count = 0;
int total_sec =0;

AfficheHeure() {
	int sec=0;
	int min=0;

	sec  = total_sec% 60;
	min = total_sec / 60  ;

	kprintf("%d:%d",min,sec);
}

void ticTac(int o) {
	compt++;
	if(compt%FREQ==0) {
		globalsecondes++;
		compt=0;
	}
}

void main(){

	i8254_set_frequency(FREQ);
	irq_set_routine(IRQ_TIMER, ticTac);
	asm volatile("sti\n");//Autorise les interruptions

	while(1)
		afficheHeure();

}


En essayant plusieurs manipulations assez 'empiriques' il faut  
l'avouer, je n'ai pas reussi à obtenir des secondes qui dure  
concrètement des secondes.
Meme mieux, j'ai l'impression que quelque soit la frequence que  
j'initialise cela ne change rien et ceux même si le modulo dans le  
handler d'interruption est réalisé de manière erronée (exemple:  
initialisation de la frequence à 1000 et division par 100 dans le  
handler).
A noter néanmoins que le comportement diffère (en gros les secondes  
n'ont pas la meme durée) entre un qemu au dessus de windows ou bien un  
qemu au dessus de Linux (dans les deux cas l'acceleration de qemu  
n'est pas utilisée).


Je suis evidemment preneur de tout type d'infos.
Merci par avance du coup de main ;)
Adrie

On Nov 6, 2008, at 6:35 PM, anthoine.bourgeois wrote:

> Bonjour Adrien,
>
> Je n'ai aucune idée de ce que ça peut être mais je veux
> bien y jeter un coup d'oeil.
> Peux-tu nous donner le parametre freq et la methode que tu
> utilises pour tester la frequence après le changement ?
>
> Cordialement,
> Anthoine
>
>
>> Message du 05/11/08 19:41
>> De : "free mail" <lebre.adrien at free.fr>
>> A : sos at the-doors.enix.org
>> Copie à :
>> Objet : [SOS] frequence timer - QEMU
>>
>>
>> Salut,
>>
>> J'ai posté sur les mailings list de Qemu (users et dev)
>>
>> Je ne suis pas parvenu à modifier la fréquence du timer PIC8254 en
>> m'appuyant sur le bout de code que a été presenté dans SOS.
>> Je pense que le souci vient de Qemu. Je voulais savoir si quelqu'un a
>> deja rencontré ce type de probleme ?
>>
>> Merci par avance
>> Adrien,
>>
>> Pour infos, j'ai poste sur les mailings lists users et dev de qemu.  
>> Je
>> n'ai pas vraiment obtenu d'infos pour le moment :
>> http://lists.gnu.org/archive/html/qemu-devel/2008-10/msg00384.html
>>
>> In the context of study, we have to develop a simple operating system
>> from
>> scratch. To develop our ''kernel'' we are using QEMU.
>> For few days, we have fighted with the I8254 chip in order to  
>> create a
>> timer for
>> our system.
>> Based on the code provided in the Simple OS
>> (http://sos.enix.org/lxr/source/hwcore/i8254.c), we are trying to
>> change the
>> frequency.
>> Unfortunately, whatever the value of nb_tick, the frequency does not
>> change.
>> Here, I just copied the related code. We tried by setting the nb_tick
>> with
>> 11931, 1193 and 119 directly in the following functions.
>> Unfortunately, the time
>> frequency (according to the IRQ timer handler) is still the same .
>>
>> Does anyone have an idea ?
>>
>> Thanks in advance,
>> Adrien.
>>
>> /** 82c54 clock frequency */
>> #define I8254_MAX_FREQ 1193180
>>
>> /* Ports to communicate with the 82c54 */
>> #define I8254_TIMER0  0x40
>> #define I8254_TIMER1  0x41
>> #define I8254_TIMER2  0x42
>> #define I8254_CONTROL 0x43
>>
>> ...
>>
>> int i8254_set_frequency(unsigned int freq){
>> unsigned int nb_tick;
>>
>> if (freq <= 0)
>>   return -255;
>>
>> /* Compute counter value */
>> nb_tick = I8254_MAX_FREQ / freq;
>>
>> /* Counter must be between 1 and 65536 */
>> if (nb_tick > 65536)
>>   return -255;
>> if (nb_tick <= 0)
>>  return -255;
>>
>> /* The i8254 interprets 0 to mean counter == 65536, because 65536
>>   cannot be coded on 16bits */
>> if (nb_tick == 65536)
>>  nb_tick = 0;
>>
>> /* We want to configure timer0, we want to send both LSB+MSB to set
>>   timer0 freq (-> 0x30), and we configure timer0 in mode 2, ie as a
>>   rate generator (-> 0x4) ==> 0x34 */
>> outb(0x34, I8254_CONTROL);
>>
>> /* Send LSB of counter first */
>> outb((nb_tick & 0xFF), I8254_TIMER0);
>>
>> /* Send MSB of counter */
>> outb((nb_tick >> 8) & 0xFF, I8254_TIMER0);
>>
>> return 1;
>> }
>>
>>
>> Re: i8254 - Cannot change Timer frequency
>> by alebre on Wed Sep 17, 2008 4:37 pm
>>
>> What is the behavior of QEMU with regard to such instructions ?
>> Does QEMU emulate the I8254 chip or does it simply forward the
>> instruction to
>> the host OS ? In that case, the host OS could simply does not  
>> consider
>> such an
>> instruction ?
>>
>> Adrien, still looking for some explanations....
>>
>>
>>
>>
>> _______________________________________________
>> Sos mailing list
>> Sos at the-doors.enix.org
>> http://the-doors.enix.org/cgi-bin/mailman/listinfo/sos
>>
>>
>
>



Plus d'informations sur la liste de diffusion Sos