On Sun, 2010-11-14 at 01:24 +0100, ronny meeus wrote:
> Hello
>
> I'm currently fighting with a problem in the pSOS+ skin.
> This my system information:
>
> [ 2.314676] pci 0000:00:01.0: Activating ISA DMA hang workarounds
> [ 2.416025] I-pipe: Domain Xenomai registered.
> [ 2.418183] Xenomai: hal/i386 started.
> [ 2.422780] Xenomai: scheduling class idle registered.
> [ 2.424116] Xenomai: scheduling class rt registered.
> [ 2.566737] Xenomai: real-time nucleus v2.5.4 (Sleep Walk) loaded.
> [ 2.590628] Xenomai: starting native API services.
> [ 2.604491] Xenomai: starting pSOS+ services.
> [ 2.619941] HugeTLB registered 4 MB page size, pre-allocated 0
> pages
>
> This is a piece of testcode I have created:
>
> check("tm_evevery",tm_evevery(4,3,&tmr_id),0);
> check("tm_cancel",tm_cancel(tmr_id),0);
> ev_rcvd = 0;
> ret = ev_receive(4,EV_ANY|EV_WAIT,10,&ev_rcvd);
> check("ev_receive",ret,ERR_TIMEOUT);
>
> I just start a periodic timer that expires every 3 ticks and at expiry
> sends event 4 to my task.
You test rather arms a timer for sending event_list=0x3 each 4 ticks.
> I want to check the cancel of the timer, so I cancel it and I would
> expect not to receive any event.
>
> What I observe is that this code is not working: I immediately receive
> the event after starting the timer.
Please try this test code as well:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <psos+/psos.h>
void foo (u_long a0, u_long a1, u_long a2, u_long a3)
{
u_long ret, ev = 0, tmid;
printf("Started... (%lu, %lu, %lu, %lu)\n", a0, a1, a2, a3);
ret = tm_evevery(4, 3, &tmid);
printf("tm_evevery(4, 3, &tmid) => %lu\n", ret);
ret = tm_cancel(tmid);
printf("tm_cancel(&tmid) => %lu\n", ret);
ret = ev_receive(4, EV_ANY|EV_WAIT, 10, &ev);
printf("ev_receive(4, EV_ANY|EV_WAIT, 10, &ev) => %lu, ev=0x%lx\n",
ret, ev);
}
int main (int ac, char **av)
{
u_long ret, tid = 0, args[4];
mlockall(MCL_CURRENT | MCL_FUTURE);
ret = t_create("TEST", 1, 0, 0, 0, &tid);
printf("t_create(tid=%lu) = %lu\n", tid, ret);
args[0] = 1;
args[1] = 2;
args[2] = 3;
args[3] = 4;
ret = t_start(tid, 0, foo, args);
printf("t_start(tid=%lu) = %lu\n", tid, ret);
return 0;
}
> If I change the code like shown below (I added the ev_receive with the
> NO_WAIT option after starting the timer), the code works fine.
>
> check("tm_evevery",tm_evevery(4,3,&tmr_id),0);
> ret = ev_receive(4,EV_ANY|EV_NOWAIT,0,&ev_rcvd);
Do you receive ERR_NOEVS as expected here?
> check("tm_cancel",tm_cancel(tmr_id),0);
> ev_rcvd = 0;
> ret = ev_receive(4,EV_ANY|EV_WAIT,10,&ev_rcvd);
> check("ev_receive",ret,ERR_TIMEOUT);
>
> Now my question is: how do I investigate an issue like this? In other
> words, which are the best tools since this code involves both user and
> kernel space debugging.
> Are there some trace tools available that are able to generate a kind
> of sequence / trace of what is happing over time.
>
> I also have other issues that are not consistently reproducible. For
> this kind of problems trace tools would also be useful.
>
If you want to validate the pSOS emulation core, the best tool is the
simulator. Unfortunately, this tools still requires to be built with an
antiquated C++ toolchain, so the only sane way to enable it nowadays is
via qemu. You would need ~2 hours to set this up.
If you want to try this, I can help. Otherwise, other suggestions you
already got on this list will do.
> Thanks
> Ronny
> _______________________________________________
> Xenomai-help mailing list
> [email protected]
> https://mail.gna.org/listinfo/xenomai-help
--
Philippe.
_______________________________________________
Xenomai-help mailing list
[email protected]
https://mail.gna.org/listinfo/xenomai-help