1. 程式人生 > >5. MIZ7035 PCIe測試 RIFFA【PCIE視訊傳輸】

5. MIZ7035 PCIe測試 RIFFA【PCIE視訊傳輸】

1.前言

MIZ7035官方提供了兩種pcie的demo,一個就是普通的PIO測試,一個是BMD測試。我只是試驗了PIO功能,可以對板卡直接進行IO暫存器讀寫。而另外一個BMD功能使用了DMA來加速資料讀寫速度。
我也是第一次接觸PCIe,BMD確實也可以完成應用的需求,搞起來應該沒有問題。準備用這個開始做實驗呢,問了一下學校之前的第二導師,他直接給我說了5個字母:R-I-F-F-A。說讓我去查一下,底層FPGA和上層軟體都已經是一個完整的架構了,可以直接使用。既然老師說了,一定是這個方法可能更為方便吧,而且他說一直在用這個架構。

2.RIFFA和XILLYBUS

XILLYBUS

XILLYBUS最早接觸是在參加OpenHW2014比賽時候看到過的,當時真是不知道它是幹什麼的。當時在用zybo和zedboard做比賽專案,XILLYBUS提供了一個在這兩個開發板上可以執行的Ubuntu作業系統,叫做Xillinux,很強大。雖然說這個Ubuntu的介面在沒有GPU加持的Zynq器件上執行起來稍微有些卡頓,但是它畢竟是一個完整的桌面作業系統,我們很多參加比賽的人都是在這個上面搞起來的,還有一部分原因就是很多人不會PetaLinux,而且自己去新增桌面的難度更是高。查了一下,已經推出了Xillinux 2.0 beta版本,有空了去試一下。
在Xillinux中,官方提供了一個AXI介面的Xillybus,當時還沒想明白是幹啥用的。現在終於明白了。。原來是為了相容它的PCIe介面驅動。Xillybus還是主打他的PCIe介面驅動的。
下圖是Xillybus的結構
2.png

Xillybus是用到了Altera或Xilinux的PCIe介面core,接入它自己的Xillybus IP core,最後通過FIFO介面將TX、RX通道映射出來。結構很清晰,我們需要的只是在FIFO介面後接入我們自己的IP core,按照自己的協議來進行通訊即可。
上層程式碼直接通過開啟名為xillybus的裝置,然後進行檔案讀寫即可實現對底層FIFO收發資料的控制
3.png
這樣看來PCIe介面的Xillybus是獨立於PCIe介面FPGA的另外一個嵌入式Linux系統或是桌面的Windows、Linux作業系統。
而AXI介面的Xillybus對應的HOST就是本身Zynq器件上的ARM處理器。

RIFFA

RIFFA是第一次接觸,他的結構如下圖
4.png
FPGA部分首先是Xilinx的PCIe core,然後使用TX、RX引擎,在經過通道仲裁對映到最多12個TX、RX通道上。結構與PIO、BMD的結構類似,增加了通道擴充套件的功能,這樣就不用我們自己去寫仲裁程式碼了。
PC部分就是基本的驅動、應用結構,PCIe的訪問空間對映到了PC的記憶體上,RIFFA的驅動負責記憶體以及PCIe介面的管理,RIFFA庫可以被使用者空間程式呼叫來實現對底層RIFFA驅動的呼叫,並最終實現PCIe的資料通訊。
RIFFA的讀寫函式名為fpga_recv和fpga_send,函式介面也類似於一個檔案讀寫命令,只不過可以在引數中指定PCIe的通道編號、資料的大小等資訊。
fpga_send的流程
5.png
fpga_recv的流程
6.png
裡面都有有一個叫做build scatter gather list的步驟,我的理解是在PC上malloc申請記憶體時候容易申請到非連續的實體記憶體,可能被分為好幾塊,所以要將這些空間進行分離並生成這個list,然後將list資訊傳送給PCIe的endpoint,EP再根據這個list來依次使用DMA直接操作PC上的記憶體空間。
看到上面兩個圖,我真是慶幸自己沒有去嘗試自己搞,根本沒那麼多時間去搞啊,而且感覺也沒那能力···囧。

EPEE

EPEE的框圖如下
7.png
沒有仔細看,就不分析了。

以上說到的三個框架,肯定是都可以使用的,但是聽老師的建議,直接去搞RIFFA吧,也沒有為什麼。

