TCH (statz) | #1, Főfasz (10466) |
2299 | #2993 | ^ | Idézet | Thu, 26 Dec 2013 22:57:41 +01 |
31.46.*.* | *.catv.pool.telekom.hu |
Most már kezd kihullani az összes létező hajam. Szükségem lenne egy olyan usleep függvényre, ami képes ténylegesen 1 µszekundumot várakozni. Na most, a következő lehetőségeket találtam. • fpNanoSleep() a FreePascal színeiben. Ez nagyon király. Pont ez az, amire gondoltam. Csak egy dolgot nem tud, amire viszont szükségem lenne. Működni. Merthogy kurwára nem működik. • rdtsc a sux86 "processzorok" utasításkészletének színeiben. Van a fax86-okban egy counter, ami az órajelnek megfelelő sebességgel inkrementálódik és ezzel lehet lekérni. Ez is pont jó lenne nekem, így ugyan assemblerben kell megírnom az időzítőt, de hát az nem baj. Az viszont már annál nagyobb baj, hogy ehhez kéne az órajel! Ezt ugyan még ki lehet mérni úgy, hogy lekéred a tick-countert, vársz egy másodpercet, lekéred megint és a különbséget 1000000-val elosztva megkapod, hogy 1 µsec az hány tick. Viszont az órajel már kurwa régen nem statikus! Innentől kezdve viszont minden várakozás előtt ki kéne mérnem, hogy most mennyi az órajel! Marha fasza lenne úgy várakozni 1 µszekundumot, hogy közben várok egymilliót... PC-s SUXXX! • Rendszeridő lekérése, ugyanis az is µszekundumban van mérve. Utána addig kérem le a rendszeridőt, amíg egyezik az először lekérttel. Na ja. Übergány...viszont működik...10 µszekundumos nagyságrendben! Ha lejjebb megyek és 1-2 µs-t akarok vele időzíteni, akkor késik! AAAARGH!!! Komolyan nem hiszem el bazdmeg, ennyire túl nagy kérés ez?! Itt van egy kibaszott gép, benne egy 2.4 GHz-en járó procival, ami azt jelenti, hogy egy tick kevesebb, mint fél nanoszekundumig tart, ez kevesebb, mint a µszekundum kétezred része, hát nem hiszem el, hogy ennyire képtelenség rajta egy olyan időzítőt összehozni, ami a sebességétől több mint kétezerszer lassabb! Miezmár?! Sz*rk: 2015.12.20.: Közben találtam egy elég jó megoldást, ami nincs túlkomplikálva. A gép egyes portjainak az elérése pontosan 1 µsec-ig tart az ISA bus latency miatt. #include <sys/io.h> ioperm(0x80, 1, 1);És utána ha várni akarunk 1 mikroszekundumot, akkor inb(0x80);Sz*rk 2024.09.19.: Egyébként ez sem pontosan 1 µs, valamivel kevesebb, bár nem sokkal (~770 ns). |