All of lore.kernel.org
 help / color / mirror / Atom feed
* [Xenomai-help] High resolution timers disabled on AT91SAM9G20 board after patching
@ 2010-10-29 18:34 at91_enthus
  2010-10-29 22:06 ` Gilles Chanteperdrix
  0 siblings, 1 reply; 8+ messages in thread
From: at91_enthus @ 2010-10-29 18:34 UTC (permalink / raw)
  To: xenomai

[-- Attachment #1: Type: text/plain, Size: 566 bytes --]

Hi!

I installed the latest xenomai patch on a AT91SAM9G20 board and everything
looked good at a first glance: no compilation problems, low latencies.

However, when I typed cat /proc/timer_list , the resolutions in  cpu0 and
cpu1 items showed 100000 (ns).
(I compiled the Xenomai patched kernel with High Resolution Timers enabled.)

I don't have this problem when I boot a real time kernel (RT_PREEMPT).

One more thing. I also have a Beagleboard that runs a Xenomai patched kernel
and in this case the resolution for HRT shows 1 ns, as it should.

Thanks,
Razvan

[-- Attachment #2: Type: text/html, Size: 616 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Xenomai-help] High resolution timers disabled on AT91SAM9G20 board after patching
  2010-10-29 18:34 [Xenomai-help] High resolution timers disabled on AT91SAM9G20 board after patching at91_enthus
@ 2010-10-29 22:06 ` Gilles Chanteperdrix
  2010-11-07 10:47   ` Gilles Chanteperdrix
       [not found]   ` <4CD68353.6030600@domain.hid>
  0 siblings, 2 replies; 8+ messages in thread
From: Gilles Chanteperdrix @ 2010-10-29 22:06 UTC (permalink / raw)
  To: at91_enthus; +Cc: xenomai

at91_enthus wrote:
> Hi!
> 
> I installed the latest xenomai patch on a AT91SAM9G20 board and
> everything looked good at a first glance: no compilation problems, low
> latencies.
> 
> However, when I typed cat /proc/timer_list , the resolutions in  cpu0
> and cpu1 items showed 100000 (ns).
> (I compiled the Xenomai patched kernel with High Resolution Timers enabled.)
> 
> I don't have this problem when I boot a real time kernel (RT_PREEMPT).

You mean another real-time kernel? If RT_PREEMPT uses the sys timer
running at 32kHz, and it tells you that it has a 1ns resolution, then it
is lying, because 32kHz, means a 30us resolution.

Xenomai uses one TC as a timer at whatever frequency your chip proposes
over 1 MHz, this means a resolution below 1us, the downside is that this
also means a very short wrap time. And since the TC is also used as a
clock, this means that we must enter the timer interrupt handler before
the counter wraps. And this is something that Linux without Xenomai
running can not guarantee.

Do you have this issue when running a Xenomai application?

Also note that if you use Xenomai timing services, you will not have
this issue, of course.

>
> One more thing. I also have a Beagleboard that runs a Xenomai patched
> kernel and in this case the resolution for HRT shows 1 ns, as it should.
>

If you read a bit more about the I-pipe patch for ARM, you will learn
that the timer implementation is specific to each SOC. So, comparing the
OMAP3530 to the AT91SAM9G20 is as much relevant as comparing the timer
of an X86 to the timer of a PowerPC.

