リアルタイムxenomai 3.0.5/3.0.9+linux4.9.38/4.9.90簡単な配置とBUG大記録

72095 ワード

linuxシロとしてはカーネルの知識もよくわかりませんが、実験室ではコードのリアルタイム性を高めるために、ピットを踏みながらGOOGLEを降りる必要があります.プラットフォーム:ハードウェア:Intel NUC 8 i 7 BEHソフトウェア:ubuntu 16に基づく.04 LTS(18.04近日テストの準備...)
一、前期操作
インストールの主な参考リンクは以下の通りです:1、(Beta)Xenomai 3.0.5 on Ubuntu 14.04/16.04/2、GitLab_XENOMAI公式サイト3、このお兄さんの记录(一度は公式サイトで成功しなかったことがありますが、これに成功しました...素晴らしいですね)正常にインストールを提示すればいいので、必ず一歩一歩変な报告ミスがないことを确保しなければなりません.configure the linux kernelセクション:
Recommended options:

* General setup
  --> Local version - append to kernel release: -xenomai-3.0.5 #       xenomai    
  --> Timers subsystem
      --> High Resolution Timer Support (Enable)
* Xenomai/cobalt
  --> Sizes and static limits
    --> Number of registry slots (512 --> 4096)
    --> Size of system heap (Kb) (512 --> 4096)
    --> Size of private heap (Kb) (64 --> 256)
    --> Size of shared heap (Kb) (64 --> 256)
    --> Maximum number of POSIX timers per process (128 --> 512)
  --> Drivers
    --> RTnet
        --> RTnet, TCP/IP socket interface (Enable)
            --> Drivers
                --> New intel(R) PRO/1000 PCIe (Enable)
                --> Realtek 8169 (Enable)
                --> Loopback (Enable)
        --> Add-Ons
            --> Real-Time Capturing Support (Enable)
* Power management and ACPI options
  --> CPU Frequency scaling
      --> CPU Frequency scaling (Disable)
  --> ACPI (Advanced Configuration and Power Interface) Support
      --> Processor (Disable)
  --> CPU Idle
      --> CPU idle PM support (Disable)
* Pocessor type and features
  --> Enable maximum number of SMP processors and NUMA nodes (Disable)
  // Ref : http://xenomai.org/pipermail/xenomai/2017-September/037718.html
  --> Processor family   
  **#  “cat /proc/cpuinfo | grep family”       Generic-***   Core 2/newer** **Xeon**
      --> Core 2/newer Xeon (if "cat /proc/cpuinfo | grep family" returns 6, set as Generic otherwise)
  // Xenomai will issue a warning about CONFIG_MIGRATION, disable those in this order
  --> Transparent Hugepage Support (Disable)
  --> Allow for memory compaction (Disable)
  --> Contiguous Memory Allocation (Disable)
  --> Allow for memory compaction
    --> Page Migration (Disable)
* Device Drivers
  --> Staging drivers
      --> Unisys SPAR driver support
         --> Unisys visorbus driver (Disable)

2、パソコンはスラグを比較して、後でコンパイルの過程を構築するのは比較的に時間がかかります.オリーはあげます!3、コンフィギュレーションGRUB and reboot:自己構成後のgrubファイルは以下の通りで、必ず自分のCPUとGPUに基づいてその中の「GRUB_CMDLINE_LINUX_DEFAULT=*」を構成しなければならない.
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
#   info -f grub -n 'Simple configuration'

#GRUB_DEFAULT=0
#GRUB_HIDDEN_TIMEOUT=0
#GRUB_HIDDEN_TIMEOUT_QUIET=true
#GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
#GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
#GRUB_CMDLINE_LINUX="locale=en_US"

GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 4.9.38-xenomai-3.0.9"
#GRUB_DEFAULT=saved
#GRUB_SAVEDEFAULT=true
# Comment the following lines
#GRUB_HIDDEN_TIMEOUT=0
#GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=5
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash i915.enable_rc6=0 i915.enable_dc=0 noapic xenomai.allowed_group=1234"
GRUB_CMDLINE_LINUX=""

4、ドキュメントと一绪に降りて、最后に楽しくテストしてインストールすることができます:みんなが正常に以下のヒントを得ることができることを望みます!
== Sampling period: 100 us
== Test mode: periodic user-mode task
== All results in microseconds
warming up...
RTT|  00:00:01  (periodic user-mode task, 100 us period, priority 99)
RTH|----lat min|----lat avg|----lat max|-overrun|---msw|---lat best|--lat worst
RTD|      0.174|      0.464|      1.780|       0|     0|      0.174|      1.780
RTD|      0.088|      0.464|      1.357|       0|     0|      0.088|      1.780
RTD|      0.336|      0.464|      1.822|       0|     0|      0.088|      1.822
RTD|      0.342|      0.464|      1.360|       0|     0|      0.088|      1.822
RTD|      0.327|      0.462|      2.297|       0|     0|      0.088|      2.297
RTD|      0.347|      0.463|      1.313|       0|     0|      0.088|      2.297
RTD|      0.314|      0.464|      1.465|       0|     0|      0.088|      2.297
RTD|      0.190|      0.464|      1.311|       0|     0|      0.088|      2.297

二、BUG記録(わかる方よろしくお願いします)
1、前期使用xenomai 3.0.5+linux4.9.38バージョンのコンパイルインストール、成功することができますが、后で使う时いつも突然ハングアップして、キーボードのマウスはすべて使うことができません...时には有線の无线のネットさえ正常に接続することができなくて、无线のネットカードに頼って苟着するしかありません...2、ある时xeno latencyのテストのインストールを実行する时、次のように间违いを报告します:
vision@vision:~/xenomai-3.0.5/xenomai-3$ xeno latency
0"000.000| BUG in low_init(): [main] ABI mismatch: required r17, provided r16

公式サイトには似たような記録がありますが、残念ながら私はその時理解していませんでした.多分、私が苦労して苦労したlinuxカーネルのバージョンが低すぎて、衝突がありますか?解決策:それでxenomai 3に変更しました.0.9+linux4.9.90再インストールして、今回は成功しました…謎です…3、OROCOS RTT on Xenomai:RTT ROS Integration 2.9 on Xenomaiを配置している間、以下のコマンドを実行している間に、以前にインストールしたROSをアンインストールします…本当に穴があいて、結局貧しい山間部の子供がROSを一度インストールするのは容易ではありません!慎重に!
rosdep install --from-paths ~/isir/rtt_ros-2.9_ws/src --ignore-src --rosdistro kinetic -y -r

4、端末terminalが开かない公式サイトによるROS Kinetic++の配置を试み、以下の命令を実行して再开すると、赤い端末が突然なくなってしまう...慎重に兄弟たち!
sudo locale-gen en_US #warnings might occur
sudo locale-gen en_US.UTF-8
sudo nano /etc/environment
# put theses lines
LANGUAGE=en_US
LC_ALL=en_US
# Reboot !

解决方法:/etc/environmentファイルの中で何が何なのか、分からないなら简単に物を入れないで(大物を除く...)、自分が加入した2行の言语の配置を除けばいいです~5、リアルタイム性の要求の高いコードをxenomaiのリアルタイムのプロセスの时によくあるヘッダファイルを検索できないことに出会って、普通は経路の问题で、正确なincludeが入ってこないで、***/usr/xenomai/include/**までたくさん見てもいいですが、xenomaiのものは基本的にここにあります.エラーエラーerror:invalid use of incomplete type「const struct timespec」に遭遇すると、私はその構造体定義を含むヘッダファイルincludeを入力するために必要とした.cppファイル内で~6、socket:address family not supported by protocolという問題を解決できるのは、リアルタイムプロセスと通常プロセス間の通信をテストする際に出会ったもので、参考の公式サイトでは、パス/usr/xenomai/demoの下の実行可能ファイルxddp-label、淦を直接見つけます!エラーメッセージは次のとおりです.
vision@vision:/usr/xenomai/demo$ sudo ./xddp-label 
socket:address family not supported by protocol

解決策:公式サイトのカーネル構成セクションに戻り、次のカーネルオプションの構成を再実行します.
vision@vision:$ cd linux-4.9.38
vision@vision:/linux-4.9.38$ make menuconfig
----------------------------------------------------------------------------
#         
* Xenomai/cobalt (NEW) --->
	Drivers --->
		Real-time IPC drivers  --->
			<*> RTIPC protocol family   
				[*]   XDDP cross-domain datagram protocol (NEW) 
				[*]   IDDP intra-domain datagram protocol (NEW) 
				(32)    Number of IDDP communication ports (NEW)
				[*]   Buffer protocol (NEW)
				(32)    Number of BUFP communication ports (NEW) 
-----------------------------------------------------------------------------
# save the new configuration
vision@vision:/linux-4.9.38$ sudo make -j12 && sudo make -j12 modules && sudo make -j12 modules_install && sudo make -j12 install

その後、システムを再起動すると、起動時のカーネル切替インタフェースに2つのxenomaiカーネルが表示されます:linux-4.90-xenomai-3.0.99(修正後)とlinux-4.9.90-xenomai-3.0.99.old(元の)は、新しく生成されたカーネル(linux-4.9.90-xenomai-3.0.99)を選択してシステムに入ります.実行すると、次のインタフェースが表示され、リアルタイムプロセスと通常プロセスの間の通信が成功しました.
vision@vision:/usr/xenomai/demo$ sudo ./xddp-label 
realtime_thread2: NRT peer is reading from /dev/rtp0
realtime_thread2: sent 22 bytes, "Surfing With The Alien"
realtime_thread1: "Surfing With The Alien" relayed by peer
realtime_thread2: sent 14 bytes, "Lords of Karma"
realtime_thread1: "Lords of Karma" relayed by peer
realtime_thread2: sent 12 bytes, "Banana Mango"
realtime_thread1: "Banana Mango" relayed by peer
realtime_thread2: sent 13 bytes, "Psycho Monkey"
realtime_thread1: "Psycho Monkey" relayed by peer
realtime_thread2: sent 21 bytes, "Luminous Flesh Giants"
realtime_thread1: "Luminous Flesh Giants" relayed by peer
realtime_thread2: sent 15 bytes, "Moroccan Sunset"
realtime_thread1: "Moroccan Sunset" relayed by peer
realtime_thread2: sent 12 bytes, "Satch Boogie"
realtime_thread1: "Satch Boogie" relayed by peer
realtime_thread2: sent 22 bytes, "Flying In A Blue Dream"
realtime_thread1: "Flying In A Blue Dream" relayed by peer
realtime_thread2: sent 4 bytes, "Ride"
realtime_thread1: "Ride" relayed by peer
realtime_thread2: sent 11 bytes, "Summer Song"
realtime_thread1: "Summer Song" relayed by peer

ただしsudoを1回終了します./xddp-labelコマンドは、再実行時に次の問題が発生します.解決策を添付します.
vision@vision:/usr/xenomai/demo$ sudo ./xddp-label 
[sudo] password for vision: 
bind: File exists
--------------------------------------------------------
#     :
vision@vision:/usr/xenomai/bin$ ps -A | grep xddp
 2858 ?        00:00:00 xddp-label
vision@vision:/usr/xenomai/bin$ sudo kill -9 2858
---------------------------------------------------------
#           
vision@vision:/usr/xenomai/demo$ sudo ./xddp-label 
realtime_thread2: NRT peer is reading from /dev/rtp0
realtime_thread2: sent 22 bytes, "Surfing With The Alien"
realtime_thread1: "Surfing With The Alien" relayed by peer

7、error while loading shared libraries: libcobalt.so.2: cannot open shared object file: No such file or directory. この問題は以下のシナリオに現れる:自分でcmakelistsを書くことを試みる.txtとxddp.cppソースファイルは、cmake方式でコンパイルされ、xenomaiリアルタイムプロセスとLinux通常プロセス間の通信状況をテストします.最終的な発見はcmakelistsでtxtファイルにlibcobaltが欠けている.so.2ダイナミックライブラリファイルの導入による、変更後のコード:(1)xddp.cpp:
/*
 * Copyright (C) 2009 Philippe Gerum .
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.
 *
 *
 * XDDP-based RT/NRT threads communication demo.
 *
 * Real-time Xenomai threads and regular Linux threads may want to
 * exchange data in a way that does not require the former to leave
 * the real-time domain (i.e. secondary mode). Message pipes - as
 * implemented by the RTDM-based XDDP protocol - are provided for this
 * purpose.
 *
 * On the Linux domain side, pseudo-device files named /dev/rtp
 * give regular POSIX threads access to non real-time communication
 * endpoints, via the standard character-based I/O interface. On the
 * Xenomai domain side, sockets may be bound to XDDP ports, which act
 * as proxies to send and receive data to/from the associated
 * pseudo-device files. Ports and pseudo-device minor numbers are
 * paired, meaning that e.g. port 7 will proxy the traffic for
 * /dev/rtp7. Therefore, port numbers may range from 0 to
 * CONFIG_XENO_OPT_PIPE_NRDEV - 1.
 *
 * All data sent through a bound/connected XDDP socket via sendto(2) or
 * write(2) will be passed to the peer endpoint in the Linux domain,
 * and made available for reading via the standard read(2) system
 * call. Conversely, all data sent using write(2) through the non
 * real-time endpoint will be conveyed to the real-time socket
 * endpoint, and made available to the recvfrom(2) or read(2) system
 * calls.
 *
 * ASCII labels can be attached to bound ports, in order to connect
 * sockets to them in a more descriptive way than using plain numeric
 * port values.
 *
 * The example code below illustrates the following process:
 *
 * realtime_thread1----------------------------->----------+
 *   =>  get socket                                        |
 *   =>  bind socket to port "xddp-demo                    |
 *   =>  read traffic from NRT domain via recvfrom()      get socket                                        |  |
 *   =>  connect socket to port "xddp-demo"                |  |
 *   =>  write traffic to NRT domain via sendto()          v  |
 *                                                         |  ^
 * regular_thread------------------------------------------+  |
 *   =>  open /proc/xenomai/registry/rtipc/xddp/xddp-demo  |  |
 *   =>  read traffic from RT domain via read()            |  |
 *   =>  mirror traffic to RT domain via write()           +--+
 */
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
pthread_t rt1, rt2, nrt;
#define XDDP_PORT_LABEL  "xddp-demo"
static const char *msg[] = {
        "Surfing With The Alien",
        "Lords of Karma",
        "Banana Mango",
        "Psycho Monkey",
        "Luminous Flesh Giants",
        "Moroccan Sunset",
        "Satch Boogie",
        "Flying In A Blue Dream",
        "Ride",
        "Summer Song",
        "Speed Of Light",
        "Crystal Planet",
        "Raspberry Jam Delta-V",
        "Champagne?",
        "Clouds Race Across The Sky",
        "Engines Of Creation"
};
static void fail(const char *reason)
{
        perror(reason);
        exit(EXIT_FAILURE);
}
static void *realtime_thread1(void *arg)
{
        struct rtipc_port_label plabel;
        struct sockaddr_ipc saddr;
        char buf[128];
        int ret, s;
        /*
         * Get a datagram socket to bind to the RT endpoint. Each
         * endpoint is represented by a port number within the XDDP
         * protocol namespace.
         */
        s = socket(AF_RTIPC, SOCK_DGRAM, IPCPROTO_XDDP);
        if (s < 0) {
                perror("socket");
                exit(EXIT_FAILURE);
        }
        /*
         * Set a port label. This name will be registered when
         * binding, in addition to the port number (if given).
         */
        strcpy(plabel.label, XDDP_PORT_LABEL);
        ret = setsockopt(s, SOL_XDDP, XDDP_LABEL,
                         &plabel, sizeof(plabel));
        if (ret)
                fail("setsockopt");
        /*
         * Bind the socket to the port, to setup a proxy to channel
         * traffic to/from the Linux domain. Assign that port a label,
         * so that peers may use a descriptive information to locate
         * it. For instance, the pseudo-device matching our RT
         * endpoint will appear as
         * /proc/xenomai/registry/rtipc/xddp/ in the
         * Linux domain, once the socket is bound.
         *
         * saddr.sipc_port specifies the port number to use. If -1 is
         * passed, the XDDP driver will auto-select an idle port.
         */
        memset(&saddr, 0, sizeof(saddr));
        saddr.sipc_family = AF_RTIPC;
        saddr.sipc_port = -1;
        ret = bind(s, (struct sockaddr *)&saddr, sizeof(saddr));
        if (ret)
                fail("bind");
        for (;;) {
                /* Get packets relayed by the regular thread */
                ret = recvfrom(s, buf, sizeof(buf), 0, NULL, 0);
                if (ret <= 0)
                        fail("recvfrom");
                printf("%s: \"%.*s\" relayed by peer
"
, __FUNCTION__, ret, buf); } return NULL; } static void *realtime_thread2(void *arg) { struct rtipc_port_label plabel; struct sockaddr_ipc saddr; int ret, s, n = 0, len; struct timespec ts; struct timeval tv; socklen_t addrlen; s = socket(AF_RTIPC, SOCK_DGRAM, IPCPROTO_XDDP); if (s < 0) { perror("socket"); exit(EXIT_FAILURE); } /* * Set the socket timeout; it will apply when attempting to * connect to a labeled port, and to recvfrom() calls. The * following setup tells the XDDP driver to wait for at most * one second until a socket is bound to a port using the same * label, or return with a timeout error. */ tv.tv_sec = 1; tv.tv_usec = 0; ret = setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); if (ret) fail("setsockopt"); /* * Set a port label. This name will be used to find the peer * when connecting, instead of the port number. */ strcpy(plabel.label, XDDP_PORT_LABEL); ret = setsockopt(s, SOL_XDDP, XDDP_LABEL, &plabel, sizeof(plabel)); if (ret) fail("setsockopt"); memset(&saddr, 0, sizeof(saddr)); saddr.sipc_family = AF_RTIPC; saddr.sipc_port = -1; /* Tell XDDP to search by label. */ ret = connect(s, (struct sockaddr *)&saddr, sizeof(saddr)); if (ret) fail("connect"); /* * We succeeded in making the port our default destination * address by using its label, but we don't know its actual * port number yet. Use getpeername() to retrieve it. */ addrlen = sizeof(saddr); ret = getpeername(s, (struct sockaddr *)&saddr, &addrlen); if (ret || addrlen != sizeof(saddr)) fail("getpeername"); printf("%s: NRT peer is reading from /dev/rtp%d
"
, __FUNCTION__, saddr.sipc_port); for (;;) { len = strlen(msg[n]); /* * Send a datagram to the NRT endpoint via the proxy. * We may pass a NULL destination address, since the * socket was successfully assigned the proper default * address via connect(2). */ ret = sendto(s, msg[n], len, 0, NULL, 0); if (ret != len) fail("sendto"); printf("%s: sent %d bytes, \"%.*s\"
"
, __FUNCTION__, ret, ret, msg[n]); n = (n + 1) % (sizeof(msg) / sizeof(msg[0])); /* * We run in full real-time mode (i.e. primary mode), * so we have to let the system breathe between two * iterations. */ ts.tv_sec = 0; ts.tv_nsec = 500000000; /* 500 ms */ clock_nanosleep(CLOCK_REALTIME, 0, &ts, NULL); } return NULL; } static void *regular_thread(void *arg) { char buf[128], *devname; int fd, ret; if (asprintf(&devname, "/proc/xenomai/registry/rtipc/xddp/%s", XDDP_PORT_LABEL) < 0) fail("asprintf"); fd = open(devname, O_RDWR); free(devname); if (fd < 0) fail("open"); for (;;) { /* Get the next message from realtime_thread2. */ ret = read(fd, buf, sizeof(buf)); if (ret <= 0) fail("read"); /* Relay the message to realtime_thread1. */ ret = write(fd, buf, ret); if (ret <= 0) fail("write"); } return NULL; } int main(int argc, char **argv) { struct sched_param rtparam = { .sched_priority = 42 }; pthread_attr_t rtattr, regattr; sigset_t set; int sig; sigemptyset(&set); sigaddset(&set, SIGINT); sigaddset(&set, SIGTERM); sigaddset(&set, SIGHUP); pthread_sigmask(SIG_BLOCK, &set, NULL); pthread_attr_init(&rtattr); pthread_attr_setdetachstate(&rtattr, PTHREAD_CREATE_JOINABLE); pthread_attr_setinheritsched(&rtattr, PTHREAD_EXPLICIT_SCHED); pthread_attr_setschedpolicy(&rtattr, SCHED_FIFO); pthread_attr_setschedparam(&rtattr, &rtparam); /* Both real-time threads have the same attribute set. */ errno = pthread_create(&rt1, &rtattr, &realtime_thread1, NULL); if (errno) fail("pthread_create"); errno = pthread_create(&rt2, &rtattr, &realtime_thread2, NULL); if (errno) fail("pthread_create"); pthread_attr_init(&regattr); pthread_attr_setdetachstate(&regattr, PTHREAD_CREATE_JOINABLE); pthread_attr_setinheritsched(&regattr, PTHREAD_EXPLICIT_SCHED); pthread_attr_setschedpolicy(&regattr, SCHED_OTHER); errno = pthread_create(&nrt, &regattr, &regular_thread, NULL); if (errno) fail("pthread_create"); sigwait(&set, &sig); pthread_cancel(rt1); pthread_cancel(rt2); pthread_cancel(nrt); pthread_join(rt1, NULL); pthread_join(rt2, NULL); pthread_join(nrt, NULL); return 0; }

(2)CMakeLists.txt:
cmake_minimum_required(VERSION 3.7.2)
project(xddp)
#file(GLOB SOURCES "/usr/xenomai/include/alchemy/*.*")
# set(CMAKE_CXX_STANDARD 11)

#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
add_compile_options(-std=c++11)

include_directories(/usr/xenomai/include/alchemy/)
include_directories(/usr/xenomai/include/)

include_directories(/usr/xenomai/include/rtdm)

include_directories(/usr/xenomai/cobalt/)
include_directories(/usr/xenomai/posix/)
include_directories(/usr/xenomai/boilerplate/)

link_directories(/usr/xenomai/lib)



set(xeno_cflags_params "--skin=posix" "--cflags")
execute_process(
    COMMAND xeno-config ${xeno_cflags_params}
    OUTPUT_VARIABLE xeno_cflags
    OUTPUT_STRIP_TRAILING_WHITESPACE)

set(xeno_ldflags_params "--skin=posix" "--ldflags")
execute_process(
    COMMAND xeno-config ${xeno_ldflags_params}
    OUTPUT_VARIABLE xeno_ldflags
    OUTPUT_STRIP_TRAILING_WHITESPACE)

# Compiler and linker options
set(CMAKE_C_FLAGS          "${CMAKE_CXX_FLAGS} ${xeno_cflags}")
set(CMAKE_CXX_FLAGS        "${CMAKE_CXX_FLAGS} ${xeno_cflags}")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${xeno_ldflags}")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${xeno_ldflags}")


add_executable(xddp xddp.cpp )
target_link_libraries(xddp ${XENO_NATIVE_LDFLAGS} /usr/xenomai/bin)

#target_link_libraries(xddp ${LIB_DIR}/libalchemy.so  ${LIB_DIR}/libanalogy.so 
 #                      ${LIB_DIR}/libcobalt.so ${LIB_DIR}/libmodechk.so ${LIB_DIR}/libcopperplate.so 
 #                      ${LIB_DIR}/libnative.so ${LIB_DIR}/libpsos.so ${LIB_DIR}/libpthread_rt.so 
 #                            ${LIB_DIR}/librtdm.so   ${LIB_DIR}/libsmokey.so ${LIB_DIR}/libtrank.so 
 #                            ${LIB_DIR}/libuitron.so ${LIB_DIR}/libvrtx.so ${LIB_DIR}/libvxworks.so ${LIB_DIR}/libxenomai.so) 
#