Olej писал(а):
4. точно так так же, для реализации realtime для Ethernet, TCP/IP, поскольку они сидят на IRQ от Ethernet адаптера, нужно использовать RTDM драйверы сетевых карт (которых совсем немного, около 10 моделей, в составе Xenomai);
5. и для обеспечения realtime для UDP/TCP они используют ещё один open-проект - RTnet, заменяющий способ доступа Ethernet к физ. среде на TDMA (каждый хост использует свой временной слот и не конкурирует за канал);
Для RTnet мы определяем RTDM драйвера используемых адаптеров Ethernet при конфигурировании ядра после наложения патчей - это
новость в Xenomai версий 3.0.Х.
Дальше готовим конфигурационный файл /usr/xenomai/etc/rtnet.conf ... для вот такой вот исходно сетевой конфигурации Linux:
Код: Выделить всё
olej@Cobalt ~ $ ifconfig
enp0s3 Link encap:Ethernet HWaddr 08:00:27:87:49:7f
inet addr:192.168.1.106 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fe87:497f/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:143 errors:0 dropped:0 overruns:0 frame:0
TX packets:125 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:19123 (19.1 KB) TX bytes:17614 (17.6 KB)
Interrupt:19 Base address:0xd020
enp0s8 Link encap:Ethernet HWaddr 08:00:27:15:86:46
inet addr:192.168.1.102 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::10b3:26fa:3697:d71e/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1238 errors:0 dropped:0 overruns:0 frame:0
TX packets:636 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1230448 (1.2 MB) TX bytes:56247 (56.2 KB)
lo Link encap:Локальная петля (Loopback)
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:267 errors:0 dropped:0 overruns:0 frame:0
TX packets:267 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:23599 (23.5 KB) TX bytes:23599 (23.5 KB)
Собственно, в /usr/xenomai/etc/rtnet.conf меняем следующие поля (здесь самое неприятное - разобраться в синтаксисе):
Код: Выделить всё
...
RT_DRIVER="rt_e1000" # имя файла драйвера реалтайм
RT_DRIVER_OPTION="cards=0,1" # используется если несколько сетвых карт
# PCI addresses of RT-NICs to claim (format: 0000:00:00.0)
# If both Linux and RTnet drivers for the same hardware are loaded, this
# list instructs the start script to rebind the given PCI devices, detaching
# from their Linux driver, attaching it to the RT driver above. Example:
REBIND_RT_NICS=0000:00:08.0 # ввести команду lshw -C network и посмотреть значение поля bus info: pci@…
# IP address and netmask of this station
# The TDMA_CONFIG file overrides these parameters for masters and backup
# masters. Leave blank if you do not use IP addresses or if this station is
# intended to retrieve its IP from the master based on its MAC address.
IPADDR="172.16.1.1" # присваиваемый сетевой адрес
NETMASK="255.255.240.0" # маска
# Start realtime loopback device ("yes" or "no")
RT_LOOPBACK="yes" # петлевой интерфейс или /loopback
# Use the following RTnet protocol drivers
RT_PROTOCOLS="udp packet" # используемые протоколы
# Start capturing interface ("yes" or "no")
RTCAP="yes" # для использования wireshark нужно поставить YES
...
# TDMA mode of the station ("master" or "slave")
# Start backup masters in slave mode, it will then be switched to master
# mode automatically during startup.
TDMA_MODE="master"
# Master parameters
# Simple setup: List of TDMA slaves
TDMA_SLAVES="172.16.1.2 172.16.1.3"
...
Дальше в каталоге /usr/xenomai/sbin :
Код: Выделить всё
Cobalt sbin # ./rtnet -v start
Turning on verbose mode
/usr/xenomai/sbin/rtifconfig rtlo up 127.0.0.1
/usr/xenomai/sbin/rtcfg rteth0 server
/usr/xenomai/sbin/rtifconfig rteth0 up 172.16.1.1 netmask 255.255.240.0
/usr/xenomai/sbin/tdmacfg rteth0 master 500
/usr/xenomai/sbin/tdmacfg rteth0 slot 0 0
/usr/xenomai/sbin/rtcfg rteth0 add 172.16.1.2 -stage1 -
/usr/xenomai/sbin/rtcfg rteth0 add 172.16.1.3 -stage1 -
Waiting for all slaves.../usr/xenomai/sbin/rtcfg rteth0 wait
olej@Cobalt /usr/xenomai/sbin $ sudo ./rtifconfig
[sudo] пароль для olej:
rteth0 Medium: Ethernet Hardware address: 08:00:27:15:86:46
IP address: 172.16.1.1 Broadcast address: 172.16.15.255
UP BROADCAST RUNNING MTU: 1500
rtlo Medium: Local Loopback
IP address: 127.0.0.1
UP LOOPBACK RUNNING MTU: 1500
olej@Cobalt /usr/xenomai/sbin $ sudo ./rtroute
Host Routing Table
Hash Destination HW Address Device
00 0.0.0.0 00:00:00:00:00:00 rtlo
01 172.16.1.1 00:00:00:00:00:00 rtlo
01 127.0.0.1 00:00:00:00:00:00 rtlo
3F 172.16.15.255 FF:FF:FF:FF:FF:FF rteth0
Код: Выделить всё
olej@Cobalt /usr/xenomai/sbin $ lspci -vvv -s00:08.0
00:08.0 Ethernet controller: Intel Corporation 82540EM Gigabit Ethernet Controller (rev 02)
Subsystem: Intel Corporation PRO/1000 MT Desktop Adapter
Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
Status: Cap+ 66MHz+ UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Latency: 64 (63750ns min)
Interrupt: pin A routed to IRQ 16
Region 0: Memory at e1000000 (32-bit, non-prefetchable) [size=128K]
Region 2: I/O ports at 1000 [size=8]
Capabilities: <access denied>
Kernel driver in use: rt_e1000
Kernel modules: e1000, rt_e1000
olej@Cobalt /usr/xenomai/sbin $ lsmod | grep rt
rtmac 9655 1 tdma
rtcfg 37150 0
rtcap 7413 3
rt_loopback 1467 1
rtpacket 8360 0
rtudp 12694 0
rtipv4 24259 2 rtudp,rtcfg
rt_e1000 91602 1
rtnet 55340 10 rtipv4,rt_loopback,rtmac,rtpacket,rtcap,rtudp,rt_e1000,rtcfg,tdma
parport_pc 28236 0
parport 39055 3 lp,parport_pc,ppdev
Код: Выделить всё
olej@Cobalt /usr/xenomai/sbin $ sudo ./rtping 127.0.0.1
Real-time PING 127.0.0.1 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 time=95.6 us
64 bytes from 127.0.0.1: icmp_seq=2 time=21.7 us
64 bytes from 127.0.0.1: icmp_seq=3 time=20.7 us
64 bytes from 127.0.0.1: icmp_seq=4 time=22.2 us
^C
--- 127.0.0.1 rtping statistics ---
4 packets transmitted, 4 received, 0% packet loss
worst case rtt = 95.6 us
olej@Cobalt /usr/xenomai/sbin $ sudo ./rtping 172.16.1.1
Real-time PING 172.16.1.1 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 time=52.1 us
64 bytes from 127.0.0.1: icmp_seq=2 time=25.7 us
64 bytes from 127.0.0.1: icmp_seq=3 time=22.1 us
64 bytes from 127.0.0.1: icmp_seq=4 time=156.8 us
64 bytes from 127.0.0.1: icmp_seq=5 time=20.0 us
64 bytes from 127.0.0.1: icmp_seq=6 time=200.9 us
^C
--- 172.16.1.1 rtping statistics ---
6 packets transmitted, 6 received, 0% packet loss
worst case rtt = 200.9 us
olej@Cobalt /usr/xenomai/sbin $ sudo ./rtping 192.168.1.20
Real-time PING 192.168.1.20 56(84) bytes of data.
ioctl: No route to host
Код: Выделить всё
olej@Cobalt /usr/xenomai/sbin $ ./rtps
PID TIME THREAD CMD
0 000:00:20.368,439 44186129120072 ROOT/0 idle -1 0 -
0 000:00:20.377,419 43835667910690 ROOT/1 idle -1 0 -
0 000:00:14.654,201 43498983037921 ROOT/2 idle -1 0 -
0 000:00:18.040,593 43787708108929 ROOT/3 idle -1 0 -
6166 000:00:00.000,000 42348 rtnet-stack rt 98 0 -
6167 000:00:00.000,000 280975 rtnet-rtpc rt 0 0 -
9922 000:00:00.000,731 17578623 rtcfg-rx rt 0 0 -
9954 000:00:04.554,247 80602503563 rtnet-tdma rt 99 0 -
0 000:00:00.000,000 0 IRQ16: rteth0 idle 0 0 -
0 000:00:00.000,000 0 IRQ16: rteth0 idle 0 0 -
0 000:00:00.000,000 0 IRQ16: rteth0 idle 0 0 -
0 000:00:02.249,487 40543837545 IRQ16: rteth0 idle 0 0 -
0 000:00:00.823,140 133673460711 IRQ33026: [timer] idle 0 0 -
0 000:00:00.017,227 32522728519 IRQ33026: [timer] idle 0 0 -
Вот как-то так это выглядит.
Всё это более-менее описано здесь:
RTnet Installation.
P.S. там, кстати, есть пример загрузки драйвера RTDM при нескольких сетевых картах:
Код: Выделить всё
# sudo insmod /usr/local/rtnet/modules/rt_e1000.ko cards=1,0