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

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

发表于 @ 2009年08月31日

转载于:https://www.cnblogs.com/shevsten/articles/1691450.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值