break

小說:刷機包推廣作者:戲北戲更新時間:2019-03-14字數:19375

break


第7章?????? ?RL-TCPnet網絡協議棧移植(裸機)

本章教程為大家講解RL-TCPnet網絡協議棧的裸機移植方式,學習了上個章節講解的底層驅動接口函數之后,移植就比較容易了,主要是添加庫文件、配置文件和驅動文件即可。

本章教程含STM32F407開發板和STM32F429開發板的移植。

7.1 ?移植前準備工作說明

7.2 ?STM32F407移植RL-TCPnet協議棧

7.3 ?STM32F429移植RL-TCPnet協議棧

7.4? 總結

?

?

7.1? 移植前準備工作說明

1、學習本章節前,務必要優先學習第6章的底層驅動講解。

2、RL-TCPnet只有庫,沒有源碼。庫分為兩個版本,一個用于調試的版本TCPD_CM3.lib和一個正式版本TCP_CM3.lib,當前的例子統一使用調試版本。另外注意,雖然是CM3版本的,但可同時用于CM3和CM4內核的MCU,因為官方沒有專門的CM4內核庫。

3、測試時,請將網線接到路由器或者交換機上面測試,因為已經使能了DHCP,可以自動獲取IP地址。

? ? ? 而且使能了NetBIOS局域網域名,用戶只需在電腦端ping armfly,就可以獲得板子的IP地址。

4、如果要使用固定IP進行測試,請看第57章。

5、網口使用的是DM9161/9162(緊挨著9幀串口座的網口),而不是DM9000。

6、找一個簡單的工程,最好是跑馬燈之類的,越簡單越好,我們就在這個簡單的工程上面移植即可。

?

7.2? ?STM32F407移植RL-TCPnet協議棧

7.2.1???? ?RL-TCPnet網絡協議棧移植

首先準備好一個簡單的裸機工程模板,工程模板的制作就不做講解了,這里的重點是教大家移植RL-TCPnet協議棧。準備好的工程模板如下圖所示(大家也可以制作其它任意的工程模板,不限制):

?

準備好工程模板后,就可以開始移植了。首先要做的就是將所有需要的文件放到工程模板里面。下面分三步跟大家進行說明,當然,不限制必須使用下面的方法添加源碼到工程,只要將需要的文件添加到工程模板即可。

第1步:將我們裸機模板中制作好的RL-ARM文件夾復制粘貼到大家準備好的工程模板中。

?

RL-ARM文件夾中有如下七個文件夾:

?

Config文件夾用于存放RTX及其中間件的配置文件。

Driver文件夾用于存放中間件的驅動文件,也就是底層移植文件。

RL-CAN文件夾用于存放CAN總線的源碼文件。

RL-FlashFS文件夾用于存放文件系統RL-FlashFS的庫文件。

RL-RTX文件夾用于存放RTX的源碼文件。

RL-TCPnet文件夾用于存放網絡協議棧RL-TCPnet的庫文件。

RL-USB文件夾用于存放USB協議棧RL-USB的庫文件。

也許有用戶會問:我們不是僅僅需要移植RL-TCPnet的相關文件就行了嗎,為什么把RTX及其所有中間件都添加進來了?這樣做的目的是為了以后升級的方便,如果需要添加USB、文件系統、CAN等組件,直接添加到工程即可。

這些文件全部來自MDK4.74的安裝目錄,庫文件位于路徑:C:Keil_v474ARMRV31下,而驅動和配置文件位于路徑:C:Keil_v474ARMRL下。

第2步:添加RL-TCPnet的庫文件、配置文件和驅動文件到工程。

添加完畢后的效果如下:

?

Net_Config.c和NET_Debug.c在RL-ARM文件夾的Config文件里面。

TCPD_CM3.lib在RL-ARM文件夾的RL-TCPnet文件里面。

ETH_STM32F4xx.c和ETH_STM32F4xx.h在RL-ARM文件夾的Driver文件里面。

第3步:也是最后一步,添加相應的頭文件路徑。

在原來工程模板的基礎上面新添加的三個路徑:

?

至此,RL-TCPnet的移植工作就完成了,剩下就是系統配置和應用了。

?

7.2.2???? RL-TCPnet配置說明(Net_Config.c)

RL-TCPnet的配置工作是通過配置文件Net_Config.c實現。在MDK工程中打開文件Net_Config.c,可以看到下圖所示的工程配置向導:

?

RL-TCPnet要配置的選項非常多,我們這里把幾個主要的配置選項簡單介紹下。

?

System Definitions

(1)Local Host Name

局域網域名。

這里起名為armfly,使用局域網域名限制為15個字符。

(2)Memory Pool size

參數范圍1536-262144字節。

內存池大小配置,單位字節。另外注意一點,配置向導這里顯示的單位是字節,如果看原始定義,MDK會做一個自動的4字節倍數轉換,比如我們這里配置的是8192字節,那么原始定義是#define MEM_SIZE? 2048,也就是8192/4 = 2048。

(3)Tick Timer interval

可取10,20,25,40,50,100,200,單位ms。

系統滴答時鐘間隔,也就是網絡協議棧的系統時間基準,默認情況下,取值100ms。

?

Ethernet Network Interface

以太網接口配置,勾選了此選項就可以配置了,如果沒有使能DHCP的話,將使用這里配置的固定IP。

(1)MAC Address

局域網內可以隨意配置,只要不跟局域網內其它設備的MAC地址沖突即可。

(2)IP Address

IP地址。

(3)Subnet mask

子網掩碼。

(4)Default Gateway

默認網關。

?

Ethernet Network Interface

以太網接口配置,這個配置里面還有如下兩項比較重要的配置需要說明。

(1)NetBIOS Name Service

NetBIOS局域網域名服務,這里打上對勾就使能了。這樣我們就可以通過前面配置的Local Host Name局域網域名進行訪問,而不需要通過IP地址訪問了。

(2)Dynaminc Host Configuration

即DHCP,這里打上對勾就使能了。使能了DHCP后,RL-TCPnet就可以從外接的路由器上獲得動態IP地址。

?

UDP Sockets

UDP Sockets配置,打上對勾就使能了此項功能

(1)Number of UDP Sockets

用于配置可創建的UDP Sockets數量。

范圍1 – 20。

?

TCP Sockets

TCP Sockets配置,打上對勾就使能了此項功能

(1)Number of TCP Sockets

用于配置可創建的TCP Sockets數量。

(2)Number of Retries

范圍0-20。

用于配置重試次數,TCP數據傳輸時,如果在設置的重試時間內得不到應答,算一次重試失敗,這里就是配置的最大重試次數。

(3)Retry Timeout in seconds

范圍1-10,單位秒。

重試時間。如果發送的數據在重試時間內得不到應答,將重新發送數據。

(4)Default Connect Timeout in seconds

范圍1-600,單位秒。

用于配置默認的保持連接時間,即我們常說的Keep Alive時間,如果時間到了將斷開連接。常用于HTTP Server,Telnet Server等。

(5)Maximum Segment Size

范圍536-1460,單位字節。

MSS定義了TCP數據包能夠傳輸的最大數據分段。

(6)Receive Window Size

范圍536-65535,單位字節。

TCP接收窗口大小。

?

7.2.3???? RL-TCPnet調試說明(Net_Debug.c)

重要說明,RL-TCPnet的調試是通過串口打印出來的

RL-TCPnet的調試功能是通過配置文件Net_Debug.c實現。在MDK工程中打開文件Net_Debug.c,可以看到下圖所示的工程配置向導:

?

Print Time Stamp

勾選了此選項的話,打印消息時,前面會附帶時間信息。

其它所有的選項

默認情況下,所有的調試選項都是關閉的。每個選項有三個調試級別可選擇,這里我們以Memory Management Debug為例,點擊下拉列表,可以看到里面有Off,Errors only和Full debug三個調試級別可供選擇,每個調試選項里面都是這三個級別。

?

Off:表示關閉此選項的調試功能。

Errors only:表示僅在此選項出錯時,將其錯誤打印出來。

Full debug:表示此選項的全功能調試。

關于調試功能的使用會在第11章詳細為大家講解,移植階段將其全部關閉即可。

?

7.2.4???? RL-TCPnet應用實例

為了驗證移植的RL-TCPnet是否可以使用,需要添加測試代碼。下面是編寫的測試代碼,配套的測試例子完整版是:V5-1000_RL-TCPnet實驗_工程移植模板(裸機)。

?

主函數初始化

在main.c文件實現:

/*

*********************************************************************************************************

*    函 數 名: main

*    功能說明: 標準c程序入口。

*    形    參: 無

*    返 回 值: 無

*********************************************************************************************************

*/

int main (void)

{   

     /* 初始化外設 */

     bsp_Init();

 

     /* 進入RL-TCPnet測試函數 */

     TCPnetTest();

}

硬件外設初始化

硬件外設的初始化是在 bsp.c 文件實現:

/*

*********************************************************************************************************

*    函 數 名: bsp_Init

*    功能說明: 初始化所有的硬件設備。該函數配置CPU寄存器和外設的寄存器并初始化一些全局變量。只需要調用一次

*    形    參:無

*    返 回 值: 無

*********************************************************************************************************

*/

void bsp_Init(void)

{

     /*

         由于ST固件庫的啟動文件已經執行了CPU系統時鐘的初始化,所以不必再次重復配置系統時鐘。

         啟動文件配置了CPU主時鐘頻率、內部Flash訪問速度和可選的外部SRAM FSMC初始化。

 

         系統時鐘缺省配置為168MHz,如果需要更改,可以修改 system_stm32f4xx.c 文件

     */

     /* 優先級分組設置為4,可配置0-15級搶占式優先級,0級子優先級,即不存在子優先級。*/

     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);

 

     bsp_InitUart();    /* 初始化串口 */

     bsp_InitKey();     /* 初始化按鍵變量(必須在 bsp_InitTimer() 之前調用) */

     bsp_InitLed();     /* 初始LED指示燈端口 */

     bsp_InitTimer();   /* 初始化滴答定時器 */

}

RL-TCPnet功能測試

這里專門創建了一個app_tcpnet_lib.c文件用于RL-TCPnet功能的測試,主要功能是創建了一個TCP Server。

/*

*********************************************************************************************************

*                                      用于本文件的調試

*********************************************************************************************************

*/

#if 1

     #define printf_debug printf

#else

     #define printf_debug(...)

#endif

 

 

/*

*********************************************************************************************************

*                                      用于本文件的調試

*********************************************************************************************************

*/

#define PORT_NUM       1001    /* TCP服務器監聽端口號 */

 

 

/*

*********************************************************************************************************

*                                         變量

*********************************************************************************************************

*/

uint8_t socket_tcp;

 

 

/*

*********************************************************************************************************

*    函 數 名: tcp_callback

*    功能說明: TCP Socket的回調函數

*    形    參: soc  TCP Socket類型

*             evt  事件類型

*             ptr  事件類型是TCP_EVT_DATA,ptr指向的緩沖區記錄著接收到的TCP數據,其余事件記錄IP地址

*             par  事件類型是TCP_EVT_DATA,記錄接收到的數據個數,其余事件記錄端口號

*    返 回 值:

*********************************************************************************************************

*/

U16 tcp_callback (U8 soc, U8 evt, U8 *ptr, U16 par)

{

     char buf[50];

     uint16_t i;

    

     /* 確保是socket_tcp的回調 */

     if (soc != socket_tcp)

     {

         return (0);

     }

 

     switch (evt)

     {

         /*

              遠程客戶端連接消息

             1、數組ptr存儲遠程設備的IP地址,par中存儲端口號。

             2、返回數值1允許連接,返回數值0禁止連接。

         */

         case TCP_EVT_CONREQ:

              sprintf(buf, "遠程客戶端請求連接IP: %d.%d.%d.%d", ptr[0], ptr[1], ptr[2], ptr[3]);

              printf_debug("IP:%s  port:%d
", buf, par);

              return (1);

        

         /* 連接終止 */

         case TCP_EVT_ABORT:

              break;

        

         /* Socket遠程連接已經建立 */

         case TCP_EVT_CONNECT:

              printf_debug("Socket is connected to remote peer
");

              break;

        

         /* 連接斷開 */

         case TCP_EVT_CLOSE:

              printf_debug("Connection has been closed
");

              break;

        

         /* 發送的數據收到遠程設備應答 */

         case TCP_EVT_ACK:

              break;

        

          /* 接收到TCP數據幀,ptr指向數據地址,par記錄數據長度,單位字節 */

         case TCP_EVT_DATA:

              printf_debug("Data length = %d
", par);

              for(i = 0; i < par; i++)

              {

                   printf_debug("ptr[%d] = %d
", i, ptr[i]);

              }

              break;

     }

    

     return (0);

}

 

/*

*********************************************************************************************************

*    函 數 名: TCP_StatusCheck

*    功能說明: 檢測TCP的連接狀態,主要用于網線插拔的判斷

*    形    參: 無

*    返 回 值: __TRUE  連接

*             __FALSE 斷開

*********************************************************************************************************

*/

uint8_t TCP_StatusCheck(void)

{

     uint8_t res;

    

     switch (tcp_get_state(socket_tcp))

     {

         case TCP_STATE_FREE:

         case TCP_STATE_CLOSED:

              res = tcp_listen (socket_tcp, PORT_NUM);

              printf_debug("tcp listen res = %d
", res);

              break;

        

         case TCP_STATE_LISTEN:

              break;

        

         case TCP_STATE_CONNECT:

              return (__TRUE);

             

         default: 

              break;

     }

    

     return (__FALSE);

}

 

/*

*********************************************************************************************************

*    函 數 名: tcpnet_poll

*    功能說明: 使用TCPnet必須要一直調用的函數

*    形    參: 無

*    返 回 值: 無

*********************************************************************************************************

*/

void tcpnet_poll(void)

{

     if(bsp_CheckTimer(0))

     {

         /* 此函數堅決不可以放在中斷里面跑 */

         timer_tick ();

     }

    

     main_TcpNet ();

}

 

/*

*********************************************************************************************************

*    函 數 名: TCPnetTest

*    功能說明: TCPnet應用

*    形    參: 無

*    返 回 值: 無

*********************************************************************************************************

*/

void TCPnetTest(void)

{ 

     int32_t ulCount;

     uint8_t *sendbuf;

     uint8_t tcp_status;

     uint16_t maxlen;

     uint8_t res;

     uint8_t ucKeyCode;

    

    

     /* 初始化網絡協議棧 */

     init_TcpNet ();

 

     /*

        創建TCP Socket并創建監聽,客戶端連接服務器后,10秒內無數據通信將斷開連接。

        但是由于這里使能了TCP_TYPE_KEEP_ALIVE,會一直保持連接,不受10秒的時間限制。

     */

    socket_tcp = tcp_get_socket (TCP_TYPE_SERVER | TCP_TYPE_KEEP_ALIVE, 0, 10, tcp_callback);

     if(socket_tcp != 0)

     {

          res = tcp_listen (socket_tcp, PORT_NUM);

         printf_debug("tcp listen res = %d
", res);

     }

 

     /* 創建一個周期是100ms的軟定時器 */

    bsp_StartAutoTimer(0, 100);

    

     while (1)

     {

         /* TCP輪詢 */

         tcpnet_poll();

        

          /* 用于網線插拔的處理 */

         tcp_status = TCP_StatusCheck();

        

          /* 按鍵消息的處理 */

         ucKeyCode = bsp_GetKey();

         if ((ucKeyCode != KEY_NONE)&&(tcp_status == __TRUE))

         {

              switch (ucKeyCode)

              {

                   /* K1鍵按下,給遠程TCP客戶端發送8字節數據 */

                   case KEY_DOWN_K1:            

                       printf_debug("tcp_get_state(socket_tcp) = %d
", tcp_get_state(socket_tcp));

                       ulCount = 8;

                       do

                       {

                            tcpnet_poll();

                            if (tcp_check_send (socket_tcp) == __TRUE)

                            {

                                 maxlen = tcp_max_dsize (socket_tcp);

                                 ulCount -= maxlen;

                                

                                 if(ulCount < 0)

                                 {

                                     /* 這么計算沒問題的 */

                                     maxlen = ulCount + maxlen;

                                 }

                                

                                 sendbuf = tcp_get_buf(maxlen);

                                 sendbuf[0] = "1";

                                 sendbuf[1] = "2";

                                 sendbuf[2] = "3";

                                 sendbuf[3] = "4";

                                 sendbuf[4] = "5";

                                 sendbuf[5] = "6";

                                 sendbuf[6] = "7";

                                 sendbuf[7] = "8";

                                

                                 /* 測試發現只能使用獲取的內存 */

                                 tcp_send (socket_tcp, sendbuf, maxlen);

                            }

                           

                       }while(ulCount > 0);

                       break;

 

                   /* K2鍵按下,給遠程TCP客戶端發送1024字節的數據 */

                   case KEY_DOWN_K2:     

                       printf_debug("tcp_get_state(socket_tcp) = %d
", tcp_get_state(socket_tcp));

                       ulCount = 1024;

                       do

                       {

                            tcpnet_poll();

                            if (tcp_check_send (socket_tcp) == __TRUE)

                            {

                                 maxlen = tcp_max_dsize (socket_tcp);

                                 ulCount -= maxlen;

                                

                                 if(ulCount < 0)

                                 {

                                     /* 這么計算沒問題的 */

                                     maxlen = ulCount + maxlen;

                                 }

                                

                                 /* 這里僅初始化了每次所發送數據包的前8個字節 */

                                 sendbuf = tcp_get_buf(maxlen);

                                 sendbuf[0] = "a";

                                 sendbuf[1] = "b";

                                 sendbuf[2] = "c";

                                 sendbuf[3] = "d";

                                 sendbuf[4] = "e";

                                 sendbuf[5] = "f";

                                 sendbuf[6] = "g";

                                 sendbuf[7] = "h";

                                

                                 /* 測試發現只能使用獲取的內存 */

                                 tcp_send (socket_tcp, sendbuf, maxlen);

                            }

                           

                       }while(ulCount > 0);                     

                       break;

                      

                   /* K3鍵按下,給遠程TCP客戶端發送5MB數據 */

                   case KEY_DOWN_K3:            

                       printf_debug("tcp_get_state(socket_tcp) = %d
", tcp_get_state(socket_tcp));

                       ulCount = 5*1024*1024;

                       do

                       {

                            tcpnet_poll();

                            if (tcp_check_send (socket_tcp) == __TRUE)

                            {

                                 maxlen = tcp_max_dsize (socket_tcp);

                                 ulCount -= maxlen;

                                

                                 if(ulCount < 0)

                                 {

                                     /* 這么計算沒問題的 */

                                     maxlen = ulCount + maxlen;

                                 }

                                

                                 /* 這里僅初始化了每次所發送數據包的前8個字節 */

                                 sendbuf = tcp_get_buf(maxlen);

                                 sendbuf[0] = "a";

                                 sendbuf[1] = "b";

                                 sendbuf[2] = "c";

                                 sendbuf[3] = "d";

                                 sendbuf[4] = "e";

                                 sendbuf[5] = "f";

                                 sendbuf[6] = "g";

                                 sendbuf[7] = "h";

                                

                                 /* 測試發現只能使用獲取的內存 */

                                 tcp_send (socket_tcp, sendbuf, maxlen);

                            }

                           

                       }while(ulCount > 0);

                       break;

                  

                    /* 其他的鍵值不處理 */

                   default:                    

                       break;

              }

         }

     }

}

至此,裸機方式移植的RL-TCPnet就可以運行了。

?

7.2.5???? RL-TCPnet實驗測試和實驗現象

測試前,先將開發板上面的DM9161/9162網口通過網線接到路由器或者交換機上面。

RJ45網絡變壓器插座上綠燈和黃燈現象

各種網卡、交換機等網絡設備都不一樣,一般來講:綠燈分為亮或不亮(代表網絡速度),黃燈分為閃爍或不閃爍(代表是否有數據收發)。

綠燈:長亮代表100M; 不亮代表10M。

黃燈:長亮代表無數據收發; 閃爍代表有數據收發。

也有些千兆網卡的燈以顏色區分,不亮代表10M / 綠色代表100M / 黃色代表1000M?,F在10M的網絡基本看不到了,如果一個燈長亮,基本可以說明100M網絡或更高,而另一個燈時而閃爍,那代表有數據收發,具體要看網絡設備了。甚至有些低等網卡如TP-LINK,只有一個燈,亮代表連通,閃爍代表數據收發。

對于STM32F407開發板上面的RJ45網絡變壓器插座上面的燈而言,綠燈代表數據收發,長亮的話表示無數據收發,閃爍代表有數據收發。黃燈代表網絡速度,長亮代表100M,不亮代表10M。

底層驅動執行情況

為了驗證RL-TCPnet底層驅動接口函數是否有問題,專門在ETH_STM32F4xx.c文件中配置了串口調試打印函數:

/*

*********************************************************************************************************

*                                      用于本文件的調試

*********************************************************************************************************

*/

#if 1

     #define printf_eth printf

#else

     #define printf_eth(...)

#endif

如果底層驅動正常執行了,打印的效果如下:

?

ping是否正確

ping命令的主要作用是通過發送數據包并接收應答信息來檢測兩臺設備之間的網絡是否連通。ping命令成功說明當前主機與目的主機之間存在連通的路徑。如果不成功,需要查看網線是否連通、網卡設置是否正確、IP地址是否可用等。測試方法如下:

(1)WIN+R組合鍵打開“運行”窗口,輸入cmd。

?

(2)彈出的命令窗口中,輸入ping armfly,因為在前面的配置中我們使能了NetBIOS局域網域名,并將名字設置為armfly,而且使能了DHCP,通過ping命令還可以獲得板子自動獲取的IP地址。

?

(3)輸入ping armfly后,回車。

?

收發相同,沒有數據丟失,說明ping命令也是成功的。

電腦端創建一個TCP Client與板子上面的TCP Server通信

具體測試方法,查看第13章的13.6小節即可,因為配套例子實現的功能是一樣的。

?

7.3? STM32F429移植RL-TCPnet協議棧

7.3.1???? RL-TCPnet網絡協議棧移植

首先準備好一個簡單的裸機工程模板,工程模板的制作就不做講解了,這里的重點是教大家移植RL-TCPnet協議棧。準備好的工程模板如下圖所示(大家也可以制作其它任意的工程模板,不限制):

?

準備好工程模板后,就可以開始移植了。首先要做的就是將所有需要的文件放到工程模板里面。下面分三步跟大家進行說明,當然,不限制必須使用下面的方法添加源碼到工程,只要將需要的文件添加到工程模板即可。

第1步:將我們裸機模板中制作好的RL-ARM文件夾復制粘貼到大家準備好的工程模板中。

?

RL-ARM文件夾中有如下七個文件夾:

?

Config文件夾用于存放RTX及其中間件的配置文件。

Driver文件夾用于存放中間件的驅動文件,也就是底層移植文件。

RL-CAN文件夾用于存放CAN總線的源碼文件。

RL-FlashFS文件夾用于存放文件系統RL-FlashFS的庫文件。

RL-RTX文件夾用于存放RTX的源碼文件。

RL-TCPnet文件夾用于存放網絡協議棧RL-TCPnet的庫文件。

RL-USB文件夾用于存放USB協議棧RL-USB的庫文件。

也許有用戶會問:我們不是僅僅需要移植RL-TCPnet的相關文件就行了嗎,為什么把RTX及其所有中間件都添加進來了?這樣做的目的是為了以后升級的方便,如果需要添加USB、文件系統、CAN等組件,直接添加到工程即可。

這些文件全部來自MDK4.74的安裝目錄,庫文件位于路徑:C:Keil_v474ARMRV31下,而驅動和配置文件位于路徑:C:Keil_v474ARMRL下。

第2步:添加RL-TCPnet的庫文件、配置文件和驅動文件到工程。

添加完畢后的效果如下:

?

Net_Config.c和NET_Debug.c在RL-ARM文件夾的Config文件里面。

TCPD_CM3.lib在RL-ARM文件夾的RL-TCPnet文件里面。

ETH_STM32F4xx.c和ETH_STM32F4xx.h在RL-ARM文件夾的Driver文件里面。

第3步:也是最后一步,添加相應的頭文件路徑。

在原來工程模板的基礎上面新添加的三個路徑:

?

至此,RL-TCPnet的移植工作就完成了,剩下就是系統配置和應用了。

?

7.3.2???? RL-TCPnet配置說明(Net_Config.c)

RL-TCPnet的配置工作是通過配置文件Net_Config.c實現。在MDK工程中打開文件Net_Config.c,可以看到下圖所示的工程配置向導:

?

RL-TCPnet要配置的選項非常多,我們這里把幾個主要的配置選項簡單介紹下。

?

System Definitions

(1)Local Host Name

局域網域名。

這里起名為armfly,使用局域網域名限制為15個字符。

(2)Memory Pool size

參數范圍1536-262144字節。

內存池大小配置,單位字節。另外注意一點,配置向導這里顯示的單位是字節,如果看原始定義,MDK會做一個自動的4字節倍數轉換,比如我們這里配置的是8192字節,那么原始定義是#define MEM_SIZE? 2048,也就是8192/4 = 2048。

(3)Tick Timer interval

可取10,20,25,40,50,100,200,單位ms。

系統滴答時鐘間隔,也就是網絡協議棧的系統時間基準,默認情況下,取值100ms。

?

Ethernet Network Interface

以太網接口配置,勾選了此選項就可以配置了,如果沒有使能DHCP的話,將使用這里配置的固定IP。

(1)MAC Address

局域網內可以隨意配置,只要不跟局域網內其它設備的MAC地址沖突即可。

(2)IP Address

IP地址。

(3)Subnet mask

子網掩碼。

(4)Default Gateway

默認網關。

?

Ethernet Network Interface

以太網接口配置,這個配置里面還有如下兩項比較重要的配置需要說明。

(1)NetBIOS Name Service

NetBIOS局域網域名服務,這里打上對勾就使能了。這樣我們就可以通過前面配置的Local Host Name局域網域名進行訪問,而不需要通過IP地址訪問了。

(2)Dynaminc Host Configuration

即DHCP,這里打上對勾就使能了。使能了DHCP后,RL-TCPnet就可以從外接的路由器上獲得動態IP地址。

?

UDP Sockets

UDP Sockets配置,打上對勾就使能了此項功能

(1)Number of UDP Sockets

用于配置可創建的UDP Sockets數量。

范圍1 – 20。

?

TCP Sockets

TCP Sockets配置,打上對勾就使能了此項功能

(1)Number of TCP Sockets

用于配置可創建的TCP Sockets數量。

(2)Number of Retries

范圍0-20。

用于配置重試次數,TCP數據傳輸時,如果在設置的重試時間內得不到應答,算一次重試失敗,這里就是配置的最大重試次數。

(3)Retry Timeout in seconds

范圍1-10,單位秒。

重試時間。如果發送的數據在重試時間內得不到應答,將重新發送數據。

(4)Default Connect Timeout in seconds

范圍1-600,單位秒。

用于配置默認的保持連接時間,即我們常說的Keep Alive時間,如果時間到了將斷開連接。常用于HTTP Server,Telnet Server等。

(5)Maximum Segment Size

范圍536-1460,單位字節。

MSS定義了TCP數據包能夠傳輸的最大數據分段。

(6)Receive Window Size

范圍536-65535,單位字節。

TCP接收窗口大小。

?

7.3.3???? RL-TCPnet調試說明(Net_Debug.c)

重要說明,RL-TCPnet的調試是通過串口打印出來的

RL-TCPnet的調試功能是通過配置文件Net_Debug.c實現。在MDK工程中打開文件Net_Debug.c,可以看到下圖所示的工程配置向導:

?

Print Time Stamp

勾選了此選項的話,打印消息時,前面會附帶時間信息。

其它所有的選項

默認情況下,所有的調試選項都是關閉的,每個選項有三個調試級別可選擇,這里我們以Memory Management Debug為例,點擊下拉列表,可以看到里面有Off,Errors only和Full debug三個調試級別可供選擇,每個調試選項里面都是這三個級別。

?

Off:表示關閉此選項的調試功能。

Errors only:表示僅在此選項出錯時,將其錯誤打印出來。

Full debug:表示此選項的全功能調試。

關于調試功能的使用會在第11章詳細為大家講解,移植階段將其全部關閉即可。

?

7.3.4???? RL-TCPnet應用實例

為了驗證移植的RL-TCPnet是否可以使用,需要添加測試代碼。下面是編寫的測試代碼,配套的測試例子完整版是:V6-1000_RL-TCPnet實驗_工程移植模板(裸機)。

?

主函數初

當前文章:http://www.hfcxdn.com/html_14848.html

發布時間:2019-03-14 00:57:44

微店賣了東西錢為什么不是立馬到賬 網吧寬帶一個月多少錢 搬磚最新線報 戀愛兼職中漫畫免費 每天賺30到50錢的軟件 發文章賺錢的平臺 如何在網上兼職賺錢 微店傭金一般多少合適 淘寶客高傭金軟件 免費做優惠券代理

有網賺倍投嗎 蘇寧易購推薦傭金 2018問道大號帶小號修山給錢嗎 養微信號靠什么賺錢 打字群的宣傳語 最新兼職外宣空間說說 餓了么商家簽,獨家的費率是多少 西安做哪個代駕好 昵圖網上傳的圖片 怎么賺錢 怎么在騰訊視頻里賺錢 適合帶孩子的生意 滴滴快車專車怎么賺錢 合肥晚上兼職 金色旋風網賺論壇 免費的蘋果手機兼職賺錢項目 如何用電腦做任務賺錢搜索 手游推廣員的拉人套路 我想找個網絡兼職 用手機賺錢不用押金

編輯:伯建

我要說兩句: (0人參與)

發布
捕鱼达人之深海狩猎