μC/OS-Ⅱ要求在其上运行的应用软件“任务化”,所以需要按μC/OS-Ⅱ的任务编写规范设计系统应用任务。按任务优先级从高到低设计如下[4]。
Task0:完成系统各部分(包括MC39i)初始化工作后,采用时间片的方式进行PPP数据帧的接收,并完成该数据帧的解析。
Task 1:风光发电厂各发电站状态参数的读取。
Task 2:UDP数据包的接收处理。
Task 3:TCP数据包的接收处理。
Task 4:ICMP数据包的接收处理(主要是响应PING)。
Task 5:针对UDP数据报中的命令请求进行响应。
Task 6:针对TCP数据报中的命令请求进行响应(Web服务器功能)。
系统任务之间的通信如图3所示。
3.3 IP数据包解析模块软件设计
IP协议是TCP/IP协议的核心,也是网络层中最重要的协议,IP层接收由更低层发来的数据包,并将其发送到更高层——TCP或UDP层;反之,IP报也把从TCP或UDP层接收来的数据包传送到更低层,并最终通过TCP/IP网络进行无连接传送数据报。
本系统向监控中心传送的数据,需先进行TCP/IP协议的处理,即要求LPC2214实现TCP/IP协议。其中IP数据包的封装及发送是通过函数ip_send( )实现的,通常此函数是在PPP协议处理函数中被调用。风光发电站各状态参数在被封装为UDP数据包以后,调用此函数进行IP协议格式数据封装,即在IP数据报头的数据结构中添加IP报头信息(其中包括计算IP报头的校验和值)。在封装好IP包之后,要设置此IP报头数据(20 B)的“发送结构”Send_Ptr,从而与UDP数据报构成一个发送数据链。
发送IP报之前要先得到“发送信号量”SendFlag,否则只有挂起当前任务等待此信号量。一旦得到发送信号量,对该IP报进行PPP协议数据格式封装,之后再启动MC39i发送数据,数据发送完毕后要及时释放发送信号量。
具体程序如下:
Uint8 ip_send(struct Send_Ptr *TxdData,uint8 * dest_ip,uint8 PROTOCOL)
{//TxdData为存放待传输数据首指针;dest_ip为目的IP地址首指针;IP包中的下一层
//客户协议类型(UDP、TCP)
uint16 CRC;
uint8 Ip_Head[20];
struct Send_Ptr TxDIPData;
uint8 err;
static uint16 FrameIndex=0;
Ip_Head[0]=0x45;
…… //进行TCP/IP协议中的IP数据包
//报头设置
Ip_Head[19]=dest_ip[3];
CRC=CreateIpHeadCrc(Ip_Head); //对IP首部中每16位
//进行二进制反码求和
Ip_Head[10]=(CRC&0xff00)>>8;
Ip_Head[11]=CRC&0x00ff;
TxdIpData.STPTR=TxdData;
TxdIpData.length=20;
TxdIpData.DAPTR=Ip_Head;
OSSemPend(SendFlag,10,&err);
//获取μC/OS-Ⅱ操作系统当前的发送权(得到“发
//送信号量”SendFlag)
if(err==OS_NO_ERR) //没有得到发送权(发送信
//号量SendFlag),挂起任务,等待
{
if(ip_mac_send(&TxdIpData,dest_ip))
//按照PPP协议打包数据,并启动MC39i
//通信模块进行传输数据
{
OSSemPost(SendFlag);
//发送成功,释放“发送信号量”,并返回“1”
return(1);
}
else
{
OSSemPost(SendFlag);
//发送失败,释放“发送信号量”,并返回“0”
return(0);
}
}
else
return (0);
}