参考网址:
http://www.xenomai.org/index.php/RTnet:Installation_%26_Testing
☆ 首先下载rtnet压缩包,本次试用的版本为rtnet-0.9.13;
☆ 解压压缩包,sudo tar jxvf rtnet-0.9.13.tar.bz2;
☆ 进入解压后文件夹进行配置,cd rtnet-0.9.13\sudo make menuconfig;
设置以下选项:
1. Variant->Xenomai 2.1 or better
2. Add-ons->Real-time Capturing Support->ON
3. Examples->RTnet Application Examples->ON
保存并退出,发现错误:Xenomai configuration tool not found:
经查找,原因是没有发现Xenomai的配置文件,解决方法:
添加文件路径/usr/xenomai/bin/xeno-config到
Examples->Real-time Extension Config-Tool Path,保存并退出。
☆ 编译:sudo make;
☆ 安装:sudo make install;
如果在配置过程中没有更改,RTnet的安装文件夹将会被放置在/usr/local/rtnet;
☆ 创建配置设备接口节点:sudo mknod /dev/rtnet/ c 10 240;
利用单一节点测试(本地环绕)
测试步骤如下:
■ 从普通非实时的以太网口断开RTnet节点的网络电缆
■ 重启系统,进入打过补丁的内核模式
■ 输入命令显示网络设置 ifconfig
将展示给你eth0正在运行(它是你的网卡),lo正在运行(它是本地环绕)。
■ 你要禁用网卡的非实时操作,输入命令完成:
ifconfig eth0 down
■ 移除网卡的设备驱动或是模块
输入命令lspci | grep -I net 查看网卡信息,然后lsmod查看网卡对应的模块;本机的网卡模块为r8169,卸载时输入命令sudo rmmod r8169 (本机加载时,sudo insmod /lib/modules/2.6.37.6-xenomai/kernel/drivers/net/r8169.ko)。
■ 加载RTnet操作需要的实时linux扩展的模块,如果在Xenomai中已经编译了RTDM support,不需要做什么,否则:modprobe xeno_rtdm
TODO:简化下列步骤。
■ 然后你需要编辑目录/usr/local/rtnet/etc下的文件rtnet.conf,来正确的设定以运行Rtnet.编辑以下参数:
1. 设置host up为主机或是从机,根据你怎样使用;
2. RT_DRIVER应该与你移除的模块是实时等效的(本机选用对应的rt_r8169);
3. RT_DRIVER_OPINIONS应该只是空引用,因为主机上只有一个卡;
4. IPADDR = 127.0.0.2 因为你将自己设为主机,使用这个地址,你想与本地环绕交流,其将被设为从机127.0.0.1
5. NETMASK = 255.255.255.0
6. RT_LOOPBACK = yes
7. RTCAP = yes 如果你想要像以太一样运行实时抓包
8. 设置TDMA_SLAVES=127.0.0.1 for loopback,作为从机;
■ 保存文件,然后在sbin路径下运行”./rtnet start”
■ 它将会等待从机,输入Ctrl C来离开。通过调用lsmod可以看到RTnet正在运行,在模块列表中可以看到网卡的实时驱动,如果没有则RTnet实际没有运行。
■ 运行”./rtping 127.0.0.1”来ping这个本地循环。
■ 停止RTnet在卡上的传递,运行 ./rtnet stop
测试结果:
输入lsmod |grep rtnet
ping本地循环:
多节点测试
测试步骤如下:
■ 从普通非实时的以太网口断开RTnet节点的网络电缆
■ 用交换机或集线器使RTnet节点相互连接
■ 重启系统,进入打过补丁的内核模式
■ 修改rtnet的配置文件:/usr/local/rtnet/etc/rtnet.conf.检查以下选项:
1. RT_DRIVER必须被设置为正确的实时以太网卡NIC驱动(本机选取rt_r8169)
2. 设置IPADDR为站的(network-unique)IP地址
3. 设置TDMA_MODE为“master(主机)”或“slave(从机)”,根据节点的角色
4. 将从机的IP地址放进TDMA_SLAVES, 用空格隔开(只在主机中需要)。
■ 关闭非实时的以太设备
■ 卸载非实时的以太设备驱动模块
■ 加载需要的Xenomai或RTAI模块
■ 切换到路径 /usr/local/rtnet/sbin
■ 在所有的节点上运行“sudo ./rtnet start”,这些节点应该可以相互看到,然后返回到命令提示符
■ 检查节点间的通讯,运行“./rtping
”,是其他站的IP地址,rtping应该可以成功地ping到其他节点
■ 输入Ctrl+c停止rtping
■ 卸载RTnet模块通过运行命令:”sudo ./rtnet stop”
测试结果:
考虑解决方法:
由于网卡使用的驱动为r8169,但是在usr/local/rtnet/modules中并没有相应的.ko文件,查找在进行menuconfig的时候在Drivers中选中rt_r8169编译,在配置文件中将RT_DRIVER改为rt_r8169,进行尝试,暂未解决。
参照http://www.xenomai.org/index.php/RTnet:Main#Overview,Rtping依靠Rtnet,RTipv4,以及至少一个一个网络设备驱动。否则: "host [...] unreachable" / "ioctl: No route to host",但是RTping RTnet RT_r8169均已挂起,目测是网卡驱动不配套所致,等新的网卡到了再继续测试。
RTnet调试
如果RTnet不工作,或者间歇工作,可能是由于以下原因:
■ /dev/rtnet设备节点消失了
■ Xenomai或RTAI在硬件上没有按期待的工作
■ 实时网络设备的Linux驱动被编译进内核,阻塞了硬件
■ IRQ clasn(中断请求冲突)。最近的Xenomai和RTAI版本可以检测冲突,将其报告给控制台,较老的版本可能会阻塞系统
■ 你用了rt_e1000驱动,和Rtnet 0.9.9或更早的版本。
解决问题的步骤:
■ 检查内核控制台或系统记录中有没有可疑信息
■ 验证你的实时扩展的基本测试是否正确工作
■ 收集你的设置信息(版本,配置,输出信息),发送一个rtnet-users的支持请求。
同时使用实时(RTnet)和非实时网络
如果你的系统上有两个(或更多)以太网口?可用,你可以配置一个使用RTnet,另一个使用非实时的网络:
■ 卸掉非实时的驱动
■ 在一个卡上加载并启动rtnet,通过用卡的参数(如:'insmod rt_e1000.ko cards=1,0')
■ 加载非实时的模块,并挂起,它将会使用剩下的卡中的任何一个
参数卡接受一串0和1,例如,'insmod rt_e1000.ko cards=0,1,0' 将会使用这三个卡中中间一个。
查看下面的脚本片段为例:
insmod /usr/local/rtnet/modules/rt_e1000.ko cards=1,0
insmod e1000
ifup eth1