On 19/01/16 16:44, Joel Sherrill wrote:


On Tue, Jan 19, 2016 at 9:15 AM, Sebastian Huber <sebastian.hu...@embedded-brains.de <mailto:sebastian.hu...@embedded-brains.de>> wrote:



    On 19/01/16 16:08, Joel Sherrill wrote:



        On Tue, Jan 19, 2016 at 8:57 AM, Sebastian Huber
        <sebastian.hu...@embedded-brains.de
        <mailto:sebastian.hu...@embedded-brains.de>
        <mailto:sebastian.hu...@embedded-brains.de
        <mailto:sebastian.hu...@embedded-brains.de>>> wrote:



            On 19/01/16 15:39, Joel Sherrill wrote:

                The tasks are delaying 500, 1000, and 1500 ticks with
                nanoseconds_per_tick = 10000000. Delay operations are
                guaranteed to be a minimum of the requested amount and
        this is
                not being honored.


            For the ticks based services this is not true, you wait to the
            n-th tick. If you are 1ps before it, you wait 1ps + interrupt
            processing time.


        That is not how the original requirements for RTEID were written:

        
https://ftp.rtems.org/pub/rtems/people/joel/RTEID-ORKID/RTEID-2.1/merged/

        See page 65 for tm_wkafter. Quoting:

        "If the system clock frequency is 100 ticks per second, and
        the requester wants to wait for 2 seconds, then the input
        parameter will be 100*2, or 200 ticks."

        I think you have to add 1 internally to all "ticks" based
        operations to ensure this requirement is met.


    If you add 1, then you have a potential integer overflow. How was
    it implemented in RTEMS v1? I guess this problem existed also in
    this version.


That was a long time ago. :)

The git history goes back to May 1995. I looked at release 3.2.1 on the ftp site and
it appears to be from the same time frame.

I do not anywhere that the 3.2.1 code added 1 to the ticks value.

I do recall math on the POSIX side having to add 1 to meet the minimum. In
fact, score/src/timespectoticks.c does it now.

That said, I don't know if I personally every measured anything like this. The TOD as reported matched expectations and the ticks since boot value matched what was requested. I do know clock tick accuracy on specific BSPs was measured.

What really bothers me now is this:

TA1 599562000:1088
TA2 599562000:2143
TA3 599562000:3199
TA1 599562004:997954
TA2 599562009:977896
TA1 599562009:978937
TA3 599562014:957903
TA1 599562014:958944
TA2 599562019:957907

Notice that per the RTEID specification, the request delay for TA1 was 5 seconds. The delay period between the first two reported is < 5 seconds. That violates the
original intent.

I guess this violation of the original intent exists since v1 of RTEMS.

In the early days you had no nanoseconds extension. Let t0 be the time of a clock tick, and so on. If you set the TOD at t0 + d with some time interval d < clock tick interval, then you effectively set the time reference point to t0. If you wait n ticks, then you will later observe that n ticks time passed.

The nanoseconds extension did change nothing here, since it uses the last clock tick as its reference point.

With the FreeBSD timecounters the reference point is no longer the last clock tick. This is the reason why you now observe the problem.


This negatively impacts periods and timeouts also.

For the Classic API I think this is now a feature. I would change nothing here (e.g. all ticks users at the API level) since it would alter the behaviour of existing applications.


Although there may have been a similar behavior in previous versions, I think it is very apparent now that the original requirement is not met. Classic API intervals
need 1 tick added and apparently there are paths through POSIX where the
current +1 tick is either not being tripped or not being executed.

I think this is a bug. Delays are always a minimum of the specified period.

For POSIX, which uses an absolute time, its clearly a bug. This bug shows up in the libstdc++ testsuite for example. I didn't bother to fix this, since the thread cancellation bugs are more important from my point of view and I am currently a bit overloaded.

--
Sebastian Huber, embedded brains GmbH

Address : Dornierstr. 4, D-82178 Puchheim, Germany
Phone   : +49 89 189 47 41-16
Fax     : +49 89 189 47 41-09
E-Mail  : sebastian.hu...@embedded-brains.de
PGP     : Public key available on request.

Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.

_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to