RTEMS - rtems_clock_get_uptime() fails during timer tick
Rolf Schroedter
rolf.schroedter at dlr.de
Fri Feb 25 13:56:28 UTC 2011
On 25.02.2011 14:27, Joel Sherrill wrote:
> On 02/25/2011 03:06 AM, Rolf Schroedter wrote:
>> Hi Joel,
>> IMO your suggestion to let the nanoseconds handler return a value larger
>> than a tick is the cleanest solution.
>> I implemented it for the LEON3 BSP and it seems to work.
>>
>> Fortunately the LEON3 timer has a InterruptPending(IP) hardware flag
>> which can be polled and manually reset.
>> Therefore two changes were necessary:
>>
>> 1. Install a LEON3 timer interrupt handler resetting the IP flag on
>> every timer tick.
>> 2. Change the LEON3 nanoseconds-handler to check the IP flag:
>> read nanoseconds from timer register
>> if ( timer_interrupt_pending )
>> nanoseconds += timer_tick
>>
>> I'll post the patch to Jiri Gaisler, shall I also post it here ?
>>
> Please. If you can also hack it into the other sparc BSPs,
> that would be appreciated.
>
> Actually file this as a PR. This is something I would like
> to apply to appropriate release branches.
>
> --joel
Okay. I'm currently not in my office, so I'll submit the patches next week.
As Manuel Coutinho pointed out, his patches for ERC32 & LEON2 are here:
http://www.rtems.com/ml/rtems-users/2009/march/msg00210.html
@Manuel, perhaps we shall collect these patches together with my LEON3
patch into a single PR.
Rolf.
>> Regards, Rolf
>>
>> Joel Sherrill wrote, On 24.02.2011 14:28:
>>> Can the BSP's get nanoseconds handler return a value that is
>>> more than a clock tick? This case is just on the edge of
>>> wrapping the count down timer. If the counter goes negative,
>>> does the get nanoseconds since last tick handler in the
>>> BSP "do the right thing"
>>>
>>> On 02/24/2011 01:51 AM, Rolf Schroedter wrote:
>>>> I tried to protect the call to rtems_clock_get_uptime() from
>>>> interrupts
>>>> (this was easier than to recompile RTEMS):
>>>>
>>>> #define _get_uptime( _ptr_uptime ) \
>>>> { \
>>>> rtems_interrupt_level _level; \
>>>> \
>>>> rtems_interrupt_disable(_level); \
>>>> rtems_clock_get_uptime( _ptr_uptime ); \
>>>> rtems_interrupt_enable(_level); \
>>>> }
>>>>
>>>> But surprisingly (at least for me) this didn't solve the problem.
>>>> Okay, I'll try to grab into the RTEMS sources.
>>>>
>>>> Thanks& regards,
>>>> Rolf.
>>>>
>>>>
>>>> On 24.02.2011 01:23, Gedare Bloom wrote:
>>>>> Hi,
>>>>>
>>>>> I suppose if your code is interrupting the rtems_clock_tick, this
>>>>> behavior might happen. Can you try to add an ISR_Disable / ISR_Enable
>>>>> protection around the call to "_Timestamp_Add_to(&_TOD_Uptime,&tick
>>>>> );" in cpukit/score/src/coretodtickle.c and see if the problem
>>>>> disappears?
>>>>>
>>>>> -Gedare
>>>>>
>>>> _______________________________________________
>>>> rtems-users mailing list
>>>> rtems-users at rtems.org
>>>> http://www.rtems.org/mailman/listinfo/rtems-users
>>
>
--
------------------------------------
Rolf Schroedter
German Aerospace Center
Institute of Planetary Research
D-12489 Berlin, Rutherfordstrasse 2
Tel/Fax: (+49) (30) 67055-416/384
Email: Rolf.Schroedter at dlr.de
More information about the users
mailing list