2.建立RIFFA工程

我直接下載了最新release的版本RIFFA 2.2.2
解壓後的檔案結構:
8.png

ZC706 Demo

./source/fpga/xilinx目錄下可以看到xilinx開發板的demo,MIZ7035的zynq晶片最為接近zc706開發板,我們就用這個demo來進行參考。
使用vivado直接開啟工程./source/fpga/xilinx/zc706/ZC706_Gen2x4If128/prj/ZC706_Gen2x4If128.xpr,點選自動升級到Vivado 2017.4的版本。
軟體更新依賴關係後,發現工程中缺失了一些檔案,這些檔案是riffa相關的hdl程式碼,我們在工程中直接新增目錄./source/fpga/riffa_hdl下的所有檔案,並勾選紅框位置的兩個選項
9.png
點選Finish,等待檔案結構的更新,可以看到已經沒有錯誤警告了
10.png
看到多了一個altera相關的verilog檔案,可以刪除掉。因為我沒有ZC706的開發板,就不綜合了,直接去在MIZ7035上去實驗。

MIZ7035工程設計

繼續將前一節測試過的HDMI、MIG工程拿來新增PCIe功能
點選IP Catalog->搜尋pcie->雙擊7 Series Integrated Block for PCI Express->選擇Customize IP,這裡不能將IP加入到BD中去,因為這個IP Core是包含在另外一個hdl檔案中的。
11.png
為了方便移植,同時開啟ZC706 Demo和MIZ7035工程中的PCIe IP,參照demo的配置來配置miz7035的IP。貼圖:
X4,5.0GT/s,100MHz Ref clock
12.png
13.png
14.png
15.png
16.png
17.png
18.png
19.png
20.png
21.png
22.png
23.png
24.png
25.png
先不去管各個配置的意義了,照著demo做就應該沒問題了。

在自己的工程中新建檔案MIZ7035_Gen2x4lf128.v,然後複製./source/fpga/xilinx/zc706/ZC706_Gen2x4If128/hdl/ZC706_Gen2x4If128.v內的程式碼並貼上進來。將ZC706字元都改為MIZ7035,其它不用修改。

在自己的工程中新建檔案riffa_wrapper_miz7035.v,然後複製./source/fpga/xilinx/zc706/riffa_wrapper_zc706.v內的程式碼並貼上進來。將ZC706字元都改為MIZ7035,其它不用修改。

然後檔案目錄更新就會提示檔案缺失,然後按照剛才demo的方法,將./source/fpga/riffa_hdl下的所有檔案新增到工程,等待更新,可以刪除不需要的檔案。
最終目錄如下
26.png

因為我之前的工程中有BD,為了例化一個MIZ7035_Gen2x4lf128模組,需要將BD和這個模組重新例化然後作為頂層檔案。
新建一個MIZ7035_PCIE_RIFFA.v檔案,複製之前BD生成的wrapper程式碼並複製進來。刪除原先BD的wrapper。下面對MIZ7035_Gen2x4lf128進行例化。

module MIZ7035_PCIE_RIFFA(
//pcie
    PCI_EXP_TXP,
    PCI_EXP_TXN,
    PCI_EXP_RXP,
    PCI_EXP_RXN,

    PCIE_REFCLK_P,
    PCIE_REFCLK_N,
    PCIE_RESET_N,
...
...
parameter C_NUM_LANES =  4;

output [(C_NUM_LANES - 1) : 0] PCI_EXP_TXP;
 output [(C_NUM_LANES - 1) : 0] PCI_EXP_TXN;
 input [(C_NUM_LANES - 1) : 0]  PCI_EXP_RXP;
 input [(C_NUM_LANES - 1) : 0]  PCI_EXP_RXN;

 input                          PCIE_REFCLK_P;
 input                          PCIE_REFCLK_N;
 input                          PCIE_RESET_N;

 MIZ7035_Gen2x4If128 MIZ7035_Gen2x4If128_inst
 (
    .PCI_EXP_TXP(PCI_EXP_TXP),
    .PCI_EXP_TXN(PCI_EXP_TXN),
    .PCI_EXP_RXP(PCI_EXP_RXP),
    .PCI_EXP_RXN(PCI_EXP_RXN),

    .LED(),
    .PCIE_REFCLK_P(PCIE_REFCLK_P),
    .PCIE_REFCLK_N(PCIE_REFCLK_N),
    .PCIE_RESET_N(PCIE_RESET_N)
);
endmodule

將新建的MIZ7035_PCIE_RIFFA.v檔案作為頂層檔案。
最後的目錄如下:
27.png
其中有一個chnl_tester的例化,程式碼如下:

`timescale 1ns/1ns
module chnl_tester #(
    parameter C_PCI_DATA_WIDTH = 9'd32
)
(
    input CLK,
    input RST,
    output CHNL_RX_CLK, 
    input CHNL_RX, 
    output CHNL_RX_ACK, 
    input CHNL_RX_LAST, 
    input [31:0] CHNL_RX_LEN, 
    input [30:0] CHNL_RX_OFF, 
    input [C_PCI_DATA_WIDTH-1:0] CHNL_RX_DATA, 
    input CHNL_RX_DATA_VALID, 
    output CHNL_RX_DATA_REN,

    output CHNL_TX_CLK, 
    output CHNL_TX, 
    input CHNL_TX_ACK, 
    output CHNL_TX_LAST, 
    output [31:0] CHNL_TX_LEN, 
    output [30:0] CHNL_TX_OFF, 
    output [C_PCI_DATA_WIDTH-1:0] CHNL_TX_DATA, 
    output CHNL_TX_DATA_VALID, 
    input CHNL_TX_DATA_REN
);

reg [C_PCI_DATA_WIDTH-1:0] rData={C_PCI_DATA_WIDTH{1'b0}};
reg [31:0] rLen=0;
reg [31:0] rCount=0;
reg [1:0] rState=0;

assign CHNL_RX_CLK = CLK;
assign CHNL_RX_ACK = (rState == 2'd1);
assign CHNL_RX_DATA_REN = (rState == 2'd1);

assign CHNL_TX_CLK = CLK;
assign CHNL_TX = (rState == 2'd3);
assign CHNL_TX_LAST = 1'd1;
assign CHNL_TX_LEN = rLen; // in words
assign CHNL_TX_OFF = 0;
assign CHNL_TX_DATA = rData;
assign CHNL_TX_DATA_VALID = (rState == 2'd3);

always @(posedge CLK or posedge RST) begin
    if (RST) begin
        rLen <= #1 0;
        rCount <= #1 0;
        rState <= #1 0;
        rData <= #1 0;
    end
    else begin
        case (rState)

        2'd0: begin // Wait for start of RX, save length
            if (CHNL_RX) begin
                rLen <= #1 CHNL_RX_LEN;
                rCount <= #1 0;
                rState <= #1 2'd1;
            end
        end

        2'd1: begin // Wait for last data in RX, save value
            if (CHNL_RX_DATA_VALID) begin
                rData <= #1 CHNL_RX_DATA;
                rCount <= #1 rCount + (C_PCI_DATA_WIDTH/32);
            end
            if (rCount >= rLen)
                rState <= #1 2'd2;
        end

        2'd2: begin // Prepare for TX
            rCount <= #1 (C_PCI_DATA_WIDTH/32);
            rState <= #1 2'd3;
        end

        2'd3: begin // Start TX with save length and data value
            if (CHNL_TX_DATA_REN & CHNL_TX_DATA_VALID) begin
                rData <= #1 {rCount + 4, rCount + 3, rCount + 2, rCount + 1};
                rCount <= #1 rCount + (C_PCI_DATA_WIDTH/32);
                if (rCount >= rLen)
                    rState <= #1 2'd0;
            end
        end

        endcase
    end
end

CHNL就是RIFFA實現的一個類似FIFO或是AXIS的介面,這個檔案等於是做了一個迴環。RX將收到的最後一個數據進行儲存,然後使用TX將資料每次增加一個數值後再發送出去。這個測試與上位機測試程式碼將能夠一起對PCIe的頻寬進行測試。

接著在之前的MIZ7035_IO.xdc中新增約束:

#PCIe
set_property IOSTANDARD LVCMOS33 [get_ports PCIE_RESET_N]
set_property PACKAGE_PIN V19 [get_ports PCIE_RESET_N]
set_property PULLUP true [get_ports PCIE_RESET_N]
set_false_path -from [get_ports PCIE_RESET_N]

create_clock -period 10.000 -name sys_clk [get_ports PCIE_REFCLK_P]
set_property PACKAGE_PIN W6 [get_ports PCIE_REFCLK_P]
set_property PACKAGE_PIN W5 [get_ports PCIE_REFCLK_N]

set_property PACKAGE_PIN AC2 [get_ports {PCI_EXP_TXP[0]}]
set_property PACKAGE_PIN AE2 [get_ports {PCI_EXP_TXP[1]}]
set_property PACKAGE_PIN AF4 [get_ports {PCI_EXP_TXP[2]}]
set_property PACKAGE_PIN AF8 [get_ports {PCI_EXP_TXP[3]}]

set_property PACKAGE_PIN AC1 [get_ports {PCI_EXP_TXN[0]}]
set_property PACKAGE_PIN AE1 [get_ports {PCI_EXP_TXN[1]}]
set_property PACKAGE_PIN AF3 [get_ports {PCI_EXP_TXN[2]}]
set_property PACKAGE_PIN AF7 [get_ports {PCI_EXP_TXN[3]}]

set_property PACKAGE_PIN AD4 [get_ports {PCI_EXP_RXP[0]}]
set_property PACKAGE_PIN AC6 [get_ports {PCI_EXP_RXP[1]}]
set_property PACKAGE_PIN AE6 [get_ports {PCI_EXP_RXP[2]}]
set_property PACKAGE_PIN AD8 [get_ports {PCI_EXP_RXP[3]}]

set_property PACKAGE_PIN AD3 [get_ports {PCI_EXP_RXN[0]}]
set_property PACKAGE_PIN AC5 [get_ports {PCI_EXP_RXN[1]}]
set_property PACKAGE_PIN AE5 [get_ports {PCI_EXP_RXN[2]}]
set_property PACKAGE_PIN AD7 [get_ports {PCI_EXP_RXN[3]}]

這樣就可以了,進行綜合、實現、生成bit。
看一下實現後的Schematic
28.png
紅色框內是PCIe相關的,藍色框內是之前HDMI和MIG相關的。可以看到兩者直接沒有任何連線,也確實是我們還沒有新增它們之間的通訊關係,等驗證完介面後,我再來用它的CHNL通道來實現視訊資料的連線。

佔用資源,可以看到我們使用了一個X4的PCIe
29.png

輸出到SDK,新建一個fsbl工程,更顯原有工程,然後生成一個BOOT.bin。將檔案複製到SD卡,插入到MIZ7035上,並將開發板啟動方式改為SD卡啟動,這樣我們就不用JTAG進行下載了。
將開發板插到電腦上並上電,然後啟動PC,用之前安裝過的Windriver就可以看到我們的裝置了,說明PCIe介面已經啟動。下面我們來用RIFFA進行測試。

3.RIFFA驅動安裝

Windows RIFFA

先看一下./install/windows/README.txt
裡面說到只能支援Windows 7的32、64位系統。
再看./source/driver/windows/README.txt
裡面說到Debugging on Windows is difficult because there exists no kernel log file.
我也試了一下,WDK真是不會用,編譯的時候也出錯了。等有空了再來試吧。

我也安裝了,當啟動電腦後即可找到我們的裝置
1.png

Linux RIFFA

./install/linux/README.txt
裡面說直接使用driver目錄下的編譯和安裝驅動即可
./source/driver/linux/README.txt
裡面說了驅動的安裝指令

$ sudo make setup
$ make
$ sudo make install

很簡單的就能夠安裝了,在應用程式編寫時直接include riffa.h 並link -lriffa即可,看起來很方便。

問題又來了,我電腦上沒有Linux實體機,而VMWare的虛擬機器又不支援PCIe裝置的連入,別人的電腦搞起來又不方便,之前zcu102 petalinux的pcie還沒
編完。
眼前一亮,看到了一個TX1開發板,搞起?

Linux RIFFA TX1

將MIZ7035插到TX1的PCIe插槽上,開啟MIZ7035的電源,等待SDK啟動成功。
在TX1上連線網線、HDMI顯示器,按下TX1的POWER BTN按鍵開啟TX1開發板。

我直接用Xshell通過網路登入到了TX1的命令列。
看一下pci裝置

[email protected]:~$ lspci
00:01.0 PCI bridge: NVIDIA Corporation Device 0fae (rev a1)
01:00.0 Memory controller: Xilinx Corporation Device 7024

可以看到MIZ7035的PCIe已經被識別到了。
用U盤或TFTP將./source/driver,./source/c_c++,./source/python複製到開發板上去,然後進入./driver/linux/目錄執行

$ sudo make setup

結果提示安裝linux-headers-3.10.96-tegra時找不到軟體包。網上也沒有一個回答清楚的答案。試了試執行make指令,通過警告資訊,可以看到定位到了目錄/usr/src/linux-headers-3.10.96-tegra
檢視該目錄下的README,

These headers are provided to enable external module builds. They must be prepared on the target system before being used for module compilation. To prepare the headers, go into the headers package top level directory, and issue the following command:

sudo make modules_prepare

After preparation completes, external modules can be built following the process described in Documentation/kbuild/modules.txt.

原來是這樣TX1 tegra的linux-headers是從apt-get源上找不到的,我們需要直接用開發板自己提供的,編譯一下就好了。
在該目錄下執行命令編譯linux-headers

$ sudo make modules_prepare

返回剛才的的./driver/linux/目錄

$ sudo make setup
$ make
$ sudo make install

這樣riffa的功能看起來就完成編譯了,激動人心的測試要開始了。
進入目錄./c_c++/linux/x64/sample_app,這個app就是用來對應FPGA中的chnl_tester模組的。編譯:

$ make clean
$ make

測試前可以看一下原始碼,瞭解測試命令。測試:

[email protected]:~/pcie/c_c++/linux/x64/sample_app$ ./testutil 0
Number of devices: 1
0: id:0
0: num_chnls:1
0: name:0000:01:00.00
0: vendor id:10EE
0: device id:7024
[email protected]:~/pcie/c_c++/linux/x64/sample_app$ ./testutil 1 0
[email protected]:~/pcie/c_c++/linux/x64/sample_app$ ./testutil 2 0 0 5000000
words sent: 5000000
words recv: 5000000
recvBuffer[0]: 4999997
recvBuffer[1]: 4999998
recvBuffer[2]: 4999999
recvBuffer[3]: 5000000
recvBuffer[4]: 5
recvBuffer[5]: 6
recvBuffer[6]: 7
recvBuffer[7]: 8
recvBuffer[8]: 9
recvBuffer[9]: 10
recvBuffer[10]: 11
recvBuffer[11]: 12
recvBuffer[12]: 13
recvBuffer[13]: 14
recvBuffer[14]: 15
recvBuffer[15]: 16
recvBuffer[16]: 17
recvBuffer[17]: 18
recvBuffer[18]: 19
recvBuffer[19]: 20
recvBuffer[4463772]: 0, expected 4463773
send bw: 943.800814 MB/s 20.209229ms
recv bw: 588.343826 MB/s 32.418945ms
[email protected]:~/pcie/c_c++/linux/x64/sample_app$ ./testutil 2 0 0 93312000
words sent: 93312000
words recv: 93312000
recvBuffer[0]: 93311997
recvBuffer[1]: 93311998
recvBuffer[2]: 93311999
recvBuffer[3]: 93312000
recvBuffer[4]: 5
recvBuffer[5]: 6
recvBuffer[6]: 7
recvBuffer[7]: 8
recvBuffer[8]: 9
recvBuffer[9]: 10
recvBuffer[10]: 11
recvBuffer[11]: 12
recvBuffer[12]: 13
recvBuffer[13]: 14
recvBuffer[14]: 15
recvBuffer[15]: 16
recvBuffer[16]: 17
recvBuffer[17]: 18
recvBuffer[18]: 19
recvBuffer[19]: 20
recvBuffer[702060]: 0, expected 702061
send bw: 1028.932190 MB/s 345.947998ms
recv bw: 1577.181281 MB/s 225.691895ms

下面分析一下測試指令

  1. 指令0用來列舉所有的PCIe RIFFA裝置,打印出了他們的RIFFA id,內部的chnl通道數量,裝置名稱,廠家和裝置id。
  2. 指令1用來對PCIe core進行復位
  3. 指令2用來對PCIe的收發功能與速度進行測試,最後一個引數指定了測試的word(4位元組)數量。
  4. 第一次測試了5000000個word,大約19MB,速度為
    send bw: 943.800814 MB/s 20.209229ms
    recv bw: 588.343826 MB/s 32.418945ms
  5. 第一次測試了1個1920*[email protected] 24bit影象大小的資料包,大約356MB,速度為
    send bw: 1028.932190 MB/s 345.947998ms
    recv bw: 1577.181281 MB/s 225.691895ms

PCIe Gen2 x 4的理論頻寬為2000MB/s,看來這個RIFFA是會有一些損失的,不過還能接受。

python測試

[email protected]:~/pcie/python$ sudo python setup.py install
[email protected]:~/pcie/python$ cd sample_app/
[email protected]:~/pcie/python/sample_app$ vim sampleapp.py
將指令碼中的amt改為20 :wq
[email protected]:~/pcie/python/sample_app$ python sampleapp.py
array('I', [1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L])
array('I', [17L, 18L, 19L, 20L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L])
[email protected]:~/pcie/python/sample_app$

可以看到測試的前4個數據發生了錯誤,還不知道是什麼原因。先不管了

4.總結

這次使用了老師給我推薦的RIFFA功能來測試PCIe的通訊。一開始想著自己來做所有的工作,現在看來真的沒必要,畢竟相關的東西太多太多,光是linux核心的驅動就夠我受的了。RIFFA這個框架從知道這個名稱,經過MIZ7035開發板一直,到最後用測試用例測試頻寬,整個過程只有不到5個小時,感覺還是非常非常效率的

接下來要去熟悉一下它的CHNL介面,然後再這個介面上新增我自己的通道,實現最先計劃的PCIe視訊傳輸。

相關推薦

5. MIZ7035 PCIe測試 RIFFAPCIE視訊傳輸

1.前言 MIZ7035官方提供了兩種pcie的demo,一個就是普通的PIO測試,一個是BMD測試。我只是試驗了PIO功能,可以對板卡直接進行IO暫存器讀寫。而另外一個BMD功能使用了DMA來加速資料讀寫速度。 我也是第一次接觸PCIe,BMD確實也可以完

Android 使用librtmp推流視訊傳輸

1.通過jni呼叫librtmp 下面是jni中提供給java呼叫的本地方法: public final class PublishJni { static { System.loadLibrary("publish"); } s

4. MIZ7035 HDMI測試PCIE視訊傳輸

1 MIZ7035的HDMI工程建立 將上次用到的MIG_AXI工程拿來進行HDMI的工程建立。 不像ZCU102的開發板那樣用GT收發器,MIZ7035的HDMI介面是靠PL的邏輯來實現輸入輸出的。所以要寫RTL程式碼來做HDMI的編解碼。 測了幾天MI

3. ZCU102 HDMI Demo工程修改PCIE視訊傳輸

為了更快速的開發我需要的帶快取的hdmi收發通路,將上一節的demo進行修改來實現。當然,可以從頭開始自己進行配置,我就這麼做了,但是因為fpga配置的不同,還要修改更多的驅動程式碼,相當麻煩,所以就直接拿demo的工程來用吧。(我一開始參考了TRD的工程程式碼

如何在你的專案中整合 CAP手把手視訊教程

前言 之前錄製過一期關於CAP的視訊,但是由於當時是直播時錄製的視訊,背景音比較雜所以質量有點差。這次的視訊沒有直播,直接錄製的,視訊質量會好很多,第一遍錄製完成之後發現播放到一半沒有聲音,所以又重新錄製了一遍。 視訊簡介 CAP 2.3 版本釋出後,針對於一些介面做了一些調整,內部也做了很多修改,這一期的視

GIF視訊轉換Video to Gif Pro for Mac破解版

想要在視訊中提取剪輯甚至幀以轉換為GIF嗎? 小編為您帶來Video to Gif Pro Mac破解版,這是一款非常方便的GIF視訊轉換工具,它支援當下所有主流視訊格式,快速從你的視訊檔案中進行提取剪輯,並轉換為GIF格式,非常的時候快捷,有需要的朋友快來看看吧! Video to Gif P

UML視訊總結——UML概述

本章介紹內容較多,但都是提綱要領,不會細細展開 一、面向物件技術 面向物件技術是一種程式設計方法,是對現實世界中問題的抽象方式         軟體質量衡量的指標 外部: 1、正確性 2、健壯性和

分享視訊資源React JS教程

React 是一個用於構建使用者介面的 JAVASCRIPT 庫。 React主要用於構建UI,很多人認為 React 是 MVC 中的 V(檢視)。 React 起源於 Facebook 的內部專案,用來架設 Instagram 的網站,並於 2013 年

Appium+Python+Pycharm如何建立並執行自動化測試指令碼真機執行

二、將測試機連線電腦,手機上會有一些提示,總之都允許就可以了,開始USB除錯模式,之後開啟cmd,輸入adb devices,檢視手機是否成功連線,如下圖所示: 上圖中可以看到,有一臺裝置已經成功連線了電腦; 三、開啟pycharm,新建一個python檔案,

視訊傳輸二、Opencv結合socket進行視訊傳輸(TCP協議)

        博文由來:筆者突發奇想,做採集4個USB攝像頭畫面小實驗時,卻遇到了在電腦上最多隻能同時開啟3個這樣頭痛的問題(個人分析認為是電腦的問題),故出此下策,在客戶端掛1個,伺服器掛3個攝像頭,利用socket進行視訊傳輸,本篇文章是利用的是TCP協議。筆者拙見,

軟體安全測試書籍持續更新中

*** 《Hunting Security Bugs》 《How to Break Web Software》 *** 《19 Deadly Sins of Software Security- Programming Flaws and How to Fix Them》 《Beautiful Sec

JMeter 測試之逐個擊破 視訊教程(價值199.5元)

本課程是由"籽藤"老師帶來的Selenium課程,JMeter是最流行的開源免費的效能測試工具之一,很適合沒有程式碼背景的測試人員。 https://pan.baidu.com/s/1p4cPuo_t70Eh0D_dzfJq2Q 課程目標: 會利用JMeter和JMeter plugin

PCIE-1---Pcie基本概念普及(掃盲篇--巨適合新手)

  PCIE由早期得PCI擴充套件衍生而來並且對相容PCI,兩者得主要區別在於並行到序列得切換,且速率更快。目前主機板上越來越多得裝置都掛載到PCI匯流排下面,甚至部分硬碟也會掛載PCI匯流排下面,可見PCIE得應用越來越廣。PCIE設計的知識面比較廣,無論是在BIOS下還是系統下都顯得尤為重要。本章主要介紹

JAVAWEB學習筆記網上商城實戰5:後臺的功能模塊

form 所有 實現 返回 .com 訂單管理 模塊 集合 後臺 今日任務 完成後臺的功能模塊 1.1 網上商城的後臺功能的實現: 1.1.1 後臺的功能的需求: 1.1.1.1 分類管理: 【查詢所有分類】 * 在左側菜單

Android進階Junit單元測試環境搭建以及簡單有用

rar theme 選擇 http 技術分享 才幹 ack package family 單元測試的目的 首先。Junit單元測試要實現的功能,就是用來測試寫好的方法是否可以正確的運行,一般多用於對業務方法的測試。 單元測試的環境配置 1.在Andro

java規則引擎drools6.5.0版本中kmodule.xml解析

excel表格 兩個 狀態 excel表 自定義 roo 暫時 指定 一次 kmodule.xml文件存放在src/main/resources/META-INF/文件夾下。 1 <?xml version="1.0" encoding="UTF-8"?>

ADO.NET-中級百萬級數據的批量插入的兩種方法測試

arch pub 連接 code 新特性 try 簡單 nal ++ 在SQL Server 中插入一條數據使用Insert語句,但是如果想要批量插入一堆數據的話,循環使用Insert不僅效率低,而且會導致SQL一系統性能問題。下面介紹SQL Server支持的兩種批量

社交分享SDKShareSDK for Android 2.5.9已經公布

地址 nload trac p s unity3 share 2.x con clas ShareSDK for Android 2.5.9已經公布 版本號:V2.5.9 2015-3-19 1、升級Dropbox對API接口的調用。包含授權、

Selenium-WebDriver自學Selenium-IDE測試創建(三)

html 位置 當我 模塊 mage baidu 用例 問題 測試 =======================================================================================================

測試方法總結

測試方法測試方法從測試設計方法分類測試名稱測試內容黑盒測試把軟件系統當作一個黑箱,無法了解或使用系統內部結構及知識白盒測試設計者可以看到軟件系統的內部結構,並且使用軟件的內部知識來指導測試數據及方法的選擇灰盒測試介於白盒和黑盒之間總結:在實際工作中,對系統的了解越多越好,目前大多數的測試人員都是做黑盒測試,很