View Full Version : سوال: چگونگی محاسبه اختلاف زمان با دقت زیاد ؟
clover
سه شنبه 13 بهمن 1388, 20:56 عصر
چگونه می توان اختلاف زمان را با دقتی در حد میلی ثانیه، بدون وابستگی به کامپایلر و یا پلتفرم خاصی محاسبه کرد ؟
ظاهرا توابع موجود در هدر فایل time زمان را با دقت ثانیه محاسبه می کنند.
به طور کلی بهترین راه پیاده سازی یک تایمر بدون وابستگی به کامپایلر و پلتفرم خاص و با استفاده از امکانات و کتابخانه های استاندارد C چی هست ؟
amin1softco
سه شنبه 13 بهمن 1388, 23:52 عصر
شاید این بدرد بخوره باشه:
typedef unsigned short word;
word *my_clock=(word *)0x0000046C; /* this points to the 18.2hz system
clock. */
/************************************************** ************************
* wait *
* Wait for a specified number of clock ticks (18hz). *
************************************************** ************************/
void wait(int ticks)
{
word start;
start=*my_clock;
while (*my_clock-start<ticks) *my_clock=*my_clock;
}
http://www.programmersheaven.com/mb/CandCPP/101658/101658/using-timer-interrupt-routine/?S=B10000&ReadPostMode=0
clover
پنج شنبه 15 بهمن 1388, 13:45 عصر
ظاهرا توابع موجود در هدر فایل time زمان را با دقت ثانیه محاسبه می کنند.
حرفم را تصحیح می کنم، این توابع تا میلی ثانیه هم جواب می دهند.
شاید این بدرد بخوره باشه:
دوست عزیز، امکانش هست کمی در مورد این کد توضیح بدید ؟ لینک مورد نظر را مشاهده کردم اما در اون لینک توضیحی برای یه مبتدی مثل من وجود نداشت.
تا جایی که متوجه شدم این کد از یکی از وقفه ها استفاده می کنه. و با این فرکانسی که ذکر شده قاعدتا نمیتونه اختلاف زمان هایی در حد میلی ثانیه را محاسبه کنه.
اگر ممکن هست در مورد قابلیت حملش هم توضیحی بفرمایید.
پیشاپیش متشکرم.
amin1softco
پنج شنبه 15 بهمن 1388, 14:29 عصر
دوست من این یکی از توابع قدیمی مخصوص به داسه که بیشتر در نوشتن بازی ها کاربرد داره این آدرس اشاره می کنه به یک عدد از نوع ( 32bit unsigned integer ) که بر اساس تغییر فرکانس های سی پی یو هست وقتی در اون حلقه گیر می کنه فرکانس سی پیو تغییر می کنه و تقریبا برابر 18.4 یا 18.2 در ثانیه است و این بر اساس تغییر فرکانس سی پیو یک تایمر محسوب می شه
من خودم اینجا دیدم زیاد هم ازش سر در نمی آرم:
http://www3.telus.net/alexander_russell/course/chapter_5.htm
بعد من می دونم که با ویژوال می شه بر حسب میلی ثانیه بدست آورد ولی با این سرفایل فکر کنم باید تقسیم بر 1000 کرد درسته در ضمن اینم اضافه کنم اگه به لینک بالا مراجعه کنید یک روش برای افزایش 18.4 هست که به هر مقداری که دلتون خواست برای میلی ثانیه مثلا به 1000 تا در ثانیه تبدیلش می کنید و حتی کمتر فکر کنم تا نانو بتونید با این در محیط داس حساب کنید این کد تا 60 بار در ثانیه حساب میشه که همان معنای هرتز است یک بر ثانیه
// speed up clock
asm {
mov bx, 19886 // set the clock speed to 60Hz (1193180/60)
mov al, 00110110b
out 43h, al
mov al, bl
out 40h, al
mov al, bh
out 40h, al
}
sh4mid
جمعه 16 بهمن 1388, 05:58 صبح
والا نمونه تحت Windows که داره(تحت Linux رو بلد نیستم)
تو Google درمورد QueryPerformanceCounter جستجو کن همون چیزی هست که می خواهی (high-resolution performance counter)
ali zi zeperto
دوشنبه 19 بهمن 1388, 19:28 عصر
برای کاربرای یونیکس و لینوکس تابع usleep() دقیق ترین کار رو می کنه.بر حسب میکروثانیه تاخیر میندازه.برای ویندوز نمی دونم کار می کنه یا نه.
a.gh.n
دوشنبه 19 بهمن 1388, 21:46 عصر
struct timeval رو سرچ کنید
بهترین گزینست.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.