Keskeytysten estäminen ?

Onko mitään helppoa tapaa estää hetkeksi keskeytykset Windows ohjelmassa (ajetaan XP tai Vista)?

Ongelma on, että käyttis keskeyttää ohjelman suorituksen keskytyksen kieltokäskyyn koska periaatteessa tuo on kielletty käsky applikaatiotasolla.
9321
Äänestä

Muut lukivat myös

Vastaukset 9

Vanhimmat

Keskeytysten kieltämisen aikana et voi kutsua mitään API:a. En pysty ymmärtämään miksi noin haluaisit tehdä?

Ajurissa (.sys) homma onnistuu, mutta siltikin yli 1 ms keskeytyksien esto on vaarallista. Myös kernel-tasolla tämä pääsääntöisesti tarkoittaa ettei API:a voi kutsua ennen kuin keskeytykset on palautettu.

Mitä olet tekemässä?

Äänestä
  • No tarkoitus olisi tuottaa säännöllisesti lyhyitä tietyn mittaisia pulsseja. Pulssin tuotto periodit voi vähän heilua mutta pulssin kesto pitäisi olla tarkka ja siihen oli ajatus käyttää silmukaa joka vahtaa CPU-kelloa. APIa ei tuona aikana käytetä, vain suoraa rautaososoitusta.
    Ongelma on siinä, että vaikka tuon rutiinin prioriteetin nostiaisi tappiin, voi silti tulla joku keskeytys. Maksimi aika keskeytysten kieltoon olisi 2.3ms joka ei minun mielestä pitäisi haitata mitään.

    Äänestä

  • realiajassa kirjoitti:

    No tarkoitus olisi tuottaa säännöllisesti lyhyitä tietyn mittaisia pulsseja. Pulssin tuotto periodit voi vähän heilua mutta pulssin kesto pitäisi olla tarkka ja siihen oli ajatus käyttää silmukaa joka vahtaa CPU-kelloa. APIa ei tuona aikana käytetä, vain suoraa rautaososoitusta.
    Ongelma on siinä, että vaikka tuon rutiinin prioriteetin nostiaisi tappiin, voi silti tulla joku keskeytys. Maksimi aika keskeytysten kieltoon olisi 2.3ms joka ei minun mielestä pitäisi haitata mitään.

    Windowsissa ei ole käytännössä mitään keinoa taata tuollainen. Ajurilla voi onnistua, mutta suuren virrankulutuksen lisäksi (loop RTTSC:tä vahdatessa vie virtaa!) on outojen ongelmien ilmaantuminen (blue screen) todennäköistä. Lisäksi prosessorin sisäinen kello ei ole niin tarkka kuin saatat kuvitella, jopa 1% variaatioita normaalitilanteissa, ja jos CPU menee johonkin throttling-tilaan, taivas on virheen rajana.

    Joten harkitse muita vaihtoehtoja:

    Ilmaispuolelta löytyisi mm.
    http://en.wikipedia.org/wiki/RTLinux - saat tarkat ajastimet ja takeet ettei mikään maailmassa keskeytä ennen kuin rutiinisi on valmis. Todennäköisesti ajastimet ovat niin luotettavia, ettei sinun tarvitse loopissa odotella.

    Maksulliselta puolelta suositeltava:
    http://www.qnx.com/

    Jos Windowsissa haluat välttämättä pysyä, googlella löytyi TenAsys INtime, jonkinlainen laajennus windowsiin realtimeä varten.

    Äänestä

  • ... kirjoitti:

    Windowsissa ei ole käytännössä mitään keinoa taata tuollainen. Ajurilla voi onnistua, mutta suuren virrankulutuksen lisäksi (loop RTTSC:tä vahdatessa vie virtaa!) on outojen ongelmien ilmaantuminen (blue screen) todennäköistä. Lisäksi prosessorin sisäinen kello ei ole niin tarkka kuin saatat kuvitella, jopa 1% variaatioita normaalitilanteissa, ja jos CPU menee johonkin throttling-tilaan, taivas on virheen rajana.

    Joten harkitse muita vaihtoehtoja:

    Ilmaispuolelta löytyisi mm.
    http://en.wikipedia.org/wiki/RTLinux - saat tarkat ajastimet ja takeet ettei mikään maailmassa keskeytä ennen kuin rutiinisi on valmis. Todennäköisesti ajastimet ovat niin luotettavia, ettei sinun tarvitse loopissa odotella.

    Maksulliselta puolelta suositeltava:
    http://www.qnx.com/

    Jos Windowsissa haluat välttämättä pysyä, googlella löytyi TenAsys INtime, jonkinlainen laajennus windowsiin realtimeä varten.

    Resoluutio pulssin leveyden säätöä pitäisi oleman jossain alle 4us kieppeillä. CPU kello on minun tietääkseni ainoa millä tuon saa aikaan. Itseasiassa noita pulssilähtöjä (eri mittaisia ) tulisi pari kymmentä samaan aikaan, eli silmukka vertaisi CPU-kelloa listassa oleviin pulssilähtöjen arvoihin ja sulkisi pulssit sitä mukaan kun niiden aika tulisi täyteen.

    Katselin joskus noita RT-Linukoita mutta ohjelmointiympäristönä Linux on sen verran vieras ettei hommasta varmaan tulisi mitään.

    Äänestä

  • keskeyttäen kirjoitti:

    Resoluutio pulssin leveyden säätöä pitäisi oleman jossain alle 4us kieppeillä. CPU kello on minun tietääkseni ainoa millä tuon saa aikaan. Itseasiassa noita pulssilähtöjä (eri mittaisia ) tulisi pari kymmentä samaan aikaan, eli silmukka vertaisi CPU-kelloa listassa oleviin pulssilähtöjen arvoihin ja sulkisi pulssit sitä mukaan kun niiden aika tulisi täyteen.

    Katselin joskus noita RT-Linukoita mutta ohjelmointiympäristönä Linux on sen verran vieras ettei hommasta varmaan tulisi mitään.

    RTLinux olisi luultavasti tuottavin vaihtoehto tässä vaiheessa. Googlaa netistä esimerkkejä, en usko että olen ensimmäinen jolla on tällainen ongelma. Esim. robotiikassa, jossa RTLinuxia käytetään, on vastaavia ongelmia servojen ohjauksessa.

    Ei se Linux pure, voit tehdä vaikka kontrollisoftan windowsilla ja ajaa Linuxin alla Winessä, samaan aikaan kun reaaliaikahommat pyörivät. En itse ole käyttänyt, mutta vilkaise esim. olisiko KDevelop tai CodeBlocks yms. käyttökelpoinen IDE:ksi ja mahdollisesti debuggaukseen.

    Alkuun pääsee ajamalla Windowsin alla virtuaalikoneessa - tällöin reaaliaikatakuut tietenkin menettää.

    Äänestä

  • ... kirjoitti:

    RTLinux olisi luultavasti tuottavin vaihtoehto tässä vaiheessa. Googlaa netistä esimerkkejä, en usko että olen ensimmäinen jolla on tällainen ongelma. Esim. robotiikassa, jossa RTLinuxia käytetään, on vastaavia ongelmia servojen ohjauksessa.

    Ei se Linux pure, voit tehdä vaikka kontrollisoftan windowsilla ja ajaa Linuxin alla Winessä, samaan aikaan kun reaaliaikahommat pyörivät. En itse ole käyttänyt, mutta vilkaise esim. olisiko KDevelop tai CodeBlocks yms. käyttökelpoinen IDE:ksi ja mahdollisesti debuggaukseen.

    Alkuun pääsee ajamalla Windowsin alla virtuaalikoneessa - tällöin reaaliaikatakuut tietenkin menettää.

    Jos käytät RDTSC:tä, kalibroi sen nopeutta systeemin kelloa vastaan jatkuvasti. Ymmärtääkseni mitään takuita RDTSC:n nopeudesta ei ole, sehän on määritelty kasvamaan yhdellä prosessorin kellojaksoa kohti. Varsinaisten ajastimien pitäisi olla tarkempia. Linuxissa cpu throttling yms. moodit voi poistaa käytöstä.

    RTLinuxissa pitäisi olla 1 μs resoluution ajastin. Ja ainahan voit pari viimeistä μs odotella loopissa. Context switchiin kuluvaa aikaa en tiedä, mutta en usko sen olevan montaa μs:ia. Ohjelmasi voi olla aivan normaali prosessi reaaliaikaprioriteetillä, et joudu ajuria kirjoittamaan.

    Äänestä

  • keskeyttäen kirjoitti:

    Resoluutio pulssin leveyden säätöä pitäisi oleman jossain alle 4us kieppeillä. CPU kello on minun tietääkseni ainoa millä tuon saa aikaan. Itseasiassa noita pulssilähtöjä (eri mittaisia ) tulisi pari kymmentä samaan aikaan, eli silmukka vertaisi CPU-kelloa listassa oleviin pulssilähtöjen arvoihin ja sulkisi pulssit sitä mukaan kun niiden aika tulisi täyteen.

    Katselin joskus noita RT-Linukoita mutta ohjelmointiympäristönä Linux on sen verran vieras ettei hommasta varmaan tulisi mitään.

    Olisko tuosta ajastimesta jotain hyötyä.

    http://msdn.microsoft.com/en-us/magazine/cc163996.aspx#S1

    Äänestä

  • --- kirjoitti:

    Olisko tuosta ajastimesta jotain hyötyä.

    http://msdn.microsoft.com/en-us/magazine/cc163996.aspx#S1

    Perusongelma on silti ja pysyy, eli keskeytysten estäminen. CPU-kello on aikas hyvä varsinkin kun seuraa ettei sen taajuus muutu. Tähän löytyy samasta ryhmästä indikaattori. Ilman keskeytysten kieltoa ei ole mitään takeita etteikö väliin pääse joku ... levyn luku tms.

    Linux taas on hankala ympäristö kun ei sen kanssa juuri ole touhunnut. RTLinukat taitaa olla lisäksi asnnuskoukeroiltaa ihan jotian muuta kuin... Ubuntu tai OpenSuse.

    Äänestä

  • keskeyttäjä kirjoitti:

    Perusongelma on silti ja pysyy, eli keskeytysten estäminen. CPU-kello on aikas hyvä varsinkin kun seuraa ettei sen taajuus muutu. Tähän löytyy samasta ryhmästä indikaattori. Ilman keskeytysten kieltoa ei ole mitään takeita etteikö väliin pääse joku ... levyn luku tms.

    Linux taas on hankala ympäristö kun ei sen kanssa juuri ole touhunnut. RTLinukat taitaa olla lisäksi asnnuskoukeroiltaa ihan jotian muuta kuin... Ubuntu tai OpenSuse.

    Windows NT:ssä rauta on poistettu käyttäjän tilasta kokonaan. Yleensäkin keskeytysten ja muiden käyttöjärjestelmän olemassaolon edellytyksiin käsiksi pääsy on erittäin huono juttu (vrt. DOS tai Window SusiVitonen), koska silloin voidaan rikkoa käyttöjärjestelmän toiminta todella tehokkaasti. Toisaalta on mahdollista tehdä ajureita, jotka toimivat kernel-tilassa ja pääsevät käsiksi rautaan. Nämä ajurit voivat julkaista rajapinnan ylöspäin käyttäjäntilaan asti. Tosin ajuritkaan eivät saa toimia ihan miten sattuu tai käyttäjän näyttö muuttuu siniseksi.

    Tein joskus aikoinaan W2K:n ajureita ja eräällä ohjasin rinnakkaisportin kautta erästä purkkia. Kommunikointi tapahtui kolmen langan välityksellä: DATAIN, DATAOUT ja CLOCK. Ajastus ei haitannut tavujen luvussa, mutta iso lohko dataa piti lukea ajurin sisällä ensin ajurissa muistiin ja sitten passata se käyttäjälle, koska ajatus ei ollut muuten riittävän tarkka. Kernel-moodista user-moodiin siirtyminen on melko kallista ajallisesti.

    Muutenkin vaikka kuinka oli prioriteetit kunnossa jne. niin joskus tuli pitkiäkin katkoksia johtuen levyjen kuormasta tai verkon käytöstä. Nämä saattoivat lisätä noin 100ms:n viiveen silloin tällöin.

    Käyttäjän tilassa muuten NT:ssä ei taida saada 10 ms tarkempaa odotusta, koska säikeiden nukkuaika (skeduloinnin resoluutio) on 10 ms.

    Vistassa ja Wintee 7:ssa asiat ovat saattaneet ajurin ajastusten osalta muuttua, koska niissä on tehty kerneliin isojakin remontteja. Valitettavasti en ole enää seurannut ko. kehitystä sen tarkemmin enää (ei aikaa, muita hommia ja kukaan ei maksa siitä enää :-).

    Windows-ajurien tekeminen on sen verran karvaisten miesten hommaa, että suosittelen melkein RTLinuxin asentamista (http://www.rtlinuxfree.com/, http://linux.about.com/od/howtos/a/rtlinuxhowto2.htm tai/ja http://www.ece.osu.edu/~cglee/ECE694Z/rtlinux/rtlinuxInstallation2005Sp.pdf) sekä O'Railyn Linux Device Driver 3ed kirjan (http://lwn.net/Kernel/LDD3/) lataamista ja lukemista. Tietysti jos olet riittävän uskalias, niin Microsoftin DDK:n lataaminen (http://www.microsoft.com/whdc/DevTools/ddk/default.mspx) ja asentaminen on yksi vaihtoehto. Dokumentaatiota löytyy mm http://msdn.microsoft.com/en-us/library/aa972908.aspx.

    Toisaalta voit kaiketi tehdä ajurin joka estää keskeytykset Wintoosan ytimeltä, mutta melkoisella varmuudella saat aikaan jotain ikävää. Nykyaikaisten käyttisten ongelma on siinä, että ne on tarkoitettu lyhyiden hommien "kuka tahansa voi keskeyttää kenet tahansa ja ydin keskeyttää aina" tyyppisten hommien tekemiseen. Mikrosekunttiajastukset ei oikein kuulu niiden luonteeseen.

    Äänestä

Kommentoi aloitusta


toivotonta koodia kirjoitti:

Onko mitään helppoa tapaa estää hetkeksi keskeytykset Windows ohjelmassa (ajetaan XP tai Vista)?

Ongelma on, että käyttis keskeyttää ohjelman suorituksen keskytyksen kieltokäskyyn koska periaatteessa tuo on kielletty käsky applikaatiotasolla.

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu