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任务和测试任务的创建,最后不停进行网卡数据包的查询.
#if (ZLG_TCPIP_MODULE_EN == DEF_ENABLED) OSTaskCreateExt((void (*)(void *)) Task_ZLGTCPIP_Init, (void *) 0, (OS_STK *) &Task_ZLGTCPIP_Init_Stack[TASK_ZLGTCPIP_INIT_STK_SIZE-1], (INT8U ) TASK_ZLGTCPIP_INIT_PRIO, (INT16U ) TASK_ZLGTCPIP_INIT_ID, (OS_STK *) &Task_ZLGTCPIP_Init_Stack[0], (INT32U ) TASK_ZLGTCPIP_INIT_STK_SIZE, (void *) 0, (INT16U ) (OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR)); #if (OS_TASK_NAME_SIZE > 9) OSTaskNameSet(TASK_ZLGTCPIP_INIT_PRIO, "Task_ZLGTCPIP_Init", &err); #endif RecPackedFlag= OSSemCreate(0); RecBufOverFlowFlag= OSSemCreate(0); RecTcpPackedFlag= OSSemCreate(0); RecPingPackedFlag= OSSemCreate(0); SendFlag= OSSemCreate(1); RecIcmpQFlag= OSQCreate(&RecIcmpQ[0],Q_Max_Size); RecTcpQFlag= OSQCreate(&RecTcpQ[0],Q_Max_Size); RecUdpQFlag= OSQCreate(&RecUdpQ[0],Q_Max_Size); #endif

Task_ZLGTCPIP_Init:
void Task_ZLGTCPIP_Init(void *pdata) { uint8 iii; print_string("Task_ZLGTCPIP_Init started/r/n"); OSTaskCreateExt(TaskB, (void *)0, &task1_stack[999], TASK_1_PRIO, TASK_1_ID, &task1_stack[0], 1000, (void *)0, 0); OSTaskCreateExt(TaskC, (void *)0, &task2_stack[1999], TASK_2_PRIO, TASK_2_ID, &task2_stack[0], 2000, (void *)0, 0); OSTaskCreateExt(TaskD, (void *)0, &task3_stack[999], TASK_3_PRIO, TASK_3_ID, &task3_stack[0], 1000, (void *)0, 0); OSTaskCreateExt(TaskE, (void *)0, &task4_stack[1999], TASK_4_PRIO, TASK_4_ID, &task4_stack[0], 2000, (void *)0, 0); SetNetPort(); InitNic(0); //RTL8019芯片初始化,在global.c中定义 Initial_arp(); Tcp_Initial(); Udp_Initial(); while(1) { OSTimeDly(20); do { iii=Rec_Packet(); } while(iii!=0); } }
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:
void TaskB(void *pdata) { void * UdpTemp; uint8 eer; while (1) { UdpTemp=OSQPend(RecUdpQFlag,0,&eer); if(eer==OS_NO_ERR) { Udp_Process((Rec_Ptr *)UdpTemp); eer=eer; } } }
TaskC:

void TaskC(void *pdata) { void * TcpTemp; uint8 err; while (1) { TcpTemp=OSQPend(RecTcpQFlag,0,&err); if(err==OS_NO_ERR) { Process_Tcp1((Rec_Ptr *)TcpTemp); TcpTemp=TcpTemp; } } }
5.ping的效果并不理想,因为采用的是查询方式,后来用LwIP采用中断的方式可以达到2-3ms
SMARTARM2200 ADS工程在IAR EWARM 5.3上的移植(5)-ZLG-TCPIP的移植_第1张图片

 

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

你可能感兴趣的:(tcp,String,OS,Module,嵌入式,任务)