Miten viiveitä?

pitäisi tehdä aliohjelma jolla saisin mikrosekunnin viiveitä. Miten se onistuu?
9773
Äänestä

Muut lukivat myös

Vastaukset 9

Vanhimmat

nanosleep auttanee, ehkä. Koska et kertonut mille käyttöjärjestelmälle olet tekemässä ohjelmaa, niin käytän vastauksessani esimerkkinä Linuxia.

Testaamaton koodi:

int err;
struct timespec ts;
ts.tv_sec = 0;
ts.tv_nsec = 1000;
err = nanosleep(&ts, NULL);
if (err < 0) {
/* ohjelma sai signaalin tai ts oli virheellinen */
}

Mikrosekunnin viiveitä voi olla vaikea/mahdoton saada, sillä tyypillisten käyttöjärjestelmien ajastimet eivät yleensä pysty noin tarkkaan ajastukseen. nanosleepin man-sivu kertoo:

"The current implementation of nanosleep is based on the normal kernel timer mecha­nism, which has a resolution of 1/HZ s (i.e, 10 ms on Linux/i386 and 1 ms on Linux/Alpha). Therefore, nanosleep pauses always for at least the specified time,
however it can take up to 10 ms longer than specified until the process becomes
runnable again. For the same reason, the value returned in case of a delivered signal in *rem is usually rounded to the next larger multiple of 1/HZ s."

Samaisella sivulla tosin kerrotaan, että lyhyempiäkin kuin 1/HZ taukoja voidaan saada, mutta se vaatii enemmän oikeuksia kuin normaalikäyttäjällä on.

Äänestä
  • Teen Dos pohjoisia ohjelmia. Eikö noita pc timer rekistereitä voi jotenkin ohjata ja niistä tehdä viiveitä? Siellähän on joku sisäinen kellopussi joka on noin 1,193Mhz.

    Äänestä

  • eräs kirjoitti:

    Teen Dos pohjoisia ohjelmia. Eikö noita pc timer rekistereitä voi jotenkin ohjata ja niistä tehdä viiveitä? Siellähän on joku sisäinen kellopussi joka on noin 1,193Mhz.

    #include
    void delay(unsigned msec);

    Toki voit käyttää time.h clock() funktiota ja odotella luupissa että haluttu aika tulee täyteen.

    Joissain wanhoissa dos peleissä koukutettiin tuo kellokeskeytys, joten se kai toimisi myös

    Äänestä

  • dos.h kirjoitti:

    #include
    void delay(unsigned msec);

    Toki voit käyttää time.h clock() funktiota ja odotella luupissa että haluttu aika tulee täyteen.

    Joissain wanhoissa dos peleissä koukutettiin tuo kellokeskeytys, joten se kai toimisi myös

    millisekunti != mikrosekunti

    Ei riitä clockin tarkkuus edes yhden millisekunnin viiveen tekemiseen/tarkastamiseen, joten sen voi unohtaa samantien.

    Ja luulen myös ettei mikrosekunnin viivettä saa aikaan millään ilveellä.

    Äänestä

  • eero kirjoitti:

    millisekunti != mikrosekunti

    Ei riitä clockin tarkkuus edes yhden millisekunnin viiveen tekemiseen/tarkastamiseen, joten sen voi unohtaa samantien.

    Ja luulen myös ettei mikrosekunnin viivettä saa aikaan millään ilveellä.

    ei tuon viiveen tarvitse olla ihan tarkka mikrosekunti pienet heitot sallitaan .esimerkiksi 1 us voisi olla 0.98 us tai sinne päin.

    Äänestä

  • eräs kirjoitti:

    ei tuon viiveen tarvitse olla ihan tarkka mikrosekunti pienet heitot sallitaan .esimerkiksi 1 us voisi olla 0.98 us tai sinne päin.

    No jos ei yhden mikrosekunnin, niin saisiko lähes 10us viiveen (heitot sallittuja). Vai pitääkö tehdä oma IO- kortti viiveille.

    Äänestä

  • eräs kirjoitti:

    Teen Dos pohjoisia ohjelmia. Eikö noita pc timer rekistereitä voi jotenkin ohjata ja niistä tehdä viiveitä? Siellähän on joku sisäinen kellopussi joka on noin 1,193Mhz.

    Eilen vähän sen jälkeen kun vastasin tuohon ensimmäiseen kysymykseen löysin jonkun maininnan, että BIOS-portista lukeminen kestää noin mikrosekunnin. Funktiona siinä käytettiin inb:tä. En kuitenkaan löytänyt enää sitä samaa lähdettä uudelleen, mutta palaan asiaan jos löydän sen sivun taas.

    Äänestä

  • eräs kirjoitti:

    No jos ei yhden mikrosekunnin, niin saisiko lähes 10us viiveen (heitot sallittuja). Vai pitääkö tehdä oma IO- kortti viiveille.

    http://groups.google.fi/groups?hl=fi&lr=&ie=UTF-8&oe=UTF-8&selm=IO-Port-Programming.1-9126.857366578@cc.gatech.edu

    "For even shorter delays, there are a few methods. Outputting any byte to
    port 0x80 (see above for how to do it) should wait for almost exactly 1
    microsecond independent of your processor type and speed. You can do this
    multiple times to wait a few microseconds. The port output should have no
    harmful side effects on any standard machine (and some kernel drivers use
    it). This is how {in|out}[bw]_p() normally do the delay (see asm/io.h)."

    Äänestä

  • ööps kirjoitti:

    http://groups.google.fi/groups?hl=fi&lr=&ie=UTF-8&oe=UTF-8&selm=IO-Port-Programming.1-9126.857366578@cc.gatech.edu

    "For even shorter delays, there are a few methods. Outputting any byte to
    port 0x80 (see above for how to do it) should wait for almost exactly 1
    microsecond independent of your processor type and speed. You can do this
    multiple times to wait a few microseconds. The port output should have no
    harmful side effects on any standard machine (and some kernel drivers use
    it). This is how {in|out}[bw]_p() normally do the delay (see asm/io.h)."

    tuntuisi toimivankin alustavien kokeilujen perusteella.
    Testasin sitä 733Mhz pen. ja vanhassa 33Mhz 486:sessa.

    void viive_us(unsigned int luku)
    {
    unsigned int b;
    for(b=0; b

    Äänestä

Kommentoi aloitusta


eräs kirjoitti:

pitäisi tehdä aliohjelma jolla saisin mikrosekunnin viiveitä. Miten se onistuu?

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