This is the mail archive of the ecos-discuss@sources.redhat.com mailing list for the eCos project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: # ticks per second?



Jonathan Larmour <jlarmour@redhat.com> writes:

> Andreas.Karlsson@combitechsystems.com wrote:
> > 
> > Is this rows correct to obtain the number of ticks per second? I want some
> > 
> > timers to go off after some seconds.
> > 
> > /Andreas
> > 
> > cyg_resolution_t clock_res;
> > 
> > cyg_handle_t clock_handle;
> > 
> > cyg_uint32 sec;
> > 
> > clock_handle=cyg_real_time_clock();
> > 
> > clock_res=cyg_clock_get_resolution(clock_handle);
> > 
> > sec=(clock_res.divisor/clock_res.dividend)*1000000000; //dividend/divisor?
> 
> Yes, although you run the risk of underflow: divisor would typically be
> something like 100 whereas dividend would be 1E9. So try using:
> 
> unsigned long long lltmp;
> tmp = (clock_res.divisor*1000000000)/clock_res.dividend;
> sec = tmp;

And there is a C++ solution to this within the kernel.  See the test
clockcnv.cxx in the kernel tests directory for how to use it, and clock.cxx
in the kernel source for its implementation.

It reduces and factorizes the big numbers so that instead of doing

	K * DIVISOR * 10^N / DIVIDEND

or whatever, it does

	K * A / C * B / D

where ABCD are chosen such that

	A * B    DIVISOR * 10^N
	----- == --------------
	C * D       DIVIDEND

thus making it all far less likely to underflow or lose precision.

It doesn't (yet) have a KAPI (C) API.  It's used within the uITRON
implementation to get milliSecond clocks, which is bare C++.

Feel free to design and contribute a KAPI API?

HTH
	- Huge

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]