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 來配置很多的選項。