📄 epa_csme.c
字号:
/**************************************************************************
**
** 文件: EPA_CSME.c
** 描述: 该文件完成EPA_CSME,通过构造周期队列、非周期队列、声明队列,对发送到EPA网络上的报文进行调度管理
**
**************************************************************************/
//include library files
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//include user defined files
#include "Define.h"
#include "Global_Variable.h"
#include "Extern_Function.h"
#include "EPA_SocMapEnt.h"
#include "EPA_ManInfBas.h"
#include "IP_UDP.h"
#include "EPA_CSME.h"
static uchar Periodic_Ring[Max_Size*Node_Number]; //周期报文缓存环,假定最多可以缓存Node_Number个周期报文
static uchar Periodic_ID=0; //记录周期报文在缓存环中的位置,from 0 to Node_Number-1
static uchar NonPeriodic_Ring[Max_Size*Node_Number];//非周期报文缓存环,假定最多可以缓存Node_Number个非周期报文
static uchar NonPeriodic_ID=0; //记录非周期报文在缓存环中的位置,from 0 to Node_Number-1
static struct EpaPeriodicDataNode *PeriodicListHead=NULL; //周期队列表头
static struct EpaNonPeriodicDataNode *NonPeriodicListHead=NULL; //非周期队列表头
static struct EpaAnnNode *AnnListHead=NULL; //声明队列表头
/**************************************************************************
**
** 函数: void EpaPeriodicListAddTail(uchar *,uint)
** 描述: 该函数在周期队列末尾插入新节点,入口参数为待发送的周期报文的首地址和长度
**
**************************************************************************/
void EpaPeriodicListAddTail(uchar *PeriodicAddr,uint PeriodicLen)
{
struct EpaPeriodicDataNode *newnode,*tempnode=PeriodicListHead;
newnode=(struct EpaPeriodicDataNode *)malloc(sizeof(struct EpaPeriodicDataNode)); //开辟一个新单元
newnode->pkt=PeriodicAddr; //缓存报文的首地址
newnode->lenth=PeriodicLen; //缓存报文的长度
if(PeriodicListHead==NULL) //原来的链表是空链表
{
PeriodicListHead=newnode;
newnode->pNext=NULL;
}
else
{
while(tempnode->pNext!=NULL)
tempnode=tempnode->pNext;
tempnode->pNext=newnode;
newnode->pNext=NULL;
}
}
/**************************************************************************
**
** 函数: void EpaPeriodicListDelHead(void)
** 描述: 该函数删除周期队列首节点
**
**************************************************************************/
void EpaPeriodicListDelHead(void)
{
struct EpaPeriodicDataNode *tempnode=PeriodicListHead;
PeriodicListHead=tempnode->pNext;
}
/**************************************************************************
**
** 函数: void EpaNonPeriodicListAddNode(uchar *,uint,uchar)
** 描述: 该函数在非周期队列中按优先级插入新节点,入口参数为待发送的非周期报文的首地址、长度、优先级
**
**************************************************************************/
void EpaNonPeriodicListAddNode(uchar *NonPeriodicAddr,uint NonPeriodicLen,uchar NonPeriodicPri)
{
struct EpaNonPeriodicDataNode *newnode,*addnode,*tempnode=NonPeriodicListHead;
newnode=(struct EpaNonPeriodicDataNode *)malloc(sizeof(struct EpaNonPeriodicDataNode));//开辟一个新单元
newnode->pkt=NonPeriodicAddr; //缓存报文的首地址
newnode->lenth=NonPeriodicLen; //缓存报文的长度
newnode->pri=NonPeriodicPri; //报文优先级
if(NonPeriodicListHead==NULL) //原来的链表是空链表
{
NonPeriodicListHead=newnode;
newnode->pNext=NULL;
}
else
{
while(NonPeriodicPri >= tempnode->pri && tempnode->pNext !=NULL) //优先级不高于前面的节点
{
addnode=tempnode;
tempnode=tempnode->pNext;
}
if(tempnode->pNext==NULL)
{
tempnode->pNext=newnode;
newnode->pNext=NULL;
}
else
{
addnode->pNext=newnode;
newnode->pNext=tempnode;
}
}
}
/**************************************************************************
**
** 函数: void EpaNonPeriodicListDelHead(void)
** 描述: 该函数删除非周期队列首节点
**
**************************************************************************/
void EpaNonPeriodicListDelHead(void)
{
struct EpaNonPeriodicDataNode *tempnode=NonPeriodicListHead;
NonPeriodicListHead=tempnode->pNext;
}
/**************************************************************************
**
** 函数: void EpaAnnAddNode(uchar,uchar *,uchar *)
** 描述: 该函数在声明队列中按优先级插入新节点,入口参数为非周期声明报文的优先级、MAC地址、IP地址
**
**************************************************************************/
void EpaAnnAddNode(uchar AnnPri,uchar *mac,uchar *ip)
{
struct EpaAnnNode *newnode,*addnode,*tempnode=AnnListHead;
newnode=(struct EpaAnnNode *)malloc(sizeof(struct EpaAnnNode)); //开辟一个新单元
newnode->pri=AnnPri; //报文优先级
memcpy(newnode->u_mac,mac,6); //报文MAC地址
memcpy(newnode->u_ip,ip,4); //报文IP地址
if(AnnListHead==NULL) //原来的链表是空链表
{
AnnListHead=newnode;
newnode->pNext=NULL;
}
else
{
while(AnnPri > tempnode->pri && tempnode->pNext !=NULL) //优先级低于前面的节点
{
addnode=tempnode;
tempnode=tempnode->pNext;
}
if(tempnode->pNext==NULL)
{
tempnode->pNext=newnode;
newnode->pNext=NULL;
}
else if(AnnPri == tempnode->pri)
{
while(newnode->u_ip[3] > tempnode->u_ip[3] && tempnode->pNext!=NULL) //IP地址大于前面的节点
{
addnode=tempnode;
tempnode=tempnode->pNext;
}
if(tempnode->pNext==NULL)
{
tempnode->pNext=newnode;
newnode->pNext=NULL;
}
else
{
addnode->pNext=newnode;
newnode->pNext=tempnode;
}
}
else
{
addnode->pNext=newnode;
newnode->pNext=tempnode;
}
}
}
/**************************************************************************
**
** 函数: void EpaAnnListDelHead(void)
** 描述: 该函数删除声明队列首节点
**
**************************************************************************/
void EpaAnnListDelHead(void)
{
struct EpaAnnNode *tempnode=AnnListHead;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -