usrp n310測試總結---環境搭建篇2-uhd-dpdk乾貨

在網絡搜索使用uhd-dpdk的人很少,特總結一些自己使用點滴,希望有用!

一、UHD驅動安裝(ubuntu 18.04)
官方指導:http://kb.ettus.com/Building_and_Installing_the_USRP_Open-Source_Toolchain_(UHD_and_GNU_Radio)_on_Linux
嚴格按照文檔一步步來,這裏不詳細說明。
sudo apt-get update
sudo apt-get -y install git swig cmake doxygen build-essential libboost-all-dev libtool libusb-1.0-0 libusb-1.0-0-dev libudev-dev libncurses5-dev libfftw3-bin libfftw3-dev libfftw3-doc libcppunit-1.14-0 libcppunit-dev libcppunit-doc ncurses-bin cpufrequtils python-numpy python-numpy-doc python-numpy-dbg python-scipy python-docutils qt4-bin-dbg qt4-default qt4-doc libqt4-dev libqt4-dev-bin python-qt4 python-qt4-dbg python-qt4-dev python-qt4-doc python-qt4-doc libqwt6abi1 libfftw3-bin libfftw3-dev libfftw3-doc ncurses-bin libncurses5 libncurses5-dev libncurses5-dbg libfontconfig1-dev libxrender-dev libpulse-dev swig g++ automake autoconf libtool python-dev libfftw3-dev libcppunit-dev libboost-all-dev libusb-dev libusb-1.0-0-dev fort77 libsdl1.2-dev python-wxgtk3.0 git libqt4-dev python-numpy ccache python-opengl libgsl-dev python-cheetah python-mako python-lxml doxygen qt4-default qt4-dev-tools libusb-1.0-0-dev libqwtplot3d-qt5-dev pyqt4-dev-tools python-qwt5-qt4 cmake git wget libxi-dev gtk2-engines-pixbuf r-base-dev python-tk liborc-0.4-0 liborc-0.4-dev libasound2-dev python-gtk2 libzmq3-dev libzmq5 python-requests python-sphinx libcomedi-dev python-zmq libqwt-dev libqwt6abi1 python-six libgps-dev libgps23 gpsd gpsd-clients python-gps python-setuptools
   cd $HOME
   mkdir workarea-uhd
   cd workarea-uhd
    git clone https://github.com/EttusResearch/uhd
   cd uhd
   git tag -l
   git checkout v3.14.1.1
    cd host
   mkdir build
   cd build
    cmake ../
    make
    sudo make test
    sudo make install
    sudo ldconfig
    $HOME/.bashrc file: 
   export LD_LIBRARY_PATH=/usr/local/lib
   測試:uhd_find_devices uhd_usrp_probe
   $ sudo uhd_images_downloader或者從已有系統中拷貝:
 從本地拷至遠程
 scp -r /usr/local/share/uhd/images [email protected]:/usr/local/share/uhd
 從遠程拷至本地
 scp -r [email protected]:/usr/local/share/uhd/images .
  scp -r [email protected]:/home/workarea-uhd/uhd .
 解決問題:EnvironmentError: OSError: error in pthread_setschedparam
   sudo groupadd usrp
   sudo usermod -aG usrp $USER
Then add the line below to end of the file /etc/security/limits.conf: 
   @usrp - rtprio  99