-- 
                                                                Gilles.


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Xenomai-help] High resolution timers disabled on AT91SAM9G20 board after patching
  2010-10-29 22:06 ` Gilles Chanteperdrix
@ 2010-11-07 10:47   ` Gilles Chanteperdrix
       [not found]   ` <4CD68353.6030600@domain.hid>
  1 sibling, 0 replies; 8+ messages in thread
From: Gilles Chanteperdrix @ 2010-11-07 10:47 UTC (permalink / raw)
  To: at91_enthus; +Cc: xenomai

Gilles Chanteperdrix wrote:
> at91_enthus wrote:
>> Hi!
>>
>> I installed the latest xenomai patch on a AT91SAM9G20 board and
>> everything looked good at a first glance: no compilation problems, low
>> latencies.
>>
>> However, when I typed cat /proc/timer_list , the resolutions in  cpu0
>> and cpu1 items showed 100000 (ns).
>> (I compiled the Xenomai patched kernel with High Resolution Timers enabled.)
>>
>> I don't have this problem when I boot a real time kernel (RT_PREEMPT).
> 
> You mean another real-time kernel? If RT_PREEMPT uses the sys timer
> running at 32kHz, and it tells you that it has a 1ns resolution, then it
> is lying, because 32kHz, means a 30us resolution.
> 
> Xenomai uses one TC as a timer at whatever frequency your chip proposes
> over 1 MHz, this means a resolution below 1us, the downside is that this
> also means a very short wrap time. And since the TC is also used as a
> clock, this means that we must enter the timer interrupt handler before
> the counter wraps. And this is something that Linux without Xenomai
> running can not guarantee.

On the other hand, we can keep the timer ticking behind Linux' back.
Does the following patch fix the issue for you?

diff --git a/arch/arm/mach-at91/at91_ipipe_time.c
b/arch/arm/mach-at91/at91_ipipe_time.c
index b0327eb..6c6f0d7 100644
--- a/arch/arm/mach-at91/at91_ipipe_time.c
+++ b/arch/arm/mach-at91/at91_ipipe_time.c
@@ -76,9 +76,7 @@
 #define TCNXCNS(timer,v) ((v) << ((timer)<<1))
 #define AT91_TC_REG_MASK (0xffff)

-static unsigned long next_match;
-
-static unsigned max_delta_ticks, min_delta_ticks;
+static unsigned max_delta_ticks, min_delta_ticks, tick_pending;
 static struct clock_event_device clkevt;
 static int tc_timer_clock;

@@ -116,7 +114,11 @@ EXPORT_SYMBOL(__ipipe_mach_ticks_per_jiffy);
  */
 static irqreturn_t at91_timer_interrupt(int irq, void *dev_id)
 {
-	clkevt.event_handler(&clkevt);
+	if (__ipipe_mach_timerstolen || tick_pending) {
+		tick_pending = 0;
+		clkevt.event_handler(&clkevt);
+	}
+
 	return IRQ_HANDLED;
 }

@@ -130,12 +132,8 @@ void __ipipe_mach_acktimer(void)
 {
 	at91_tc_read(AT91_TC_SR);

-	if (unlikely(!__ipipe_mach_timerstolen)) {
-		__ipipe_tsc_update();
-		next_match = (next_match + __ipipe_mach_ticks_per_jiffy)
-			& AT91_TC_REG_MASK;
-		write_RC(next_match);
-	}
+	if (unlikely(!__ipipe_mach_timerstolen))
+		__ipipe_mach_set_dec(max_delta_ticks);
 }

 static void
@@ -147,7 +145,7 @@ at91_tc_set_mode(enum clock_event_mode mode, struct
clock_event_device *dev)
 	/* Disable all interrupts. */
 	at91_tc_write(AT91_TC_IDR, ~0ul);

-	if (mode == CLOCK_EVT_MODE_PERIODIC) {
+	if (mode == CLOCK_EVT_MODE_ONESHOT) {
 		unsigned long v;

 #ifndef CONFIG_ARCH_AT91SAM9263
@@ -169,9 +167,7 @@ at91_tc_set_mode(enum clock_event_mode mode, struct
clock_event_device *dev)
 		/* Use the clock selected by at91_timer_init as input clock. */
 		at91_tc_write(AT91_TC_CMR, tc_timer_clock);

-		/* Load the TC register C. */
-		next_match = __ipipe_mach_ticks_per_jiffy;
-		write_RC(next_match);
+		__ipipe_mach_set_dec(max_delta_ticks);

 		/* Enable CPCS interrupt. */
 		at91_tc_write(AT91_TC_IER, AT91_TC_CPCS);
@@ -181,6 +177,14 @@ at91_tc_set_mode(enum clock_event_mode mode, struct
clock_event_device *dev)
 	}
 }

+static int
+at91_tc_set_next_event(unsigned long delta, struct clock_event_device *dev)
+{
+	tick_pending = 1;
+	__ipipe_mach_set_dec(delta);
+	return 0;
+}
+
 /*
  * Reprogram the timer
  */
@@ -208,10 +212,11 @@ int __ipipe_check_tickdev(const char *devname)

 static struct clock_event_device clkevt = {
 	.name		= "at91_tc" __stringify(CONFIG_IPIPE_AT91_TC),
-	.features	= CLOCK_EVT_FEAT_PERIODIC,
+	.features	= CLOCK_EVT_FEAT_ONESHOT,
 	.shift		= 20,
 	.rating		= 250,
 	.set_mode	= at91_tc_set_mode,
+	.set_next_event = at91_tc_set_next_event,
 };

 static struct __ipipe_tscinfo tsc_info = {
@@ -230,7 +235,7 @@ static struct __ipipe_tscinfo tsc_info = {

 void __ipipe_mach_release_timer(void)
 {
-	__ipipe_mach_set_dec(__ipipe_mach_ticks_per_jiffy);
+	clkevt.set_next_event(__ipipe_mach_ticks_per_jiffy, &clkevt);
 }
 EXPORT_SYMBOL(__ipipe_mach_release_timer);

@@ -293,15 +298,16 @@ void __init at91_timer_init(void)
 	clkevt.max_delta_ns = wrap_ns;
 	clkevt.min_delta_ns = 2000;
 	clkevt.cpumask = cpumask_of(0);
-	clockevents_register_device(&clkevt);
-
-	tsc_info.freq = divided_freq;
-	__ipipe_tsc_register(&tsc_info);

 	__ipipe_mach_ticks_per_jiffy = (divided_freq + HZ/2) / HZ;
 	max_delta_ticks = (wrap_ns * clkevt.mult) >> clkevt.shift;
 	min_delta_ticks = ((unsigned long long) clkevt.min_delta_ns
 			   * clkevt.mult) >> clkevt.shift;
+
+	clockevents_register_device(&clkevt);
+
+	tsc_info.freq = divided_freq;
+	__ipipe_tsc_register(&tsc_info);
 }

 #ifdef CONFIG_ARCH_AT91RM9200


-- 
                                                                Gilles.


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [Xenomai-help] High resolution timers disabled on AT91SAM9G20 board after patching
       [not found]   ` <4CD68353.6030600@domain.hid>
@ 2010-11-07 16:09     ` at91_enthus
  2010-11-07 17:15       ` Gilles Chanteperdrix
  0 siblings, 1 reply; 8+ messages in thread
From: at91_enthus @ 2010-11-07 16:09 UTC (permalink / raw)
  To: Gilles Chanteperdrix; +Cc: xenomai


[-- Attachment #1.1: Type: text/plain, Size: 6037 bytes --]

Yes, it solved the issue.

There is  one thing that bothers me, though. When I run  "xeno-test", the
average and minimal  latencies are constant all the time.

The unpatched version of the xeno kernel seems more consistent when it comes
to minimum, maximum and average latencies.

I attached a couple of snippets of  xeno-test outputs .

Thanks,

R.

On Sun, Nov 7, 2010 at 4:45 AM, Gilles Chanteperdrix <
gilles.chanteperdrix@xenomai.org> wrote:

> Gilles Chanteperdrix wrote:
> > at91_enthus wrote:
> >> Hi!
> >>
> >> I installed the latest xenomai patch on a AT91SAM9G20 board and
> >> everything looked good at a first glance: no compilation problems, low
> >> latencies.
> >>
> >> However, when I typed cat /proc/timer_list , the resolutions in  cpu0
> >> and cpu1 items showed 100000 (ns).
> >> (I compiled the Xenomai patched kernel with High Resolution Timers
> enabled.)
> >>
> >> I don't have this problem when I boot a real time kernel (RT_PREEMPT).
> >
> > You mean another real-time kernel? If RT_PREEMPT uses the sys timer
> > running at 32kHz, and it tells you that it has a 1ns resolution, then it
> > is lying, because 32kHz, means a 30us resolution.
> >
> > Xenomai uses one TC as a timer at whatever frequency your chip proposes
> > over 1 MHz, this means a resolution below 1us, the downside is that this
> > also means a very short wrap time. And since the TC is also used as a
> > clock, this means that we must enter the timer interrupt handler before
> > the counter wraps. And this is something that Linux without Xenomai
> > running can not guarantee.
>
> On the other hand, we can keep the timer ticking behind Linux' back.
> Does the following patch fix the issue for you?
>
> diff --git a/arch/arm/mach-at91/at91_ipipe_time.c
> b/arch/arm/mach-at91/at91_ipipe_time.c
> index b0327eb..6c6f0d7 100644
> --- a/arch/arm/mach-at91/at91_ipipe_time.c
> +++ b/arch/arm/mach-at91/at91_ipipe_time.c
> @@ -76,9 +76,7 @@
>  #define TCNXCNS(timer,v) ((v) << ((timer)<<1))
>  #define AT91_TC_REG_MASK (0xffff)
>
> -static unsigned long next_match;
> -
> -static unsigned max_delta_ticks, min_delta_ticks;
> +static unsigned max_delta_ticks, min_delta_ticks, tick_pending;
>  static struct clock_event_device clkevt;
>  static int tc_timer_clock;
>
> @@ -116,7 +114,11 @@ EXPORT_SYMBOL(__ipipe_mach_ticks_per_jiffy);
>  */
>  static irqreturn_t at91_timer_interrupt(int irq, void *dev_id)
>  {
> -       clkevt.event_handler(&clkevt);
> +       if (__ipipe_mach_timerstolen || tick_pending) {
> +               tick_pending = 0;
> +               clkevt.event_handler(&clkevt);
> +       }
> +
>        return IRQ_HANDLED;
>  }
>
> @@ -130,12 +132,8 @@ void __ipipe_mach_acktimer(void)
>  {
>        at91_tc_read(AT91_TC_SR);
>
> -       if (unlikely(!__ipipe_mach_timerstolen)) {
> -               __ipipe_tsc_update();
> -               next_match = (next_match + __ipipe_mach_ticks_per_jiffy)
> -                       & AT91_TC_REG_MASK;
> -               write_RC(next_match);
> -       }
> +       if (unlikely(!__ipipe_mach_timerstolen))
> +               __ipipe_mach_set_dec(max_delta_ticks);
>  }
>
>  static void
> @@ -147,7 +145,7 @@ at91_tc_set_mode(enum clock_event_mode mode, struct
> clock_event_device *dev)
>        /* Disable all interrupts. */
>        at91_tc_write(AT91_TC_IDR, ~0ul);
>
> -       if (mode == CLOCK_EVT_MODE_PERIODIC) {
> +       if (mode == CLOCK_EVT_MODE_ONESHOT) {
>                unsigned long v;
>
>  #ifndef CONFIG_ARCH_AT91SAM9263
> @@ -169,9 +167,7 @@ at91_tc_set_mode(enum clock_event_mode mode, struct
> clock_event_device *dev)
>                /* Use the clock selected by at91_timer_init as input clock.
> */
>                at91_tc_write(AT91_TC_CMR, tc_timer_clock);
>
> -               /* Load the TC register C. */
> -               next_match = __ipipe_mach_ticks_per_jiffy;
> -               write_RC(next_match);
> +               __ipipe_mach_set_dec(max_delta_ticks);
>
>                /* Enable CPCS interrupt. */
>                at91_tc_write(AT91_TC_IER, AT91_TC_CPCS);
> @@ -181,6 +177,14 @@ at91_tc_set_mode(enum clock_event_mode mode, struct
> clock_event_device *dev)
>        }
>  }
>
> +static int
> +at91_tc_set_next_event(unsigned long delta, struct clock_event_device
> *dev)
> +{
> +       tick_pending = 1;
> +       __ipipe_mach_set_dec(delta);
> +       return 0;
> +}
> +
>  /*
>  * Reprogram the timer
>  */
> @@ -208,10 +212,11 @@ int __ipipe_check_tickdev(const char *devname)
>
>  static struct clock_event_device clkevt = {
>        .name           = "at91_tc" __stringify(CONFIG_IPIPE_AT91_TC),
> -       .features       = CLOCK_EVT_FEAT_PERIODIC,
> +       .features       = CLOCK_EVT_FEAT_ONESHOT,
>        .shift          = 20,
>        .rating         = 250,
>        .set_mode       = at91_tc_set_mode,
> +       .set_next_event = at91_tc_set_next_event,
>  };
>
>  static struct __ipipe_tscinfo tsc_info = {
> @@ -230,7 +235,7 @@ static struct __ipipe_tscinfo tsc_info = {
>
>  void __ipipe_mach_release_timer(void)
>  {
> -       __ipipe_mach_set_dec(__ipipe_mach_ticks_per_jiffy);
> +       clkevt.set_next_event(__ipipe_mach_ticks_per_jiffy, &clkevt);
>  }
>  EXPORT_SYMBOL(__ipipe_mach_release_timer);
>
> @@ -293,15 +298,16 @@ void __init at91_timer_init(void)
>        clkevt.max_delta_ns = wrap_ns;
>        clkevt.min_delta_ns = 2000;
>        clkevt.cpumask = cpumask_of(0);
> -       clockevents_register_device(&clkevt);
> -
> -       tsc_info.freq = divided_freq;
> -       __ipipe_tsc_register(&tsc_info);
>
>        __ipipe_mach_ticks_per_jiffy = (divided_freq + HZ/2) / HZ;
>        max_delta_ticks = (wrap_ns * clkevt.mult) >> clkevt.shift;
>        min_delta_ticks = ((unsigned long long) clkevt.min_delta_ns
>                           * clkevt.mult) >> clkevt.shift;
> +
> +       clockevents_register_device(&clkevt);
> +
> +       tsc_info.freq = divided_freq;
> +       __ipipe_tsc_register(&tsc_info);
>  }
>
>  #ifdef CONFIG_ARCH_AT91RM9200
>
>
> --
>                                             Gilles.
>

[-- Attachment #1.2: Type: text/html, Size: 7068 bytes --]

[-- Attachment #2: benchmark_no_patch --]
[-- Type: application/octet-stream, Size: 1845 bytes --]

warming up...
RTT|  00:00:01  (periodic user-mode task, 1000 us period, priority 99)
RTH|----lat min|----lat avg|----lat max|-overrun|---msw|---lat best|--lat worst
RTD|     13.565|     13.565|     19.379|       0|     0|     13.565|     19.379
RTD|     13.565|     15.503|     74.612|       0|     0|     13.565|     74.612
RTD|     13.565|     45.542|     72.674|       0|     0|     13.565|     74.612
RTD|     14.534|     14.534|     38.759|       0|     0|     13.565|     74.612
RTD|     56.201|     57.170|     80.426|       0|     0|     13.565|     80.426
RTD|     14.534|     14.534|     34.883|       0|     0|     13.565|     80.426
RTD|     56.201|     56.201|     71.705|       0|     0|     13.565|     80.426
RTD|     14.534|     45.542|     72.674|       0|     0|     13.565|     80.426
RTD|     14.534|     14.534|     31.007|       0|     0|     13.565|     80.426
RTD|     18.410|     56.201|     81.395|       0|     0|     13.565|     81.395
RTD|     14.534|     14.534|     30.038|       0|     0|     13.565|     81.395
RTD|     13.565|     14.534|     33.914|       0|     0|     13.565|     81.395
RTD|     55.232|     56.201|     76.550|       0|     0|     13.565|     81.395
RTD|     14.534|     14.534|     35.852|       0|     0|     13.565|     81.395
RTD|     56.201|     57.170|     80.426|       0|     0|     13.565|     81.395
RTD|     13.565|     14.534|     50.387|       0|     0|     13.565|     81.395
RTD|     56.201|     56.201|     72.674|       0|     0|     13.565|     81.395
RTD|     14.534|     45.542|     73.643|       0|     0|     13.565|     81.395
RTD|     14.534|     14.534|     31.007|       0|     0|     13.565|     81.395
RTD|     18.410|     56.201|     80.426|       0|     0|     13.565|     81.395
RTD|     14.534|     14.534|     32.945|       0|     0|     13.565|     81.395

[-- Attachment #3: benchmark_patched --]
[-- Type: application/octet-stream, Size: 1845 bytes --]

warming up...
RTT|  00:00:01  (periodic user-mode task, 1000 us period, priority 99)
RTH|----lat min|----lat avg|----lat max|-overrun|---msw|---lat best|--lat worst
RTD|     47.480|     47.480|     50.387|       0|     0|     47.480|     50.387
RTD|     47.480|     47.480|     67.829|       0|     0|     47.480|     67.829
RTD|     47.480|     47.480|     59.108|       0|     0|     47.480|     67.829
RTD|     47.480|     47.480|     65.891|       0|     0|     47.480|     67.829
RTD|     47.480|     47.480|     67.829|       0|     0|     47.480|     67.829
RTD|     47.480|     47.480|     61.046|       0|     0|     47.480|     67.829
RTD|     47.480|     47.480|     59.108|       0|     0|     47.480|     67.829
RTD|     47.480|     47.480|     61.046|       0|     0|     47.480|     67.829
RTD|     47.480|     47.480|     59.108|       0|     0|     47.480|     67.829
RTD|     47.480|     47.480|     59.108|       0|     0|     47.480|     67.829
RTD|     47.480|     47.480|     77.519|       0|     0|     47.480|     77.519
RTD|     47.480|     47.480|     58.139|       0|     0|     47.480|     77.519
RTD|     47.480|     47.480|     58.139|       0|     0|     47.480|     77.519
RTD|     47.480|     47.480|     59.108|       0|     0|     47.480|     77.519
RTD|     47.480|     47.480|     58.139|       0|     0|     47.480|     77.519
RTD|     47.480|     47.480|     61.046|       0|     0|     47.480|     77.519
RTD|     47.480|     47.480|     77.519|       0|     0|     47.480|     77.519
RTD|     47.480|     47.480|     58.139|       0|     0|     47.480|     77.519
RTD|     47.480|     47.480|     59.108|       0|     0|     47.480|     77.519
RTD|     47.480|     47.480|     60.077|       0|     0|     47.480|     77.519
RTD|     47.480|     47.480|     60.077|       0|     0|     47.480|     77.519

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Xenomai-help] High resolution timers disabled on AT91SAM9G20 board after patching
  2010-11-07 16:09     ` at91_enthus
@ 2010-11-07 17:15       ` Gilles Chanteperdrix
  2010-11-07 19:45         ` at91_enthus
  0 siblings, 1 reply; 8+ messages in thread
From: Gilles Chanteperdrix @ 2010-11-07 17:15 UTC (permalink / raw)
  To: at91_enthus; +Cc: Gilles Chanteperdrix, xenomai

at91_enthus wrote:
> Yes, it solved the issue.
> 
> There is  one thing that bothers me, though. When I run  "xeno-test", the
> average and minimal  latencies are constant all the time.
> 
> The unpatched version of the xeno kernel seems more consistent when it comes
> to minimum, maximum and average latencies.
> 
> I attached a couple of snippets of  xeno-test outputs .

Do not trust xeno-test too much. Are you sure the only difference
between the two runs is the patch, for instance, have you not played
with the CONFIG_ARM_FCSE option? Also, good benchmarks are done with
running a separate load, and not with xeno-test, in fact.

Also, using the high-res timers configuration has a high overhead on
such low-end configurations as AT91s, so has CONFIG_PREEMPT. So, if you
are looking for a configuration with the lowest overhead possible, I
would recommend disabling CONFIG_HIGH_RES_TIMERS and using
CONFIG_PREEMPT_NONE or CONFIG_PREEMPT_VOLUNTARY, and relying on Xenomai
for the low latency and high resolution timer features. (You can measure
the overhead of kernel options with the hackbench test for instance).

On the AT91 I have (AT91SAM9263), the minimum and average latencies
oscillate much less than for your unpatched kernel, either with or
without the patch so I wonder if you would not have another issue. Do
you have FCSE enabled?

To give you an idea of the figures here, with FCSE enabled, the minimal
latency is around 15us and the average latency around 50us. And they
vary in a 5us range, they do not make big jumps.


-- 
                                                                Gilles.


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Xenomai-help] High resolution timers disabled on AT91SAM9G20 board after patching
  2010-11-07 17:15       ` Gilles Chanteperdrix
@ 2010-11-07 19:45         ` at91_enthus
  2010-11-07 20:24           ` Gilles Chanteperdrix
  0 siblings, 1 reply; 8+ messages in thread
From: at91_enthus @ 2010-11-07 19:45 UTC (permalink / raw)
  To: Gilles Chanteperdrix; +Cc: xenomai

[-- Attachment #1: Type: text/plain, Size: 1990 bytes --]

Indeed, there's a huge difference regarding minimum and average latencies
now that FCSE is enabled and HRT and CONFIG_PREEMPT are disabled. I get
around 13.5 microseconds average latencies.

Thanks a lot.

On Sun, Nov 7, 2010 at 11:15 AM, Gilles Chanteperdrix <
gilles.chanteperdrix@xenomai.org> wrote:

> at91_enthus wrote:
> > Yes, it solved the issue.
> >
> > There is  one thing that bothers me, though. When I run  "xeno-test", the
> > average and minimal  latencies are constant all the time.
> >
> > The unpatched version of the xeno kernel seems more consistent when it
> comes
> > to minimum, maximum and average latencies.
> >
> > I attached a couple of snippets of  xeno-test outputs .
>
> Do not trust xeno-test too much. Are you sure the only difference
> between the two runs is the patch, for instance, have you not played
> with the CONFIG_ARM_FCSE option? Also, good benchmarks are done with
> running a separate load, and not with xeno-test, in fact.
>
> Also, using the high-res timers configuration has a high overhead on
> such low-end configurations as AT91s, so has CONFIG_PREEMPT. So, if you
> are looking for a configuration with the lowest overhead possible, I
> would recommend disabling CONFIG_HIGH_RES_TIMERS and using
> CONFIG_PREEMPT_NONE or CONFIG_PREEMPT_VOLUNTARY, and relying on Xenomai
> for the low latency and high resolution timer features. (You can measure
> the overhead of kernel options with the hackbench test for instance).
>
> On the AT91 I have (AT91SAM9263), the minimum and average latencies
> oscillate much less than for your unpatched kernel, either with or
> without the patch so I wonder if you would not have another issue. Do
> you have FCSE enabled?
>
> To give you an idea of the figures here, with FCSE enabled, the minimal
> latency is around 15us and the average latency around 50us. And they
> vary in a 5us range, they do not make big jumps.
>
>
> --
>                                                                 Gilles.
>

[-- Attachment #2: Type: text/html, Size: 2477 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Xenomai-help] High resolution timers disabled on AT91SAM9G20 board after patching
  2010-11-07 19:45         ` at91_enthus
@ 2010-11-07 20:24           ` Gilles Chanteperdrix
  2010-11-07 20:34             ` at91_enthus
  0 siblings, 1 reply; 8+ messages in thread
From: Gilles Chanteperdrix @ 2010-11-07 20:24 UTC (permalink / raw)
  To: at91_enthus; +Cc: xenomai

at91_enthus wrote:
> Indeed, there's a huge difference regarding minimum and average latencies
> now that FCSE is enabled and HRT and CONFIG_PREEMPT are disabled. I get
> around 13.5 microseconds average latencies.

Wow. Under load?

-- 
                                                                Gilles.


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Xenomai-help] High resolution timers disabled on AT91SAM9G20 board after patching
  2010-11-07 20:24           ` Gilles Chanteperdrix
@ 2010-11-07 20:34             ` at91_enthus
  0 siblings, 0 replies; 8+ messages in thread
From: at91_enthus @ 2010-11-07 20:34 UTC (permalink / raw)
  To: Gilles Chanteperdrix; +Cc: xenomai

[-- Attachment #1: Type: text/plain, Size: 1026 bytes --]

Xeno-test is the only benchmark I have for the time being (I just started
with xenomai).
So if you consider that  "dd if=.. of=.."  is a reliable load, then yes.

Here's a snippet of xeno-test's output:

warming up...
RTT|  00:00:01  (periodic user-mode task, 1000 us period, priority 99)
RTH|----lat min|----lat avg|----lat max|-overrun|---msw|---lat best|--lat
worst
RTD|     12.596|     13.565|     24.224|       0|     0|     12.596|
24.224
RTD|     12.596|     13.565|     32.945|       0|     0|     12.596|
32.945
RTD|     13.565|     13.565|     37.790|       0|     0|     12.596|
37.790

R.

On Sun, Nov 7, 2010 at 2:24 PM, Gilles Chanteperdrix <
gilles.chanteperdrix@xenomai.org> wrote:

> at91_enthus wrote:
> > Indeed, there's a huge difference regarding minimum and average latencies
> > now that FCSE is enabled and HRT and CONFIG_PREEMPT are disabled. I get
> > around 13.5 microseconds average latencies.
>
> Wow. Under load?
>
> --
>                                                                 Gilles.
>

[-- Attachment #2: Type: text/html, Size: 1547 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2010-11-07 20:34 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-10-29 18:34 [Xenomai-help] High resolution timers disabled on AT91SAM9G20 board after patching at91_enthus
2010-10-29 22:06 ` Gilles Chanteperdrix
2010-11-07 10:47   ` Gilles Chanteperdrix
     [not found]   ` <4CD68353.6030600@domain.hid>
2010-11-07 16:09     ` at91_enthus
2010-11-07 17:15       ` Gilles Chanteperdrix
2010-11-07 19:45         ` at91_enthus
2010-11-07 20:24           ` Gilles Chanteperdrix
2010-11-07 20:34             ` at91_enthus

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.