天天看點

Ethernet and the NicheStack TCP/IP Stack - NIOS II Edtion

http://www.altera.com/devices/processor/nios2/tools/embed-partners/ni2-network-stack.html

以前,NIOS使用Lightweight IP (LWIP) network stack方案,目前使用NicheStack TCP/IP Network Stack。

NicheStack® TCP/IP Stack - Nios® II Edition 目标是 減少資源使用提供全部功能的TCP/IP協定棧。設計用于小記憶體的嵌入式系統。NIOS可以在BSP中添加,有以下特性:

  • Internet Protocol (IP) including packet forwarding over multiple network interfaces 
  • Internet control message protocol (ICMP) for network maintenance and debugging 
  • User datagram protocol (UDP) 
  • Transmission Control Protocol (TCP) with congestion control, round trip time 
  • (RTT) estimation, and fast recovery and retransmit 
  • Dynamic host configuration protocol (DHCP)
  • Address resolution protocol (ARP) for Ethernet
  • Standard sockets application program interface (API) 

需要熟悉的内容

  • Sockets
  • NIOS EDS
  • MicroC/OS-II RTOS

NicheStack TCP/IP Stack - NIOS II 版本

包括以下兩種MAC的驅動:SMSC lan91c111裝置、Altera Triple-Speed Ethernet

它的驅動是基于中斷的,是以需要確定連接配接了以太網元件的中斷。硬體基礎是HAL。

用法

主要接口是标準sockets接口。調用以下兩個函數來初始化協定棧和驅動:alt_iniche_init() 和 netmain()。可以使用初始化線程中的全局變量 iniche_net_ready。必須提供HAL系統代碼調用的兩個簡單函數來擷取MAC位址和IP位址:get_mac_addr() 和 get_ip_addr()。

NIOS II 系統要求

  • 硬體必須具有以太網接口的中斷
  • BSP必須基于 MicroC/OS-II
  • MicroC/OS-II必須配置以下兩個:開啟TimeManagement / OSTimeTickHook;最大任務數必須大于等于4。
  • 系統定時器

任務

NicheStack 主任務(main task),tk_netmain() —— 初始化後,該任務 sleep 直到一個新的資料包到達要處理。資料包通過中斷服務程式(ISR)來接收,當ISR收到資料包,放入接收序列,喚醒該主任務。

NicheStack 定時任務(tick task),tk_nettick() —— 周期性的喚醒。

初始化

在初始化之前,先通過從 main() 函數中調用 OSStart() 來啟動 MicroC/OS-II 流程。為確定在 RTOS 運作和 I/O 驅動可用之前,不要企圖更多的初始化操作,需要在高優先級的任務中進行協定棧的初始化。

在 iniche_net_ready 為真之前,需要確定不要使用協定棧接口。如:

void SInitialTask(void *task_data)
{
  INT8U error_code;
  /*
  * Initialize Altera NicheStack TCP/IP Stack - Nios II Edition specific code.
  * NicheStack is initialized from a task, so that RTOS will have started, and 
  * I/O drivers are available.  Two tasks are created:
  *    "Inet main"  task with priority 2
  *    "clock tick" task with priority 3
  */   
  alt_iniche_init();
  /* Start the Iniche-specific network tasks and initialize the network
   * devices.
   */
  netmain(); 
  /* Wait for the network stack to be ready before proceeding. */
  while (!iniche_net_ready)
    TK_SLEEP(1);
  /* Now that the stack is running, perform the application initialization steps */
}
           

這裡 TK_SLEEP 在 NicheStack 中定義

#define  TK_SLEEP(count)     OSTimeDly(count + 1)
           

get_mac_addr() and get_ip_addr()

NicheStack TCP/IP Stack 系統代碼在裝置初始化過程中需要調用 get_mac_addr() and get_ip_addr(),這兩個函數用來設定 在BSP中的 altera_iniche.iniche_default_if 選擇的網絡接口的 MAC 和 IP 位址。MAC最好不要指定固定位址,可以儲存在一個靈活的地方,如flash中。

prototypes:

int get_mac_addr(NET net, unsigned char mac_addr[6]);
int get_ip_addr(alt_iniche_dev* p_dev,
    ip_addr* ipaddr,
    ip_addr* netmask,
    ip_addr* gw,
    int* use_dhcp);在
           

mac位址需要保證在産品線上的唯一性。

在 get_ip_addr 函數中,通過以下代碼來設定:

IP4_ADDR(*ipaddr, IPADDR0, IPADDR1, IPADDR2, IPADDR3);
    IP4_ADDR(*gw, GWADDR0, GWADDR1, GWADDR2, GWADDR3);
    IP4_ADDR(*netmask, MSKADDR0, MSKADDR1, MSKADDR2, MSKADDR3);
           

開啟DCHP:

*use_dhcp = 1;
           

在30秒内自動擷取失敗會使用預設IP。

iniche_default_if和dhcp_client都可以在BSP Editor中指定。

調用Sockets接口

初始化完成後,就可以使用sockets API來通路IP棧。

必須使用 TK_NEWTASK() 函數來使用 sockets API 通路IP棧。

配置 NicheStack TCP/IP Stack

在 ipport.h 檔案中,可以使用 #define 來配置很多的選項。

繼續閱讀