[LUGOS-PROG] Milisekundni stevec

Miroslav Jurkas miroslav.jurkas at ensico.si
Sun Nov 10 19:10:51 CET 2002


Metod Kozelj wrote:

>
> Howdy!
>
> davorin.robba at ensico.si wrote:
>
> > Zal morajo biti vsaj milisekunde. Na majhnem kontrolerju (PC baziran 
> na 486) smo razvili aplikacijo (napisana v C/C++), ki tece na linuxu. 
> V aplikaciji rabimo milisekundni cas za sinhronizacijo in racunanje 
> timeout-ov.
> >
>
> Se bojim, da bos tezko prisel skozi z milisekundami. Sicer je odvisno od
> HW platforme, ampak za ix86 je resolucija sistemske ure 100HZ
> (asm/param.h; pri alfah je bodisi 1024 ali pa 1200 Hz). Najbrz obstaja
> kaksna sistemska funkcija, ki ti vrne vrednost uptime, v skrajni sili pa
> jo preberes iz /proc/uptime. Spodaj je en primerek takega programa ...
> za odpiranje /proc/uptime, branje in zapiranje je poraba med 200 
> (P4-1.7G)
> in 2000 (P-100M) mikrosekund. Rezultate mi vraca v desetinkah 
> milisekunde,
> ampak mocno dvomim, da je taka natancnost relevantna.
>
> Druga moznost je branje casa iz CMOS ure. Sicer se jo da tudi
> spreminjati, ampak je to malo manj verjetno ... Poglej si
> */mc146818rtc.h za opis funkcij ... se mi pa zdi, da v tem primeru
> (zaradi outb, inb) potrebujes sistemske privilegije.
>
Mogoc(e ae manjae pojasnilo (glede na to, da z Davorinom delava na istem 
projektu). Milisekundno bazo potrebujemo zaradi obstojec(e 
implementacije naaih timerjev (SW timerji v compatibility knji~nici - 
naai, ki izvira iz RTOS-ov, OS/2 in Winsov). Natanc(nost 1, 5, 10, 20 ms 
je precej irelevantna v konkretnem primeru, kvec(jemu resolucija 1ms. V 
bistvu potrebujemo free running counter, ki v enem long-u ateje 
milisekunde ali kaj podobnega (tako, da potem naai timerji nesejo cca 24 
dni) in je od trenutnega svetovnega c(asa neodvisen.
Problem je nastopil zaradi tega, ker smo kot vir za prerac(un v 
milisekundno bazo uporabili clock_gettime() in ga ustrezno prerac(unali. 
Ta c(as je real (World) time in se seveda spremeni po c(asovni 
sinhronizaciji, kar ima na timerje po izvedeni sinhronizaciji 
katastrofalni uc(inek.
Sicer delamo s knji~nico ACE, ki ima tudi svoje timerje in glej ga 
zlomka, na 486 se ti napajajo iz istega vira... Nekje sem nekaj prebral 
o kernel timerjih, pa nisem pivsem razumel... Najbr~ je to vezabo na 
scheduler neposredno in s tega vira se najbr~napaja tudi select() pri 
socketih.
Na pantium-u ni nobenega problema, ker je na voljo TSC register...
Naai timerji morajo biti kar se da hitri (smejo porabiti le malo c(asa), 
odpiranje in zapiranje skozi file system zato pac( odpade. Ta c(as se na 
enem segmentu uporablja tudi za sinhronizacijo med procesi, zato mora 
biti izrac(unljiv na za vse procese enako.

Aplikacija, ki tec(e na 486 je RTU (remote terminal unit), ki deluje 
tudi kot pretvornik protokolov s procesnimi zmo~nostmi. Aplikacija je 
multi-threaded (pthread library). Sistem ima hard real-time ekstenzijo 
(od FSM labs), znotraj katere poskrbimo za zajem in upravljanje 
neposredno prikljuc(ene periferije. Napravi periodic(no sinhroniziramo 
c(as in v tej toc(ki je prialo do problema.

Najbr~ bomo morali celovito spremeniti implementacijo naaih timerjev (~e 
zaradi ~ivljenja v prihodnjosti), kar pa za sabo povlec(e spremembe in 
testiranje kupa ~e delujoc(ega programja.


Lep pozdrav
  Miroslav

-------------------------------------------------
** ENSICO d.o.o. www.ensico.si                 **
** miroslav.jurkas at ensico.si                   **
** project manager & unix system administrator **
-------------------------------------------------






More information about the lugos-prog mailing list