24 #include <sys/resource.h> 33 #if CONFIG_XENO_VERSION_MAJOR >= 3 34 #include <alchemy/task.h> 35 #include <alchemy/timer.h> 37 #include <native/task.h> 38 #include <native/timer.h> 49 static bool init_rt =
false;
50 static pthread_key_t is_rt_key;
51 static char *RT_TASK_NAME =
"RTXI RT Thread";
53 static const char *sigdebug_reasons[] =
55 [SIGDEBUG_UNDEFINED] =
"latency: received SIGXCPU for unknown reason",
56 [SIGDEBUG_MIGRATE_SIGNAL] =
"received signal",
57 [SIGDEBUG_MIGRATE_SYSCALL] =
"invoked syscall",
58 [SIGDEBUG_MIGRATE_FAULT] =
"triggered fault",
59 [SIGDEBUG_MIGRATE_PRIOINV] =
"affected by priority inversion",
60 [SIGDEBUG_NOMLOCK] =
"Xenomai: process memory not locked " 61 "(missing mlockall?)",
62 [SIGDEBUG_WATCHDOG] =
"Xenomai: watchdog triggered " 63 "(period too short?)",
68 const char fmt[] =
"Mode switch (reason: %s), aborting. Backtrace:\n";
69 unsigned int reason = si->si_value.sival_int;
70 static char buffer[256];
74 if (reason > SIGDEBUG_WATCHDOG)
75 reason = SIGDEBUG_UNDEFINED;
79 case SIGDEBUG_UNDEFINED:
80 n = snprintf(buffer,
sizeof(buffer),
81 "%s\n", sigdebug_reasons[reason]);
82 write(STDERR_FILENO, buffer, n);
84 case SIGDEBUG_MIGRATE_SIGNAL:
85 n = snprintf(buffer,
sizeof(buffer),
86 "%s\n", sigdebug_reasons[reason]);
87 write(STDERR_FILENO, buffer, n);
89 case SIGDEBUG_WATCHDOG:
91 n = snprintf(buffer,
sizeof(buffer),
92 "%s\n", sigdebug_reasons[reason]);
93 write(STDERR_FILENO, buffer, n);
98 n = snprintf(buffer,
sizeof(buffer), fmt, sigdebug_reasons[reason]);
99 n = write(STDERR_FILENO, buffer, n);
100 n = backtrace(bt,
sizeof(bt)/
sizeof(bt[0]));
101 backtrace_symbols_fd(bt, n, STDERR_FILENO);
103 signal(sig, SIG_DFL);
112 struct rlimit rlim = { RLIM_INFINITY, RLIM_INFINITY };
113 setrlimit(RLIMIT_MEMLOCK,&rlim);
115 if (mlockall(MCL_CURRENT | MCL_FUTURE))
117 ERROR_MSG(
"RTOS:Xenomai::initiate : failed to lock memory.\n");
121 pthread_key_create(&is_rt_key,0);
129 pthread_key_delete(is_rt_key);
140 sigemptyset(&sa.sa_mask);
142 sa.sa_flags = SA_SIGINFO;
143 sigaction(SIGDEBUG, &sa, NULL);
146 rt_task_set_mode(0, T_WARNSW, NULL);
149 if ((prio >=0) && (prio <=99))
152 if ((retval = rt_task_create(&t->
task, RT_TASK_NAME, 0, priority, 0)))
154 ERROR_MSG(
"RT::OS::createTask : failed to create task\n");
161 pthread_setspecific(is_rt_key,
reinterpret_cast<const void *
>(t));
163 if ((retval = rt_task_start(&t->
task,
reinterpret_cast<void(*)(
void *)
>(entry),arg)))
165 ERROR_MSG(
"RT::OS::createTask : failed to start task\n");
175 rt_task_delete(&t->
task);
180 if (init_rt && rt_task_self() != NULL)
187 #if CONFIG_XENO_VERSION_MAJOR >= 3 188 return rt_timer_read();
190 return rt_timer_tsc2ns(rt_timer_tsc());
200 if(period/10 > 50000ll)
201 t->
wakeup_t = rt_timer_ns2ticks(50000ll);
203 t->
wakeup_t = rt_timer_ns2ticks(period/10);
206 t->
period = rt_timer_ns2ticks(period);
220 rt_timer_spin(rt_timer_ticks2ns(t->
next_t - rt_timer_read()));
234 ERROR_MSG(
"RT::OS::getCpuUsage : This function should only be run in user space. Aborting.");
240 double cpu_rt_percent;
241 double cpu_user_percent;
242 long rt_time_elapsed;
243 long proc_time_elapsed;
244 long cpu_time_elapsed;
245 RT_TASK_INFO task_info;
249 rt_task_inquire(&(task->
task), &task_info);
252 clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &proc_time);
253 clock_gettime(CLOCK_REALTIME, &clock_time);
258 if (cpu_time_elapsed <= 0)
return 0.0;
259 proc_time_elapsed = 1e9*(proc_time.tv_sec -
last_proc_time.tv_sec) +
261 cpu_user_percent = 100.0*(proc_time_elapsed) / cpu_time_elapsed;
265 cpu_rt_percent = 100.0*rt_time_elapsed / cpu_time_elapsed;
272 return cpu_rt_percent + cpu_user_percent;