Article View: fr.comp.lang.c
Article #15478Re: Delai en 100 eme de ms universel
From: Arnaud
Date: Thu, 22 Sep 2005 15:38
Date: Thu, 22 Sep 2005 15:38
250 lines
11621 bytes
11621 bytes
C'est un message de format MIME en plusieurs parties. ------=_NextPart_000_0035_01C5BF9C.606D33E0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Merci =E0 tous et en particulier =E0 Charlie Gordon pour cette = excellente id=E9e qui consiste =E0 mesurer une grosse boucle en seconde = pour pouvoir d=E9terminer ensuite par simple r=E8gle de 3 la dur=E9e de = boucles plus courtes ... Simple et sans doute efficace :o)=20 Certes , si on inclue dans le calcule des interruptions courantes et " = impromptues " , =E7a change sans doute la donne ... ( A voir dans quelle = mesure )=20 Mon projet consiste =E0 envoyer sur une simple sortie du port parralele = avec au bout une simple LED Infra Rouge par exemple une impulsion = pr=E9cise au milli=E8me de seconde pr=EAt pour envoyer du code RC5 ( = entre autre ) , code ultile pour piloter des TV magn=E9toscope , HIFI = ect . apr=E8s les infos du web , la longueur des cr=E9neaux binaire RC5 = sont hyper pr=E9cis ... Une trame binaire RC5 est bien sure tr=E8s = courte et op=E9ration sera tr=E8s ponctuelle et tr=E8s courte ... =20 Le tout dois =EAtre portable en fr=E9quence de trame RC5 automatiquement = d'un PC sur l'autre Le fait que je sois sous DOS simplifie dr=F4lement le jeux car = effectivement , sous Windows ou LINUX , le Kernel fait ce qu'il veux = quand il veux sans jamais nous tenir inform=E9 pr=E9cis=E9ment de son = emploi du temps mais sur une dur=E9e si courte ( l'envoi d'une trame RC5 = ) =E7a doit =EAtre jouable aussi ;o)=20 Arnaud =20 =20 "Charlie Gordon" <news@chqrlie.org> a =E9crit dans le message news: = dgeqfb$jhd$1@reader1.imaginet.fr... "Arnaud" <clerget_a@club-internet.fr> wrote in message news:432ad506$0$307$7a628cd7@news.club-internet.fr... > Comment obtenir des poses de l'ordre du 100 eme de milli seconde ( = 0.01 ms ) en Turbo C sous Dos > avec un r=E9sultat constant quelque soit la puisasnce du PC = utilis=E9 ? > La commande delai(1) permet d'avoir une delai de 1 milliseconde . > Impossible de dessendre en dessous via cette commande > La boucle for(i=3D1;i<10000;i++) permet une pause plus courte et = tres fine > mais offre un resultat totalement variable et depedant de la = puissance du PC utilis=E9 ... Il faut effectivement faire une boucle que l'on aura pr=E9alablement = calibr=E9e en mesurant le temps d'une autre mani=E8re : Tu fais une boucle de 1 million de tours, et tu mesures le temps = qu'elle prend avec une lecture du compteur de tick (un long =E0 l'adresse = 0040:006C). le tick dure environ 55ms (65536 ticks par heure). Il faut eventuellement = augmenter le nombre de tours pour avoir une mesure pertinente. l'idee est de = mesurer a quelle frequence tu peux boucler sur la machine ou ton programme = s'execute. Tu en deduis alors combien de tours il faut faire pour n'importe quelle = dur=E9e. il faut imp=E9rativement utiliser la meme routine pour la calibration = et le delai, sinon le code gener=E9 peut etre tr=E8s diff=E9rent et les temps ne = seront pas coh=E9rents. il faut garder a l'esprit que cette methode te donne un delai = *minimal*. Si une interruption survient pendant la boucle voire un changement de process = sous windows, le delai sera allong=E9 hors du controle du programme. des durees de 10 micro secondes ne sont pas faciles a calibrer, = l'impact du cache sera non negligeable, donc la methode reste approximative. sur des machines modernes (Pentium et suivants) il existe un registre = special qui contient le nombre de cycles d'horloge. On peut faire une = calibration pour savoir la vitesse d'horloge, et ensuite on peut faire une routine plus = efficace et beaucoup plus pr=E9cise qui lit le compteur d'horloge, ajoute le = delai converti en nombre de cycles, et ensuite boucle en relisant le compteur = d'horloge et le comparant =E0 l'heure de fin. Tu trouveras sur google tous les = renseignements utiles en cherchant RDTSC (read time stamp counter), mais il faudra = faire de l'assembleur 32 bits (eventuellement inline), mais cela marche aussi = sous DOS. --=20 Chqrlie ------=_NextPart_000_0035_01C5BF9C.606D33E0 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML><HEAD> <META http-equiv=3DContent-Type content=3D"text/html; = charset=3Diso-8859-1"> <META content=3D"MSHTML 6.00.2800.1106" name=3DGENERATOR> <STYLE></STYLE> </HEAD> <BODY bgColor=3D#ffffff> <DIV><FONT face=3DArial size=3D2>Merci =E0 tous et en particulier =E0 = Charlie Gordon=20 pour cette excellente id=E9e qui consiste =E0 mesurer une grosse boucle = en seconde=20 pour pouvoir d=E9terminer ensuite par simple r=E8gle de 3 la = dur=E9e de boucles=20 plus courtes ... Simple et sans doute efficace :o) </FONT></DIV> <DIV><FONT face=3DArial size=3D2></FONT> </DIV> <DIV><FONT face=3DArial size=3D2>Certes , si on inclue dans le calcule = des=20 interruptions courantes et " impromptues " , =E7a change sans = doute la=20 donne ... ( A voir dans quelle mesure ) </FONT></DIV> <DIV><FONT face=3DArial size=3D2></FONT> </DIV> <DIV><FONT face=3DArial size=3D2>Mon projet consiste =E0 envoyer sur une = simple sortie=20 du port parralele avec au bout une simple LED Infra Rouge par exemple = une=20 impulsion pr=E9cise au milli=E8me de seconde pr=EAt pour envoyer=20 du code RC5 ( entre autre ) , code ultile pour piloter des TV=20 magn=E9toscope , HIFI ect . apr=E8s les infos du web , la = longueur des=20 cr=E9neaux binaire RC5 sont hyper pr=E9cis ... </FONT> <FONT = face=3DArial=20 size=3D2>Une trame binaire RC5 est bien sure tr=E8s courte et = op=E9ration sera tr=E8s=20 ponctuelle et tr=E8s courte ... </FONT></DIV> <DIV><FONT face=3DArial size=3D2></FONT> </DIV> <DIV><FONT face=3DArial size=3D2>Le tout dois =EAtre portable en = fr=E9quence de=20 trame RC5 automatiquement d'un PC sur l'autre</FONT></DIV> <DIV><FONT face=3DArial size=3D2></FONT> </DIV> <DIV><FONT face=3DArial size=3D2>Le fait que je sois = sous DOS simplifie=20 dr=F4lement le jeux car effectivement , sous Windows ou LINUX , le = Kernel fait ce=20 qu'il veux quand il veux sans jamais nous tenir inform=E9 = pr=E9cis=E9ment de son=20 emploi du temps mais sur une dur=E9e si courte ( l'envoi d'une = trame=20 RC5 ) =E7a doit =EAtre jouable aussi ;o) </FONT></DIV> <DIV><FONT face=3DArial size=3D2></FONT> </DIV> <DIV><FONT face=3DArial size=3D2></FONT> </DIV> <DIV><FONT face=3DArial size=3D2>Arnaud </FONT> </DIV> <DIV> </DIV> <BLOCKQUOTE=20 style=3D"PADDING-RIGHT: 0px; PADDING-LEFT: 5px; MARGIN-LEFT: 5px; = BORDER-LEFT: #000000 2px solid; MARGIN-RIGHT: 0px"> <DIV>"Charlie Gordon" <<A=20 href=3D"mailto:news@chqrlie.org">news@chqrlie.org</A>> a =E9crit = dans le=20 message news: <A=20 = href=3D"mailto:dgeqfb$jhd$1@reader1.imaginet.fr">dgeqfb$jhd$1@reader1.ima= ginet.fr</A>...</DIV>"Arnaud"=20 <<A=20 = href=3D"mailto:clerget_a@club-internet.fr">clerget_a@club-internet.fr</A>= >=20 wrote in message<BR><A=20 = href=3D"news:432ad506$0$307$7a628cd7@news.club-internet.fr">news:432ad506= $0$307$7a628cd7@news.club-internet.fr</A>...<BR><BR>>=20 Comment obtenir des poses de l'ordre du 100 eme de milli seconde ( = 0.01 ms=20 )<BR>en Turbo C sous Dos<BR>> avec un r=E9sultat constant quelque = soit la=20 puisasnce du PC utilis=E9 ?<BR><BR>> La commande delai(1) = permet=20 d'avoir une delai de 1 milliseconde .<BR>> Impossible de dessendre = en=20 dessous via cette commande<BR><BR>> La boucle = for(i=3D1;i<10000;i++)=20 permet une pause plus courte et tres fine<BR>> mais offre un = resultat=20 totalement variable et depedant de la puissance du PC<BR>utilis=E9 = ...<BR><BR>Il=20 faut effectivement faire une boucle que l'on aura pr=E9alablement = calibr=E9e=20 en<BR>mesurant le temps d'une autre mani=E8re :<BR><BR>Tu fais une = boucle de 1=20 million de tours, et tu mesures le temps qu'elle prend<BR>avec une = lecture du=20 compteur de tick (un long =E0 l'adresse 0040:006C). le tick<BR>dure = environ 55ms=20 (65536 ticks par heure). Il faut eventuellement augmenter = le<BR>nombre=20 de tours pour avoir une mesure pertinente. l'idee est de mesurer = a<BR>quelle frequence tu peux boucler sur la machine ou ton programme=20 s'execute. Tu<BR>en deduis alors combien de tours il faut faire = pour=20 n'importe quelle dur=E9e.<BR><BR>il faut imp=E9rativement utiliser la = meme routine=20 pour la calibration et le delai,<BR>sinon le code gener=E9 peut etre = tr=E8s=20 diff=E9rent et les temps ne seront pas<BR>coh=E9rents.<BR><BR>il faut = garder a=20 l'esprit que cette methode te donne un delai *minimal*. Si=20 une<BR>interruption survient pendant la boucle voire un changement de = process=20 sous<BR>windows, le delai sera allong=E9 hors du controle du=20 programme.<BR><BR>des durees de 10 micro secondes ne sont pas faciles = a=20 calibrer, l'impact du<BR>cache sera non negligeable, donc la methode = reste=20 approximative.<BR><BR>sur des machines modernes (Pentium et suivants) = il=20 existe un registre special<BR>qui contient le nombre de cycles=20 d'horloge. On peut faire une calibration pour<BR>savoir la = vitesse=20 d'horloge, et ensuite on peut faire une routine plus efficace<BR>et = beaucoup=20 plus pr=E9cise qui lit le compteur d'horloge, ajoute le delai = converti<BR>en=20 nombre de cycles, et ensuite boucle en relisant le compteur d'horloge = et=20 le<BR>comparant =E0 l'heure de fin. Tu trouveras sur google tous = les=20 renseignements<BR>utiles en cherchant RDTSC (read time stamp counter), = mais il=20 faudra faire de<BR>l'assembleur 32 bits (eventuellement inline), mais = cela=20 marche aussi sous DOS.<BR><BR>-- = <BR>Chqrlie<BR><BR></BLOCKQUOTE></BODY></HTML> ------=_NextPart_000_0035_01C5BF9C.606D33E0--
Technical Details
Message-ID:
<4332d1b9$0$12994$7a628cd7@news.club-internet.fr>Path:
arc1-ca.pugleaf.net!g2news1.google.com!news3.google.com!border1.nntp.dca.giganews.com!nntp.giganews.com!feed6.newsreader.com!newsreader.com!news-out1.kabelfoon.nl!newsfeed.kabelfoon.nl!xindi.nntp.kabelfoon.nl!194.25.134.62.MISMATCH!newsfeed00.sul.t-online.de!t-online.de!grolier!v.t-online.fr!t-online.fr!not-for-mailReferences:
<432ad506$0$307$7a628cd7@news.club-internet.fr> <dgeqfb$jhd$1@reader1.imaginet.fr>Show Full Headers
Complete Article Headers
X-Google-Thread: f9822,8d23bb47e02845e2 X-Google-Attributes: gidf9822,public X-Google-Language: FRENCH,ASCII Path: arc1-ca.pugleaf.net!g2news1.google.com!news3.google.com!border1.nntp.dca.giganews.com!nntp.giganews.com!feed6.newsreader.com!newsreader.com!news-out1.kabelfoon.nl!newsfeed.kabelfoon.nl!xindi.nntp.kabelfoon.nl!194.25.134.62.MISMATCH!newsfeed00.sul.t-online.de!t-online.de!grolier!v.t-online.fr!t-online.fr!not-for-mail Reply-To: "Arnaud" <clerget_a@club-internet.fr> From: "Arnaud" <clerget_a@club-internet.fr> Newsgroups: fr.comp.lang.c References: <432ad506$0$307$7a628cd7@news.club-internet.fr> <dgeqfb$jhd$1@reader1.imaginet.fr> Subject: Re: Delai en 100 eme de ms universel Date: Thu, 22 Sep 2005 17:38:00 +0200 Organization: . MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0035_01C5BF9C.606D33E0" X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 5.50.4522.1200 X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4522.1200 Lines: 251 Message-ID: <4332d1b9$0$12994$7a628cd7@news.club-internet.fr> NNTP-Posting-Date: 22 Sep 2005 15:46:02 GMT NNTP-Posting-Host: 62.35.1.136 X-Trace: 1127403962 news.club-internet.fr 12994 62.35.1.136 X-Complaints-To: abuse@club-internet.fr