|
From: <ehb...@us...> - 2008-05-18 23:07:44
|
Revision: 461
http://personalrobots.svn.sourceforge.net/personalrobots/?rev=461&view=rev
Author: ehberger
Date: 2008-05-18 16:07:42 -0700 (Sun, 18 May 2008)
Log Message:
-----------
xenomai linker/compile flags and xenomai test node
Added Paths:
-----------
pkg/trunk/realtime/
pkg/trunk/realtime/xenomai/
pkg/trunk/realtime/xenomai/manifest.xml
pkg/trunk/realtime/xenomai_demo/
pkg/trunk/realtime/xenomai_demo/Makefile
pkg/trunk/realtime/xenomai_demo/README
pkg/trunk/realtime/xenomai_demo/manifest.xml
pkg/trunk/realtime/xenomai_demo/xenomai_demo.cpp
Added: pkg/trunk/realtime/xenomai/manifest.xml
===================================================================
--- pkg/trunk/realtime/xenomai/manifest.xml (rev 0)
+++ pkg/trunk/realtime/xenomai/manifest.xml 2008-05-18 23:07:42 UTC (rev 461)
@@ -0,0 +1,15 @@
+<package>
+ <description brief="Xenomai dependencies and build flags"> This package ensures that Xenomai is
+properly installed on the system and provides the build flags to create realtime ROS nodes that
+depend on Xenomai. </description>
+ <author>Eric Berger be...@wi...></author>
+ <license>BSD</license>
+ <export>
+ <cpp
+ cflags="-I/usr/xenomai/include -I/usr/xenomai/src/include -D_GNU_SOURCE -D_REENTRANT -D__XENO__"
+ lflags="-L/usr/xenomai/lib -lnative -lrtdk -Xlinker -rpath -Xlinker /usr/xenomai/lib"/>
+ <!--cpp
+ cflags="-I${prefix}/xenomai/include -I{$prefix}/xenomai/src/include -D_GNU_SOURCE -D_REENTRANT -D__XENO__"
+ lflags="-L${prefix}/xenomai/lib -lnative -lrtdk -Xlinker -rpath -Xlinker {$prefix}/xenomai/lib"/-->
+ </export>
+</package>
Added: pkg/trunk/realtime/xenomai_demo/Makefile
===================================================================
--- pkg/trunk/realtime/xenomai_demo/Makefile (rev 0)
+++ pkg/trunk/realtime/xenomai_demo/Makefile 2008-05-18 23:07:42 UTC (rev 461)
@@ -0,0 +1,4 @@
+SRC = xenomai_demo.cpp
+OUT = xenomai_demo
+PKG = xenomai_demo
+include $(shell rospack find mk)/node.mk
Added: pkg/trunk/realtime/xenomai_demo/README
===================================================================
--- pkg/trunk/realtime/xenomai_demo/README (rev 0)
+++ pkg/trunk/realtime/xenomai_demo/README 2008-05-18 23:07:42 UTC (rev 461)
@@ -0,0 +1,4 @@
+This is a test of the realtime execution system.
+Xenomai must be properly installed for this code to compile and run.
+All this code does is instantiate a realtime loop and print statistics about the actual execution time. All printed values are in
+ms.
Added: pkg/trunk/realtime/xenomai_demo/manifest.xml
===================================================================
--- pkg/trunk/realtime/xenomai_demo/manifest.xml (rev 0)
+++ pkg/trunk/realtime/xenomai_demo/manifest.xml 2008-05-18 23:07:42 UTC (rev 461)
@@ -0,0 +1,9 @@
+<package>
+ <description brief = "Package to test Xenomai">
+ Xenomai test program. Designed to test that Xenomai build system and runtime system are both configured correctly and quantify
+timing jitter.
+ </description>
+ <depend package="roscpp"/>
+ <depend package="std_msgs"/>
+ <depend package="xenomai"/>
+</package>
Added: pkg/trunk/realtime/xenomai_demo/xenomai_demo.cpp
===================================================================
--- pkg/trunk/realtime/xenomai_demo/xenomai_demo.cpp (rev 0)
+++ pkg/trunk/realtime/xenomai_demo/xenomai_demo.cpp 2008-05-18 23:07:42 UTC (rev 461)
@@ -0,0 +1,117 @@
+#include <stdio.h>
+#include <signal.h>
+#include <unistd.h>
+#include <sys/mman.h>
+
+#include <native/task.h>
+#include <native/timer.h>
+
+RT_TASK demo_task;
+
+#include "ros/node.h"
+#include "std_msgs/MsgString.h"
+
+/* NOTE: error handling omitted. */
+
+float period = 1; //period in milliseconds
+
+float elapsed = 0.0;
+long elapsed_ticks = 0;
+double max_elapsed = 0.0;
+double min_elapsed = period * 2;
+double total_elapsed = 0.0;
+long int num_overruns = 0;
+long int num_ticks = 0;
+
+void demo(void *arg)
+{
+ RTIME now, previous;
+
+ /*
+ * Arguments: &task (NULL=self),
+ * start time,
+ * period)
+ */
+ rt_task_set_periodic(NULL, TM_NOW, period * 1000000);
+ previous = rt_timer_read();
+
+ while (1) {
+ rt_task_wait_period(NULL);
+ now = rt_timer_read();
+ elapsed_ticks = (long)(now - previous);
+ previous = now;
+
+ elapsed = elapsed_ticks / 1000000.0;
+ if(elapsed > max_elapsed)
+ max_elapsed = elapsed;
+ if(elapsed < min_elapsed)
+ min_elapsed = elapsed;
+ if(elapsed_ticks > 1.1 * period * 1000000)
+ num_overruns++;
+ num_ticks++;
+ total_elapsed += elapsed;
+ }
+}
+
+void cleanup(int sig)
+{
+ printf("Goodbye.\n");
+ rt_task_delete(&demo_task);
+ //exit(0);
+}
+
+class XenomaiTest : public ros::node
+{
+public:
+ MsgString msg;
+
+ XenomaiTest() : ros::node("XenomaiTest")
+ {
+ advertise<MsgString>("status");
+ }
+
+ void update(char *s)
+ {
+ msg.data = string(s);
+ publish("status", msg);
+ }
+};
+
+int main(int argc, char* argv[])
+{
+ char msg[1024];
+ //signal(SIGTERM, cleanup);
+ //signal(SIGINT, cleanup);
+
+ /* Avoids memory swapping for this program */
+ mlockall(MCL_CURRENT|MCL_FUTURE);
+
+ rt_timer_set_mode(TM_ONESHOT);
+ //rt_timer_set_mode(900000);
+
+ /*
+ * Arguments: &task,
+ * name,
+ * stack size (0=default),
+ * priority,
+ * mode (FPU, start suspended, ...)
+ */
+ rt_task_create(&demo_task, "trivial", 0, 99, XNFPU);
+
+ /*
+ * Arguments: &task,
+ * task function,
+ * function argument
+ */
+ rt_task_start(&demo_task, &demo, NULL);
+
+ ros::init(argc, argv);
+ XenomaiTest x;
+ while(x.ok()){
+ usleep(100000);
+ snprintf(msg, sizeof(msg), "(milliseconds) min offset: %f \t max offset: %f \t average offset:%f \t overruns: %ld/%ld\n", min_elapsed - period, max_elapsed - period, total_elapsed / num_ticks - period, num_overruns, num_ticks);
+ printf(msg);
+ x.update(msg);
+ }
+ cleanup(0);
+}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|