1. 程式人生 > >《uCOS51移植心得》---七年前之《快快樂樂跟我學51微控制器作業系統和IP棧》 第五部分.NE2000網絡卡晶片驅動程式

《uCOS51移植心得》---七年前之《快快樂樂跟我學51微控制器作業系統和IP棧》 第五部分.NE2000網絡卡晶片驅動程式

NE2000網絡卡晶片驅動程式
巨龍公司系統整合開發部 楊屹 [email protected]  2002/10/20

引言

    自從發表《uCOS51移植心得》以來,我收到了很多朋友們的來信,大家對公開源碼錶示鼓勵,謝謝大家的支援!很多人對於編寫自己的作業系統很感興趣,uCOS51是個不錯的選擇。它的優點是簡單易懂,學習成本低,有利於向32位CPU過渡。目前,嵌入式BBS上的熱點是:嵌入式實時多工作業系統、微控制器上網、32bitCPU(如ARM等)。其實通過uCOS51學習完全可以掌握這些熱門技術的精髓,而且學習成本低廉。為此我會陸續將我在研發過程中的經驗體會寫出來與大家交流,共同進步。
    我準備討論以下內容:uCOS51高效核心、OS人機介面SHELL的編寫、51機開發板的硬體設計、RTL8019AS網絡卡驅動程式、51TCP/IP協議棧設計、應用協議FTP、PPP、HTTP、SMTP、SNMP……在51上的實現技術、51OS任務劃分和應用程式例項、由51軟體系統向ARM的移植以及其他想到的題目。歡迎大家積極參與。
   
注:開發板原理圖、PCB圖、GAL燒錄檔案、晶片手冊、全部源程式可以來信索取,在整理好後會共享在網上。

討論3---- RTL8019AS網絡卡驅動程式

    我的SNMP網管板使用了RTL8019AS 10M ISA網絡卡晶片接入乙太網。選它的好處是:NE2000相容,軟體移植性好;介面簡單不用轉換晶片如PCI-ISA橋;價格便宜2.1$/片(我的購入價為22元RMB/片);頻寬充裕(針對51);較長一段時間內不會停產。8019有3種配置模式:跳線方式、即插即用P&P方式、序列Flash配置方式。為了節省成本,我去掉了9346而使用X5045作為閃盤儲存MAC地址和其他可配置資訊。P&P模式用在PC機中,這裡用不上。只剩下跳線配置模式可用,它的電路設計參考REALTEK提供的DEMO板圖紙。一天時間就可以完成,相對來說硬體設計比較簡單。
    與這部分硬體相對應的軟體是網絡卡驅動。所謂驅動程式是指一組子程式,它們遮蔽了底層硬體處理細節,同時向上層軟體提供硬體無關介面。驅動程式可以寫成子程式嵌入到應用程式裡(如DOS下的I/O埠操作和ISR),也可以放在動態連結庫裡,用到的時候再動態調入以便節省記憶體。在WIN98中,為了使V86、WIN16、WIN32三種模式的應用程式共存,提出了虛擬機器的概念,在CPU的配合下,系統工作在保護模式,OS接管了I/O、中斷、記憶體訪問,應用程式不能直接訪問硬體。這樣提高了系統可靠性和相容性,也帶來了軟體程式設計複雜的問題。任何網絡卡驅動都要按VXD或WDM模式編寫,對於硬體一側要處理虛擬機器操作、匯流排協議(如ISA、PCI)、即插即用、電源管理;上層軟體一側要實現NDIS規範。因此在WIN98下實現網絡卡驅動是一件相當複雜的事情。
    我這裡說的驅動程式特指真實模式下的一組硬體晶片驅動子程式。從程式設計師的角度看,8019工作流程非常簡單,驅動程式將要傳送的資料包按指定格式寫入晶片並啟動傳送命令,8019會自動把資料包轉換成物理幀格式在物理通道上傳輸。反之,8019收到物理訊號後將其還原成資料,按指定格式存放在晶片RAM中以便主機程式取用。簡言之就是8019完成資料包和電訊號之間的相互轉換:資料包<===>電訊號。乙太網協議由晶片硬體自動完成,對程式設計師透明。驅動程式有3種功能:晶片初始化、收包、發包。
    乙太網協議不止一種,我用的是802.3。它的幀結構如圖1所示。物理通道上的收發操作均使用這個幀格式。其中,前導序列、幀起始位、CRC校驗由硬體自動新增/刪除,與上層軟體無關。值得注意的是,收到的資料包格式並不是802.3幀的真子集,而是如圖2所示。明顯地,8019自動添加了“接收狀態、下一頁指標、乙太網幀長度(以位元組為單位)”三個資料成員(共4位元組)。這些資料成員的引入方便了驅動程式的設計,體現了軟硬體互相配合協同工作的設計思路。當然,傳送資料包的格式是802.3幀的真子集,如圖3所示。
   

(原檔名:未命名1.jpg)
   
    有了收發包的格式,如何傳送和接收資料包呢?如圖4所示,先將待發送的資料包存入晶片RAM,給出傳送緩衝區首地址和資料包長度(寫入TPSR、TBCR0,1),啟動傳送命令(CR=0x3E)即可實現8019傳送功能。8019會自動按乙太網協議完成傳送並將結果寫入狀態暫存器。如圖5所示,接收緩衝區構成一個迴圈FIFO佇列,PSTART、PSTOP兩個暫存器限定了迴圈佇列的開始和結束頁,CURR為寫入指標,受晶片控制,BNRY為讀出指標,由主機程式控制。根據CURR==BNRY+1?可以判斷是否收到新的資料包,新收到的資料包按圖2格式存於以CURR指出的地址為首址的RAM中。當CURR==BNRY時晶片停止接收資料包。如果做過FPGA設計,用過VHDL,可以想象到硬體晶片的工作原理。此處,設計2個8bit暫存器和一個2輸入比較器,當收到資料包時,接收狀態機根據當前狀態和比較器結果決定下一個狀態,如果CURR=BNRY,進入停收狀態;反之,CURR按模增1。8019資料手冊沒有給出硬體狀態機實現方法,說明也很簡略,往往要通過作實驗的方法推理出工作過程。比如,ISR暫存器不只和中斷有關,當接收緩衝溢位時,如果不清ISR(寫入FFH),晶片將一直停止接收。在流量較大時溢位經常發生,此時不清ISR,就會導致網絡卡晶片宕機。
   

(原檔名:未命名2.jpg)

    明白了傳送和接收資料包的原理,那麼資料包又是怎樣被主機寫入晶片RAM和從晶片RAM讀出的呢?如圖6所示,主機設定好遠端DMA開始地址(RSAR0,1)和遠端DMA資料位元組數(RBCR0,1),並在CR中設定讀/寫,就可以從遠端DMA口暫存器裡讀出晶片RAM裡的資料/把資料寫入晶片RAM。
    何謂本地/遠端DMA呢?如圖7所示,“遠端”指CPU介面側;“本地”指8019的硬體收發電路側。沒有更深的意思,與遠近無關,僅僅為了區分主機和晶片硬體兩個介面端。這裡的DMA與平時所說的DMA有點不同。RTL8019AS的local DMA操作是由控制器本身完成的,而其remote DMA並不是在無主處理器的參與下,資料能自動移到主處理器的記憶體中。remote DMA指主機CPU給出起址和長度就可以讀寫晶片RAM,每操作一次RAM地址自動加1。而普通RAM操作每次要先發地址再處理資料,速度較慢。
    在一些高檔通訊控制器上自帶有MAC控制器,工作原理與8019的差不多,比如:Motorola 68360/MPC860T內部的CPM帶有乙太網處理器,通過設定BD表,使軟體和硬體協同工作,它的緩衝區更大且可靈活配置。這些通訊控制器的設計,體現了軟硬體互相融合協同工作的趨勢:軟體硬化(VHDL),硬體軟化(DSP),希望大家關注!
   

(原檔名:未命名3.jpg)

    如圖7所示,8019乙太網控制器以儲存器(16K雙口RAM)為核心,本地和遠端控制器併發操作。這種體系結構滿足了資料頻寬的需要。8019擁有控制、狀態、資料暫存器,通過它們,51微控制器可以與8019通訊。由於51資源緊張,在實現TCPIP協議棧時不要進行記憶體塊拷貝,建議(1)使用全域性結構體變數,在記憶體中只儲存一個數據包拷貝,其他沒有來得及處理的包儲存在8019的16K RAM裡;(2)使用查詢方式而不用中斷;(3)客戶伺服器模型中伺服器工作於序列方式,併發模式不適合51微控制器。
    晶片內部地址空間的分配如圖8所示,其中0x00-0x0B(工作於8位DMA模式)用於存放本節點MAC地址,奇偶地址內容是重複放置的。如:MAC地址0000 1234 5678存放在0x00-0x0B中為000000001212343456567878,單地址和雙地址的內容是重複的.一般使用偶數地址的內容,這主要是為了同時適應8位和16位的dma。Prom內容是網絡卡在上電覆位的時候從93C46裡讀出來的。如果你沒有使用93C46,就不要使用Prom,那麼使用了93C46後如何獲得網絡卡的地址呢?有兩種方法,一是直接讀93C46,二是讀Prom。網絡卡MAC地址既不由93C46也不由Prom決定,而是由PAR0-PAR5暫存器決定。Prom只儲存上電時從9346中讀出的MAC地址(如果有93C46的話),僅此而矣。
   

(原檔名:未命名4.jpg)


(原檔名:未命名5.jpg)

    網絡卡MAC地址不是隨便定義的,它的組成結構如圖9所示。乙太網的地址為48位,由ieee統一分配給網絡卡製造商,每個網絡卡的地址都必須是全球唯一的。共6個位元組的長度。FF:FF:FF:FF:FF:FF為廣播地址,只能用在目的地址段,不能作為源地址段。目的地址為廣播地址的資料包,可以被一個區域網內的所有網絡卡接收到。合法的乙太網地址第32位組播標誌必須為0。例如:
X0:XX:XX:XX:XX:XX
X2:XX:XX:XX:XX:XX
X4:XX:XX:XX:XX:XX
X6:XX:XX:XX:XX:XX
X8:XX:XX:XX:XX:XX
XA:XX:XX:XX:XX:XX
XC:XX:XX:XX:XX:XX
XE:XX:XX:XX:XX:XX
為合法乙太網地址。上面的X代表0-F中的任一個。
地址
X1:XX:XX:XX:XX:XX
X3:XX:XX:XX:XX:XX
X5:XX:XX:XX:XX:XX
X7:XX:XX:XX:XX:XX
X9:XX:XX:XX:XX:XX
XB:XX:XX:XX:XX:XX
XD:XX:XX:XX:XX:XX
XF:XX:XX:XX:XX:XX
為組播地址,只能作為目的地址,不能作為源地址。組播地址可以被支援該組播地址的一組網絡卡接收到。組播地址主要用在視訊廣播,遠端喚醒(通過發一個特殊的資料包使網絡卡產生一箇中斷訊號,啟動電腦),遊戲(多個人在局域網裡聯機打遊戲)裡等。
以下是一些具體的組播地址:
地址範圍
01:00:5E:00:00:00---01:00:5E:7F:FF:FF 用於ip地址的組播,其他組播地址跟tcp/ip無關,不做介紹。
網絡卡可以接收以下3種地址的資料包:
第一種 目的地址跟自己的網絡卡地址是一樣的資料包;
第二種 目的地址為FF:FF:FF:FF:FF:FF廣播地址的資料包;
第三種 目的地址為跟自己的組播地址範圍相同的資料包。

在乙太網的應用當中,如果你希望你的資料包只發給一個網絡卡,目的地址用對方的網絡卡地址;
如果你想把資料包發給所有的網絡卡,目的地址用廣播地址;
如果你想把資料包發給一組網絡卡,目的地址用組播地址。

其他用到的暫存器:
CR---命令暫存器       TSR---傳送狀態暫存器        ISR---中斷狀態暫存器
RSR---接收狀態暫存器  RCR---接收配置暫存器        TCR---傳送配置暫存器
DCR---資料配置暫存器  IMR---中斷遮蔽暫存器        NCR---包傳送期間碰撞次數
FIFO---環回檢測後,檢視FIFO內容
CNTR0---幀同步錯總計數器
CNTR1---CRC錯總計數器
CNTR2---丟包總計數器
PAR0-5---本節點MAC地址
MAR0-7---多播地址匹配

建議:將圖形中暫存器名稱標註上頁號和地址偏移(如:BNRY 0頁0x03),打印出此圖,看圖程式設計,直觀且不容易出錯。

備註:收緩衝區、發緩衝區、資料儲存區在16K雙口RAM裡的安排由使用者自行決定,只要不引起衝突即可,以下源程式程式碼實現的只是其中的一種分配方案。

部分源程式清單:
struct ethernet{
    unsigned char status;          //接收狀態
    unsigned char nextpage;        //下一個頁
    unsigned int  length;          //乙太網長度,以位元組為單位
    unsigned int  destnodeid[3];   //目的網絡卡地址
    unsigned int  sourcenodeid[3]; //源網絡卡地址
    unsigned int  protocal;        //下一層協議
    unsigned char packet[1500];    //包的內容
};

void ne2000init()//ne2000網絡卡初始化
{
    rtl8019as_rst();

    reg00=0x21;   //選擇頁0的暫存器,網絡卡停止執行,因為還沒有初始化。
    delay_ms(10); //延時10毫秒,確保晶片進入停止模式
//使晶片處於mon和loopback模式,跟外部網路斷開
    page(0);
    reg0a=0x00;
    reg0b=0x00;
    reg0c=0xE0; //monitor mode (no packet receive)
    reg0d=0xE2; //loop back mode
//使用0x40-0x4B為網絡卡的傳送緩衝區,共12頁,剛好可以儲存2個最大的乙太網包。
//使用0x4c-0x7f為網絡卡的接收緩衝區,共52頁。
    reg01=0x4C; //Pstart  接收緩衝區範圍
    reg02=0x80; //Pstop
    reg03=0x4C; //BNRY

    reg04=0x40; //TPSR    傳送緩衝區範圍

    reg07=0xFF;/*清除所有中斷標誌位*/
    reg0f=0x00;//IMR disable all interrupt

    reg0e=0xC8; //DCR byte dma 8位dma方式

    page(1); //選擇頁1的暫存器
    reg07=0x4D; //CURR  
    reg08=0x00; //MAR0
    reg09=0x41; //MAR1
    reg0a=0x00; //MAR2
    reg0b=0x80; //MAR3
    reg0c=0x00; //MAR4
    reg0d=0x00; //MAR5
    reg0e=0x00; //MAR6
    reg0f=0x00; //MAR7       

    initNIC();        //初始化MAC地址和網路相關引數

//將網絡卡設定成正常的模式,跟外部網路連線
    page(0);
    reg0c=0xCC; //RCR
    reg0d=0xE0; //TCR
    reg00=0x22; //這時讓晶片開始工作?
    reg07=0xFF; //清除所有中斷標誌位
}

void send_packet(union netcard *txdnet,unsigned int length)//ne2000發包子程式
{//傳送一個數據包的命令,長度最小為60位元組,最大1514位元組需要傳送的資料包要先存放在txdnet緩衝區
    unsigned char i;
    unsigned int ii;

    page(0);
    if(length<60) length=60;
    for(i=0;i<3;i++)
        txdnet->etherframe.sourcenodeid=my_ethernet_address.words;
    txd_buffer_select=!txd_buffer_select;
    if(txd_buffer_select)
        reg09=0x40 ;          //txdwrite highaddress
    else
        reg09=0x46 ;          //txdwrite highaddress      
    reg08=0x00;                         //read page address low
    reg0b=length>>8;          //read count high
    reg0a=length&0xFF;        //read count low;
    reg00=0x12;                                //write dma, page0
   
    for(ii=4;ii<length+4;ii++)
        reg10=txdnet->bytes.bytebuf[ii];

    for(i=0;i<6;i++){                   //最多重發6次
        for(ii=0;ii<1000;ii++)          //檢查txp為是否為低
            if((reg00&0x04)==0) break;
         
        if((reg04&0x01)!=0) break;      //表示傳送成功        
       
        reg00=0x3E;
    }
       
    if(txd_buffer_select) reg04=0x40;   //txd packet start;
    else reg04=0x46;          //txd packet start;         

    reg06=length>>8;          //high byte counter
    reg05=length&0xFF;        //low byte counter

    reg00=0x3E;               //to sendpacket;  
}

bit recv_packet(union netcard *rxdnet)//ne2000收包子程式
{
    unsigned char i;
    unsigned int ii;
    unsigned char bnry,curr;
   
    page(0);
    reg07=0xFF;
    bnry=reg03;               //bnry page have read 讀頁指標
    page(1);
    curr=reg07;               //curr writepoint 8019寫頁指標
    page(0);
    if(curr==0)
        return 0;             //讀的過程出錯       
    bnry=bnry++;
    if(bnry>0x7F) bnry=0x4C;
    if(bnry!=curr){           //此時表示有新的資料包在緩衝區裡
        //讀取一包的前18個位元組:4位元組的8019頭部,6位元組目的地址,6位元組原地址,2位元組協議
        //在任何操作都最好返回page0
        page(0);
        reg09=bnry;           //read page address high
        reg08=0x00;           //read page address low
        reg0b=0x00;           //read count high
        reg0a=18;             //read count low;
        reg00=0x0A;           //read dma
        for(i=0;i<18;i++)
            rxdnet->bytes.bytebuf=reg10;
        i=rxdnet->bytes.bytebuf[3];     //將長度欄位的高低位元組掉轉
        rxdnet->bytes.bytebuf[3]=rxdnet->bytes.bytebuf[2];
        rxdnet->bytes.bytebuf[2]=i;                        
        rxdnet->etherframe.length=rxdnet->etherframe.length-4; //去掉4個位元組的CRC
        //表示讀入的資料包有效
        if(((rxdnet->bytes.bytebuf[0]&0x01)==0)||(rxdnet->bytes.bytebuf[1]>0x7F)||(rxdnet->bytes.bytebuf[1]<0x4C)||(rxdnet->bytes.bytebuf[2]>0x06)){
            //接收狀態錯誤,或者next_page_start錯誤或者長度錯誤,將丟棄所有資料包
            page(1);
            curr=reg07;       //page1
            page(0);          //切換回page0
            bnry=curr-1;
            if(bnry<0x4C) bnry=0x7F;
            reg03=bnry;       //write to bnry                  
            return 0;
        }
        else{//表示資料包是完好的.讀取剩下的資料
            if((rxdnet->etherframe.protocal==0x0800)||(rxdnet->etherframe.protocal==0x0806)){
            //協議為IP或ARP才接收        
                reg09=bnry;   //read page address high
                reg08=4;      //read page address low
                reg0b=rxdnet->etherframe.length>>8;     //read count high
                reg0a=rxdnet->etherframe.length&0xFF;   //read count low;
                reg00=0x0A;   //read dma
                for(ii=4;ii<rxdnet->etherframe.length+4;ii++)
                    rxdnet->bytes.bytebuf[ii]=reg10;
            }
            bnry=rxdnet->bytes.bytebuf[1]-1;//next page start-1
            if(bnry<0x4C) bnry=0x7F;
            reg03=bnry;       //write to bnry                           
            return 1;         //have new packet
        }
    }
    return 0;
}

參考文獻:
1。老古網站(www.laogu.com)
2。《微控制器與嵌入式系統應用》2001(7-12)合訂本第228頁《乙太網控制器的嵌入式裝置網路互連》湖南師範大學 萬靜華 丁亞軍
3。RTL8019AS資料手冊

相關推薦

uCOS51移植心得》---年前快快樂樂51微控制器作業系統IP部分.NE2000晶片驅動程式

NE2000網絡卡晶片驅動程式 巨龍公司系統整合開發部 楊屹 [email protected]  2002/10/20 引言     自從發表《uCOS51移植心得》以來,我收到了很多朋友們的來信,大家對公開源碼錶示鼓勵,謝謝大家的支援!很多人對於編寫自己的作業系統很感興趣,uCOS51是個不錯的

uCOS51移植心得》---年前快快樂樂51微控制器作業系統IP部分在OSStart前開中斷引起的莫名其妙錯誤

在OSStart前開中斷引起的莫名其妙錯誤                                         巨龍公司VPN部 楊屹 [email protected]   2004/03/09 2004/03/07網友方呂ladderls來電詢問以下問題: 你的ucos-ii在51的

uCOS51移植心得》---年前快快樂樂51微控制器作業系統IP部分ARP協議實現原理

ARP協議實現原理           作者<[email protected]> 2002/11/01     ARP是Address Resolution Protocol的縮寫。中文譯做“地址解析協議”,本質是完成網路地址到實體地址的對映。從概念上講就是找到一個對映方法f,使得“實

Centos&Redhat下bcm43142博通無線linux驅動

上次通過更換核心實現成功編譯驅動無線網絡卡,但是啟動到系統原核心下依然沒有bcm43142的驅動,遂準備在原核心下編譯驅動,記錄一下 ps:更推薦這種方法,避免因更換核心出現其他相容性問題 1.準備驅動包 hybrid-v35_64-nodebug-pcoem-6_30_223_271.tar.gz 點我下載

arm-linux 移植無線RT3070驅動

環境:編譯環境:Ubuntukylin 14.04交叉編譯器:arm-linux-gcc 4.4.1開發板核心:Linux2.6 & 3.0.1及以上無線模組:雷凌Ralink - rt3070一、核心版本:Linux 3.0及以上1、配置Linux核心1.1 進入

U-Boot移植DM9000(附:程式、原始碼、測試程式)

  U-Boot移植DM9000網絡卡 ——西伯利亞的風     根據書《嵌入式Linux應用開發完全手冊》移植網絡卡驅動,對於Jz2440開發板好像並不適用,Jz2440開發板使用的是DM9000網絡卡,已經不是書上講的CS8900網絡卡了。DM9000網絡卡與CS890

ASP.NET MVC:SportsStrore購物車

repos ras img sports collect dev PC RM VC 摘要: SportsStore應用程序進展很順利,但是我不能銷售產品直到設計了一個購物車。在這篇文章裏,我就將創建一個購物車。 在目錄下的每個產品旁邊添加一個添加到購物車按鈕。點擊這個按

Java 8 新特性 Stream 流()流與迭代器,流系列大結局

恭喜你們,馬上就要學完Java8 Stream流的一整系列了,其實我相信Stream流對很多使用Java的同學來說,都是一個知識盲點,因為這個原因,我才這麼細緻地講解Stream流的各個知識點,通過這一整個系列,我相信只要認真看了的同學,都已掌握的差不多了,就差實戰了。

移植u-boot-2015.07-rc3修改程式碼支援DM9000

目前的u-boot啟動後有如下資訊: Net:   CS8900-0 Error: CS8900-0address not set. 板子上的是DM9000不是CS8900,網絡卡模組肯定是錯誤的嘛。看到這裡,你應該有了熟悉的思路,grep "Net:" * -nR查詢網絡

ASP.NET MVC四:使用Razor

ima pre 技術分享 C# 圖模型 med 執行 sys fonts 摘要: 視圖引擎處理ASP.NET內容,並查找指令,典型情況是向瀏覽器輸出插入動態內容。MVC框架視圖引擎的名字是Razor。 在本文中,我將帶領讀者快速認識Razor,以後你們看到他們的時候能夠

ASP.NET MVC八:SportsStrore移動設備

ima 支持 web瀏覽器 css 客戶端瀏覽器 nts oat 重新 menu 摘要: 現在的web程序開發避免不了智能手機和平板電腦上的使用,如果你希望發布你的應用程序給更廣大客戶使用的話,你將要擁抱可移動web瀏覽器的世界。向移動設備用戶發布一個好的使用體驗是很困難

Java程式設計師從笨鳥到菜鳥(八十jquery(一)愛初體驗jquery

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Flask()-flask工作原理

在對Flask程式碼基本結構有一定了解之後,為了以後學習的順利,我們需要進一步瞭解Flask工作的基本原理 *本文轉載自孫華強部落格:*https://blog.csdn.net/sunhuaqiang1/article/details/72808619 所有的 Python

oracle18c】天:Multitenant Architecture多租戶框架:2.2 Overview of Commonality in the CDB(藍色感悟)

在CDB中,每個使用者、角色或物件都是通用的或本地的。類似地,通常或區域性授予特權. This section contains the following topics: About Commonality in a CDB A common phenomenon defined i

初識Linux 驅動移植 dm9621驅動移植

概述 將kernel移植到開發板並能正常載入和啟動核心後,發現網絡卡並沒有工作,因此將網絡卡作為第一個移植的實踐。這篇文章用於記錄移植dm9621網絡卡過程中遇到的問題以及如何定位問題並嘗試解決。 配置核心 在找到dm9621網絡卡驅動的原始碼後,需要將其新增

springboot(二十)springboot-過濾器攔截不需要走過濾器的連結使用方法

1.建立專案 springboot怎麼建立不多說了,前面部落格已經有講解,下面是我們建立好的專案目錄。 2.編寫程式碼 過濾器可以指定我們排除的引數exclusions,我們把需要隔離的url統一封裝在這裡,然後在webconfig配置filterReg.ad

Java 8 新特性 Stream 流(四)並行流

隨著對流API認識的慢慢深入,本章我們要討論的知識點是流API裡面的並行流了。 在開始討論並行流之前,我先引發一下大家的思考,就你看到這篇文章的時間,你們是不是經常聽到,Intel i7 CPU什麼8核16執行緒,什麼Android手機8核4GB這種訊息,既然我們是處於

Java 8 新特性 Stream 流(三)縮減操作

和前面兩篇文章一起服用,效果會更佳。通過對流API的基礎體驗Demo和關鍵知識點的講解,相信大家對流API都有一定的認識了,但是流API強大的功能,可不僅僅像前面兩篇文章中說的那樣簡單,大家應該注意到,在第二篇中,我對Stream介面進行介紹的時候,並沒有把他的全部方法都

Java 8 新特性 Stream 流(二)關鍵知識點

我們的第一篇文章,主要是通過一個Demo,讓大家體驗了一下使用流API的那種酣暢淋漓的感覺。如果你沒有實踐,我還是再次呼籲你動手敲一敲,自己實實在跑一遍上一篇的Demo。 相信你的感受和理解也會隨之加深的。繼續探索流API的高階功能之前,我們先從介面級別全面瞭解一下流A

Java 8 新特性 Stream 流基礎體驗

Java8新增的功能中,要數lambda表示式和流API最為重要了.這篇文章主要介紹流API的基礎,也是流API系列的第一篇文章,話不多說,直奔主題. 什麼是流API? 它能做一些什麼? 我們應該知道(絕對知道~)API是一個程式向使用者提供的一些方法,通過這些方法就