* [Xenomai-help] Rép. : Re: Rép. : Re: T_RRB
@ 2008-02-13 13:56 Hubert Talbot
2008-02-13 14:31 ` Philippe Gerum
0 siblings, 1 reply; 2+ messages in thread
From: Hubert Talbot @ 2008-02-13 13:56 UTC (permalink / raw)
To: rpm; +Cc: xenomai
Thanks for explanations. It's clearer now.
But...
In the following code (almost the same), there is one task that dies prematurely.
//******************************************************************************
#include <stdio.h>
#include <sys/mman.h>
#include <native/task.h>
#include <native/timer.h>
#include <native/sem.h>
#define NBTASK 1
#define NSEC 1
#define USEC 1000
#define MSEC 1000000
#define SEC 1000000000LL
#define PERIOD (10 * MSEC)
RT_TASK tasks[NBTASK];
RT_SEM sem;
unsigned long counts[NBTASK];
static inline unsigned tick_delta(RTIME t0, RTIME t1)
{
// return ((unsigned)(t1 - t0) * PERIOD) / SEC;
return rt_timer_ticks2ns(t1 - t0) / SEC;
}
void my_sleep(int nSec, int taskID)
{
RTIME start_ticks, wait_ticks;
// wait_ticks = (nSec * SEC) / PERIOD;
wait_ticks = nSec * rt_timer_ns2ticks(SEC);
start_ticks = rt_timer_read();
while (rt_timer_read() - start_ticks <= wait_ticks)
{
counts[taskID]++;
}
}
void task(void *arg)
{
int taskID = (int)(long)arg;
RTIME start_date, end_date;
RTIME start_ticks, wait_ticks;
rt_task_slice(NULL, rt_timer_ns2ticks(PERIOD));
rt_task_set_mode(0, T_RRB, 0);
printf("task %d start...\n", taskID);
rt_sem_p(&sem, TM_INFINITE);
start_date = rt_timer_read();
my_sleep(5, taskID);
end_date = rt_timer_read();
printf("task %d end (%u sec) --> %u\n", taskID, tick_delta(start_date, end_date), counts[taskID]);
}
int main(void)
{
int rc;
int i;
RTIME tv1, tv2;
mlockall(MCL_CURRENT | MCL_FUTURE);
memset(counts, 0, NBTASK * sizeof(unsigned long));
rc = rt_timer_set_mode(1 * MSEC);
if (rc != 0)
{
printf("failed to rt_timer_set_mode: %d\n", rc);
return rc;
}
rt_sem_create(&sem, "sem", 0, S_FIFO);
for (i = 0; i < NBTASK; i++)
{
char szTaskID[20];
sprintf(szTaskID, "Task%02d", i);
rt_task_create(&tasks[i],
szTaskID,
4096,
99,
T_JOINABLE);
}
tv1 = rt_timer_read();
for (i = 0; i < NBTASK; i++)
{
RT_TASK_INFO info;
rt_task_start(&tasks[i], &task, (void *)(long)i);
}
rt_sem_broadcast(&sem);
for (i = 0; i < NBTASK; i++)
{
rt_task_join(&tasks[i]);
printf("task %d count = %u\n", i, counts[i]);
}
tv2 = rt_timer_read();
printf("****** total time: %u (sec)\n\n", tick_delta(tv1, tv2));
rt_sem_delete(&sem);
/*
tv1 = rt_timer_read();
my_sleep(10, 9);
tv2 = rt_timer_read();
printf("****** total time: %u (sec)\n\n", tick_delta(tv1, tv2));
*/
return 0;
}
//******************************************************************************
With...
#define NBTASK 5
------------------------
output is (task 2 died prematurely):
task 0 start...
task 1 start...
task 2 start...
task 3 start...
task 4 start...
task 0 end (5 sec) --> 4452399
task 1 end (5 sec) --> 4456435
task 3 end (5 sec) --> 4497016
task 4 end (5 sec) --> 4513423
task 0 count = 4452399
task 1 count = 4456435
task 2 count = 2687455
task 3 count = 4497016
task 4 count = 4513423
****** total time: 5 (sec)
#define NBTASK 3
------------------------
output is (task 2 died prematurely):
task 0 start...
task 1 start...
task 2 start...
task 0 end (5 sec) --> 8130524
task 1 end (5 sec) --> 8140688
task 0 count = 8130524
task 1 count = 8140688
task 2 count = 4211880
****** total time: 5 (sec)
#define NBTASK 1
------------------------
output is (task 0 died prematurely):
task 0 start...
task 0 count = 14200778
****** total time: 3 (sec)
I think it's abnormal. Isn't it?
Thanks
Hubert
^ permalink raw reply [flat|nested] 2+ messages in thread* Re: [Xenomai-help] Rép. : Re: Rép. : Re: T_RRB
2008-02-13 13:56 [Xenomai-help] Rép. : Re: Rép. : Re: T_RRB Hubert Talbot
@ 2008-02-13 14:31 ` Philippe Gerum
0 siblings, 0 replies; 2+ messages in thread
From: Philippe Gerum @ 2008-02-13 14:31 UTC (permalink / raw)
To: Hubert Talbot; +Cc: xenomai
Hubert Talbot wrote:
> Thanks for explanations. It's clearer now.
>
> But...
>
> In the following code (almost the same), there is one task that dies prematurely.
>
Use GDB to know why.
>
> //******************************************************************************
> #include <stdio.h>
>
> #include <sys/mman.h>
>
> #include <native/task.h>
>
> #include <native/timer.h>
>
> #include <native/sem.h>
>
>
> #define NBTASK 1
>
> #define NSEC 1
>
> #define USEC 1000
>
> #define MSEC 1000000
>
> #define SEC 1000000000LL
>
> #define PERIOD (10 * MSEC)
>
> RT_TASK tasks[NBTASK];
>
> RT_SEM sem;
>
> unsigned long counts[NBTASK];
>
>
>
> static inline unsigned tick_delta(RTIME t0, RTIME t1)
>
> {
> // return ((unsigned)(t1 - t0) * PERIOD) / SEC;
>
> return rt_timer_ticks2ns(t1 - t0) / SEC;
>
> }
>
>
>
> void my_sleep(int nSec, int taskID)
>
> {
>
> RTIME start_ticks, wait_ticks;
>
>
> // wait_ticks = (nSec * SEC) / PERIOD;
>
> wait_ticks = nSec * rt_timer_ns2ticks(SEC);
>
> start_ticks = rt_timer_read();
>
> while (rt_timer_read() - start_ticks <= wait_ticks)
> {
> counts[taskID]++;
> }
>
> }
>
>
>
> void task(void *arg)
>
> {
>
> int taskID = (int)(long)arg;
>
> RTIME start_date, end_date;
>
> RTIME start_ticks, wait_ticks;
>
>
>
> rt_task_slice(NULL, rt_timer_ns2ticks(PERIOD));
>
> rt_task_set_mode(0, T_RRB, 0);
>
> printf("task %d start...\n", taskID);
>
> rt_sem_p(&sem, TM_INFINITE);
>
>
>
> start_date = rt_timer_read();
> my_sleep(5, taskID);
> end_date = rt_timer_read();
>
>
>
> printf("task %d end (%u sec) --> %u\n", taskID, tick_delta(start_date, end_date), counts[taskID]);
>
> }
>
>
>
> int main(void)
>
> {
>
> int rc;
>
> int i;
>
> RTIME tv1, tv2;
>
>
> mlockall(MCL_CURRENT | MCL_FUTURE);
>
> memset(counts, 0, NBTASK * sizeof(unsigned long));
>
>
> rc = rt_timer_set_mode(1 * MSEC);
>
> if (rc != 0)
>
> {
>
> printf("failed to rt_timer_set_mode: %d\n", rc);
>
> return rc;
>
> }
>
> rt_sem_create(&sem, "sem", 0, S_FIFO);
>
>
>
> for (i = 0; i < NBTASK; i++)
>
> {
>
> char szTaskID[20];
>
> sprintf(szTaskID, "Task%02d", i);
>
> rt_task_create(&tasks[i],
>
> szTaskID,
>
> 4096,
>
> 99,
>
> T_JOINABLE);
>
> }
>
>
>
> tv1 = rt_timer_read();
>
>
> for (i = 0; i < NBTASK; i++)
>
> {
>
> RT_TASK_INFO info;
>
>
>
> rt_task_start(&tasks[i], &task, (void *)(long)i);
>
> }
>
>
> rt_sem_broadcast(&sem);
>
>
>
> for (i = 0; i < NBTASK; i++)
>
> {
>
> rt_task_join(&tasks[i]);
>
> printf("task %d count = %u\n", i, counts[i]);
>
> }
>
> tv2 = rt_timer_read();
>
> printf("****** total time: %u (sec)\n\n", tick_delta(tv1, tv2));
>
>
> rt_sem_delete(&sem);
>
> /*
> tv1 = rt_timer_read();
>
>
> my_sleep(10, 9);
>
> tv2 = rt_timer_read();
>
> printf("****** total time: %u (sec)\n\n", tick_delta(tv1, tv2));
>
> */
>
> return 0;
>
> }
>
> //******************************************************************************
>
>
> With...
>
> #define NBTASK 5
> ------------------------
>
>
> output is (task 2 died prematurely):
>
> task 0 start...
> task 1 start...
> task 2 start...
> task 3 start...
> task 4 start...
> task 0 end (5 sec) --> 4452399
> task 1 end (5 sec) --> 4456435
> task 3 end (5 sec) --> 4497016
> task 4 end (5 sec) --> 4513423
> task 0 count = 4452399
> task 1 count = 4456435
> task 2 count = 2687455
> task 3 count = 4497016
> task 4 count = 4513423
> ****** total time: 5 (sec)
>
> #define NBTASK 3
> ------------------------
>
>
> output is (task 2 died prematurely):
>
> task 0 start...
> task 1 start...
> task 2 start...
> task 0 end (5 sec) --> 8130524
> task 1 end (5 sec) --> 8140688
> task 0 count = 8130524
> task 1 count = 8140688
> task 2 count = 4211880
> ****** total time: 5 (sec)
>
> #define NBTASK 1
> ------------------------
>
>
> output is (task 0 died prematurely):
>
> task 0 start...
> task 0 count = 14200778
> ****** total time: 3 (sec)
>
>
> I think it's abnormal. Isn't it?
>
>
> Thanks
>
> Hubert
>
>
>
> _______________________________________________
> Xenomai-help mailing list
> Xenomai-help@domain.hid
> https://mail.gna.org/listinfo/xenomai-help
>
--
Philippe.
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2008-02-13 14:31 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-02-13 13:56 [Xenomai-help] Rép. : Re: Rép. : Re: T_RRB Hubert Talbot
2008-02-13 14:31 ` Philippe Gerum
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.