SMARTARM2200 ADS工程在IAR EWARM 5.3上的移植(5)-ZLG-TCPIP的移植

板子自带的TCPIP协议栈ZLG-TCPIP的性能可以说一般,代码质量也不高,而且采用的是查询而不是中断方式.不过初学TCPIP研究一下相比其他复杂的协议栈还是容易点.
这里就简单描述下ADS移植到IAR的过程,因为改动的代码并不多,就不详细介绍了.关于ZLG-TCPIP更深入的介绍可以参考《ARM嵌入式系统软件开发实例(一)》,之后会详细介绍LwIP的移植过程以及网卡驱动
可以到http://download.csdn.net/source/1547554下载到该工程的源代码,之后有少许改动,不过并不影响运行,如果需要可以与我联系,共同探讨.
1.移植过程很简单,把ADS中的ZLG-TCPIP文件夹复制到IAR下,在工程中添加其中的代码,在app.c中创建相应uCOSII任务.实现数据类型等的定义.编译有错误会提示你进行查漏补缺.
2.在app.c中的App_TaskCreate创建了一个Task_ZLGTCPIP_Init任务,该任务进行ZLG-TCPIP的初始化,网卡的初始化,ZLG-TCPIP任务和测试任务的创建,最后不停进行网卡数据包的查询.

1 #if (ZLG_TCPIP_MODULE_EN == DEF_ENABLED)
2 OSTaskCreateExt((void (*)(void *)) Task_ZLGTCPIP_Init,
3 (void *) 0,
4 (OS_STK *) &Task_ZLGTCPIP_Init_Stack[TASK_ZLGTCPIP_INIT_STK_SIZE-1],
5 (INT8U ) TASK_ZLGTCPIP_INIT_PRIO,
6 (INT16U ) TASK_ZLGTCPIP_INIT_ID,
7 (OS_STK *) &Task_ZLGTCPIP_Init_Stack[0],
8 (INT32U ) TASK_ZLGTCPIP_INIT_STK_SIZE,
9 (void *) 0,
10 (INT16U ) (OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR));
11
12  #if (OS_TASK_NAME_SIZE > 9)
13 OSTaskNameSet(TASK_ZLGTCPIP_INIT_PRIO, "Task_ZLGTCPIP_Init", &err);
14  #endif
15
16 RecPackedFlag= OSSemCreate(0);
17 RecBufOverFlowFlag= OSSemCreate(0);
18 RecTcpPackedFlag= OSSemCreate(0);
19 RecPingPackedFlag= OSSemCreate(0);
20 SendFlag= OSSemCreate(1);
21
22 RecIcmpQFlag= OSQCreate(&RecIcmpQ[0],Q_Max_Size);
23 RecTcpQFlag= OSQCreate(&RecTcpQ[0],Q_Max_Size);
24 RecUdpQFlag= OSQCreate(&RecUdpQ[0],Q_Max_Size);
25  #endif

Task_ZLGTCPIP_Init:

1 void Task_ZLGTCPIP_Init(void *pdata)
2 {
3 uint8 iii;
4 print_string("Task_ZLGTCPIP_Init started\r\n");
5
6 OSTaskCreateExt(TaskB,
7 (void *)0,
8 &task1_stack[999],
9 TASK_1_PRIO,
10 TASK_1_ID,
11 &task1_stack[0],
12 1000,
13 (void *)0,
14 0);
15 OSTaskCreateExt(TaskC,
16 (void *)0,
17 &task2_stack[1999],
18 TASK_2_PRIO,
19 TASK_2_ID,
20 &task2_stack[0],
21 2000,
22 (void *)0,
23 0);
24 OSTaskCreateExt(TaskD,
25 (void *)0,
26 &task3_stack[999],
27 TASK_3_PRIO,
28 TASK_3_ID,
29 &task3_stack[0],
30 1000,
31 (void *)0,
32 0);
33 OSTaskCreateExt(TaskE,
34 (void *)0,
35 &task4_stack[1999],
36 TASK_4_PRIO,
37 TASK_4_ID,
38 &task4_stack[0],
39 2000,
40 (void *)0,
41 0);
42
43 SetNetPort();
44 InitNic(0); //RTL8019芯片初始化,在global.c中定义
45 Initial_arp();
46 Tcp_Initial();
47 Udp_Initial();
48
49 while(1)
50 {
51 OSTimeDly(20);
52 do
53 {
54 iii=Rec_Packet();
55 }
56 while(iii!=0);
57 }
58 }

Rec_Packet()从网卡接收到数据包后,会调用Rec_Ethernet_Packed进行数据包的分析,判断是ARP还是IP包,如果是IP包送到IP_PROCESS处理,并判断出是ICMP/TCP/UDP包,如果是ICMP包就icmp_process,如果是TCP/UDP则发送信号量有TaskC和TaskB进行处理

4.TaskB和TaskC, TaskB和TaskC等待到IP_PROCESS发送的信号量后就交由UDP/TCP层去处理.对应的函数为Udp_Process和Process_Tcp1
TaskB:

1 void TaskB(void *pdata)
2
3 {
4 void * UdpTemp;
5 uint8 eer;
6 while (1)
7 {
8 UdpTemp=OSQPend(RecUdpQFlag,0,&eer);
9 if(eer==OS_NO_ERR)
10 {
11 Udp_Process((Rec_Ptr *)UdpTemp);
12 eer=eer;
13 }
14 }
15 }

TaskC:

1 void TaskC(void *pdata)
2 {
3 void * TcpTemp;
4 uint8 err;
5 while (1)
6 {
7 TcpTemp=OSQPend(RecTcpQFlag,0,&err);
8
9 if(err==OS_NO_ERR)
10 {
11 Process_Tcp1((Rec_Ptr *)TcpTemp);
12 TcpTemp=TcpTemp;
13 }
14 }
15 }

5.ping的效果并不理想,因为采用的是查询方式,后来用LwIP采用中断的方式可以达到2-3ms


关于另一个ZLG例子-ZLGGUI可以在http://download.csdn.net/source/1599837下到IAR的工程,ZLG-GUI功能比较简单,就不深入研究了,将来可以好好研究下MiniGUI和uC-GUI

发表于 @ 2009年08月31日

posted on 2010-03-22 11:18  shevsten  阅读(675)  评论(0编辑  收藏  举报