二、關於n310的使用和連接方法:
    官方文檔:https://kb.ettus.com/USRP_N300/N310/N320/N321_Getting_Started_Guide
    更詳細的USRP N310 配置教程:https://blog.csdn.net/qq_34998254/article/details/88399065
    通過ssh登陸n310的arm系統:
    將網線插到n310的RJ45端口(上面的1G網線口),另一端可以直接接到一個路由器或者交換機上;
    插上n310裏配件帶的串口Serial到一個pc上,執行ip a可以看到分配給n310的地址;下次直接ssh登陸此ip即可;如果是設備環境都是已經配置好的,可以使用uhd_find_devices直接查看下ip地址。
    如果沒有路由器或交換機可用,可以接到服務器的網口上,配置服務器此端口地址爲:192.168.2.254,然後執行:
    dnsmasq -i enp7s0f1 --dhcp-range=192.168.2.151,192.168.2.254 --except-interface=lo --bind-dynamic --no-daemon
    如果n310本來用着好好的,突然發現不了設備了,再執行以下上面的命令。
    n310 RJ45 1G端口ssh,如果沒有具有dhcp功能的路由器或交換機,可以使用linux server的dnsmasq模擬一個。
    將n310的 RJ45端口連到服務器的enp7s0f1網卡,配置enp7s0f1端口如下:注:此端口的ip地址和要分配給n310的地址需要同一網段
    vim /etc/network/interfaces
    auto enp7s0f1
    iface enp7s0f1 inet static
    address 192.168.2.254
    netmask 255.255.255.0
    MTU: 8000-----------一定要設爲8000
    ifup enp7s0f1
    dnsmasq -i enp7s0f1 --dhcp-range=192.168.2.151,192.168.2.254 --except-interface=lo --bind-dynamic --no-daemon
    通過uhd_find_devices可以看到分配給n310的ip地址
    --------------------------------------------------
    -- UHD Device 1
    --------------------------------------------------
    Device Address:
        serial: 316645F
        claimed: False
        mgmt_addr: 192.168.2.242
        product: n310
        reachable: No
        type: n3xx
    
    採樣模式:
    1Gb Streaming SFP Port 0:將子帶光口轉電口適配器插到SFP0上,用網線同服務器相連,設置服務器對應端口地址爲192.168.10.1,mtu設置爲1500(usrp n310的鏡像使用HG)
    10Gb Streaming SFP Port 1:使用光纖將sfp1和服務器相連,設置服務器對應端口地址爲192.168.20.1,mtu設置爲8000(usrp n310的鏡像使用HG或XG)
    Dual 10Gb Streaming SFP Ports 0/1:使用光纖將sfp1 sfp0和服務器相連,mtu設置爲8000(usrp n310的鏡像使用XG)
    服務端mtu的修改方法見環境搭建篇1;
    usrp n310 mtu設置位置見下,重啓生效,將生成的sfp0.network~轉換文件及時刪除。重啓後要ifconfig確認下。
     # ls /etc/systemd/network/
     eth0.network  sfp0.network  sfp1.network
         
    如果是使用dpdk的話:mtu要設置爲9000.
     
    fpga鏡像加載:
    uhd_image_loader --args "type=n3xx,addr=192.168.2.230,fpga=XG"
    uhd_image_loader --args "type=n3xx,fpga=HG"
    
   
三、srslte安裝:
 參考指導:https://blog.csdn.net/xrh003/article/details/79461114
 ubuntu 18.04依賴庫:
 sudo apt-get install cmake libfftw3-dev libmbedtls-dev libboost-program-options-dev libboost-thread-dev libconfig++-dev libsctp-dev  
 sudo apt-get install libboost-system-dev libboost-test-dev libboost-thread-dev libqwt-dev libqt4-dev  
 
    git clone https://github.com/suttonpd/srsgui.git  
    cd srsGUI  
    mkdir build  
    cd build  
    cmake ../  
    make  
    sudo make install  
    sudo ldconfig  

    git clone https://github.com/srsLTE/srsLTE  
    mkdir build  
    cd build  
    cmake ../  
    make  
    make test  
    sudo make install  
    sudo ldconfig  

    運行:
    sudo srsepc epc.conf  
    sudo srsenb enb.conf  
    sudo srsue ue.conf
    可以使用srslte/srsLTE/build/lib/examples目錄下的例子進行一些測試

四:dpdk的環境搭建
參考文檔:
https://files.ettus.com/manual/page_dpdk.html
https://doc.dpdk.org/guides-17.11/linux_gsg/linux_drivers.html#binding-and-unbinding-network-ports-to-from-the-kernel-modules 
網上也有很多dpdk的配置文檔,可以作爲補充指導http://www.pianshen.com/article/635691779/

1、18.04可以使用apt install dpdk dpdk-dev直接安裝,不需要下代碼自己編譯。
2、先使用ifconfig記錄下兩個光口的MAC地址,然後將兩個端口down掉ifdown ens3f0
73:
ens3f0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 8000
        inet 192.168.20.1  netmask 255.255.255.0  broadcast 192.168.20.255
        inet6 fe80::5639:dfff:fed3:f416  prefixlen 64  scopeid 0x20<link>
        ether 54:39:df:d3:f4:16  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 6  bytes 516 (516.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens3f1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 8000
        inet 192.168.10.1  netmask 255.255.255.0  broadcast 192.168.10.255
        inet6 fe80::5639:dfff:fed3:f417  prefixlen 64  scopeid 0x20<link>
        ether 54:39:df:d3:f4:17  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 5  bytes 426 (426.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        
        start tx_first (""|10)
  
  71:
  ens3f0: flags=4098<BROADCAST,MULTICAST>  mtu 1500
        ether 74:a0:63:f2:96:e7  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens3f1: flags=4098<BROADCAST,MULTICAST>  mtu 1500
        ether 74:a0:63:f2:96:e8  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
74

3、dpdk環境配置
顯示是否支持VT-d或VT-d是否成功打開
dmesg | grep -e DMAR -e IOMMU
若出現:IOMMU not found 或 不知如何在BIOS中enable00 VX-d,可參考博客:http://www.cnblogs.com/vancasola/p/9360837.html
檢查 VT-d 在kernel中是否enabled, 運行:
$ cat /proc/cmdline | grep iommu=pt
$ cat /proc/cmdline | grep intel_iommu=on
如果沒有顯示,需要進行如下配置:
此步修改系統文件,容易誤操作導致系統錯誤,修改前注意備份!
進入配置文件:
nano /etc/default/grub
GRUB_CMDLINE_LINUX="quiet splash iommu=pt intel_iommu=on"//添加配置信息
更新配置信息並重啓
default_hugepagesz=1G hugepagesz=1G hugepages=8
10.設置大內存頁,設置以後就可以不必每次運行程序的時候都執行setup.sh進行hugepage設置了。
查看cpu是否支持1G大內存頁:
cat /proc/cpuinfo | grep pdpe1gb
如果有顯示,則支持1G大內存頁。
默認支持2M內存頁,執行下面命令
cat /proc/cpuinfo |grep pse
如果有顯示,則支持2M內存頁

隔離分配給dpdk的cpu:
GRUB_CMDLINE_LINUX="isolcpus=1,3"
驗證方法:(1)cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-4.15.0-66-lowlatency root=UUID=ec9d0961-3c21-43c3-904d-91c4f0e1fde4 ro iommu=pt intel_iommu=on default_hugepagesz=1G hugepagesz=1G hugepages=8 isolcpus=0,1,2,3,4 quiet intel_pstate=disable
(2)可以查看當前進程的cpu affinity: $taskset -cp $$ 是否有已經被隔離的cpu
sudo grub-mkconfig -o /boot/grub/grub.cfg 
sudo reboot 
sudo ./testpmd -l 0-3 -n 4 -- -i --portmask=0x3 --nb-cores=2

端口所在的socket要和指定的core所在的socket相同:
查看端口所在的socket:
# List all the NICs with PCI address and device IDs.
lspci -nn | grep Eth
#Check the PCI device related numa node id:
cat /sys/bus/pci/devices/0000\:xx\:00.x/numa_node

4、綁定端口:
通過 dpdk-devbind -s查看端口狀態 
dpdk-devbind -b vfio-pci ens3f0
dpdk-devbind -b vfio-pci ens3f1
去綁定可以使用:
dpdk-devbind -b ixgbe 0000:01:00.1
dpdk-devbind -b ixgbe 0000:01:00.0
n310的端口mtu要設置爲9000.
5.搞完之後建議按照下面網址檢查一遍配置:
https://doc.dpdk.org/guides-17.11/linux_gsg/nic_perf_intel_platform.html#

6.新建一個uhd的配置文件如下:
system:/etc/uhd/uhd.conf
user:/root/.uhd/uhd.conf
將https://files.ettus.com/manual/page_dpdk.html給出的配置拷貝到文件中,修改上面的mac地址爲實際mac地址。

uhd_dpdk_eal_init
查看dpdk的配置選項,可根據這個函數設置到uhd.conf文件中

可以修改vim /etc/dpdk/interfaces 文件加入對應的端口,就不用每次重啓都重新綁端口了
pci     0000:01:00.1    vfio-pci
pci     0000:01:00:0    vfio-pci
有時候重啓幫端口可能會不成功,最後使用dpdk-devbind -s確認下

7、修改cpu的工作頻率
https://www.cnblogs.com/276815076/p/5434295.html
修改爲performance,以期最佳性能。

五:關於gnuradio:
比較好的指導文檔:
Gnuradio培訓:http://ettus.com.cn/peixun/27/

六:使用過程中問題總結:
1、本來環境是ok的,突然找不到設備,再執行下:
dnsmasq -i enp7s0f1 --dhcp-range=192.168.2.151,192.168.2.254 --except-interface=lo --bind-dynamic --no-daemon

2、報錯:RuntimeError: RuntimeError: Error during RPC call to `claim'. Error message: Someone tried to claim this device again
https://www.mail-archive.com/[email protected]/msg07599.html
登陸到n310的arm,執行systemctl restart usrp-hwd.service
然後重新下載鏡像ok
uhd_image_loader --args "type=n3xx,fpga=XG"
uhd_image_loader --args "type=n3xx,fpga=HG"
uhd_image_loader --args "type=n3xx,addr=192.168.2.230,fpga=XG"

3、修改linux爲performance後,服務器重啓後發現cpufreq-info查看發現不是此模式,需要將cpufreq重啓一下
/etc/init.d/cpufrequtils restart
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章