pitäisi tehdä aliohjelma jolla saisin mikrosekunnin viiveitä. Miten se onistuu?
Miten viiveitä?
eräs
9773
0Äänestä
Muut lukivat myös
Odottaa vastausta
Näihin keskusteluihin ei ole vielä vastattu. Ole ensimmäinen.
Turvaa tilisi vahvistamalla puhelinnumerosi. Voit silloin palauttaa unohtuneen salasanan tekstiviestillä.
Näihin keskusteluihin ei ole vielä vastattu. Ole ensimmäinen.
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 mechanism, 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.
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
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.
No jos ei yhden mikrosekunnin, niin saisiko lähes 10us viiveen (heitot sallittuja). Vai pitääkö tehdä oma IO- kortti viiveille.
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.
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