⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 epa_csme.c

📁 AVR单片机基础上的以太网协议编程
💻 C
📖 第 1 页 / 共 2 页
字号:
/**************************************************************************
**
**    文件: 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 + -