This is the mail archive of the
ecos-devel@sources.redhat.com
mailing list for the eCos project.
Re: [ECOS] periodic threads with kapi?
- From: Bart Veer <bartv at ecoscentric dot com>
- To: icanoop at bitwiser dot org
- Cc: ecos-discuss at sources dot redhat dot com, ecos-devel at sources dot redhat dot com
- Date: Mon, 18 Aug 2003 09:53:18 +0100 (BST)
- Subject: Re: [ECOS] periodic threads with kapi?
- References: <20030817140013.GA27112@bitwiser.org> <20030817184316.89A1EEC758@delenn.bartv.net> <20030818040523.GA30591@bitwiser.org>
>>>>> "Ryan" == Ryan Boder <icanoop@bitwiser.org> writes:
Ryan> On Sun, Aug 17, 2003 at 07:43:16PM +0100, Bart Veer wrote:
>> >>>>> "Ryan" == Ryan Boder <icanoop@bitwiser.org> writes:
>>
Ryan> Is there a clean way to do periodic threads with absolute
Ryan> timing, as opposed to the relative timing you get with
Ryan> cyg_thread_delay()?
>>
>> This should be easy enough using something like:
>>
>> void
>> my_thread_delay_absolute(cyg_tick_count_t abs_time)
>> {
>> cyg_tick_count_t delay = abs_time - cyg_current_time();
>> if (delay > 0) {
>> cyg_thread_delay(delay);
>> }
>> }
>>
>> There is a possible problem if the current thread gets descheduled
>> between the cyg_current_time() and cyg_thread_delay() calls, causing
>> the thread to get delayed for longer than intended. You could avoid
>> that by e.g. temporarily boosting the current thread's priority.
Ryan> The problem still exists doing it that way. In fact that
Ryan> would even make it worse.
Ryan> The point is that I don't want to read the current time each
Ryan> period in my thread. That causes drift.
There is no drift. The calling code should calculate the new value of
abs_time by adding the appropriate number of ticks to the previous
value of abs_time, thus moving from one absolute time to the next. For
example adding 100 each time will give absolute intervals of 1 second
(assuming the usual 10ms clock).
If instead the calling code calculated the new value of abs_time by
adding 100 to cyg_current_time() rather than to the previous value of
abs_time then you would get drift - that would be equivalent to
calling cyg_thread_delay().
Bart
--
Bart Veer eCos Configuration Architect
http://www.ecoscentric.com/ The eCos and RedBoot experts