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

📄 taskmemset.c

📁 电力行业必备。有错的地方
💻 C
字号:
#include "TaskMemSet.h"


Task_Data_Fat RAM1_TaskDataFat[32];		//当日任务数据分配表;
//PARAM_STR ParamIn;						// 参数数据结构

INT32U add_TaskData;



								

/*********************************************************************************************************
** 函数名称: fat_sram1
** 功能描述: 在SRAM1中分配重新配置的有效任务;
** 输   入: 无
** 输   出: 无
********************************************************************************************************/
void fat_sram1(void)
{
	INT8U i,k;
	INT32U	m;
	//init(); 
	//有效任务分配表初始化
	//任务重新分配之前先要把任务分配表清空,
	for(i=0;i<32;i++)
	{
		RAM1_TaskDataFat[i].State = 0;
		RAM1_TaskDataFat[i].TaskNO = 0;
		RAM1_TaskDataFat[i].Type = 0;
		RAM1_TaskDataFat[i].DayNum = 0;
		RAM1_TaskDataFat[i].NumTotal = 0;
		RAM1_TaskDataFat[i].AddStart = 0;
		RAM1_TaskDataFat[i].AddStartFlash = 0;
		RAM1_TaskDataFat[i].TaskNum = 0;
		RAM1_TaskDataFat[i].ExeCnt = 0;
		RAM1_TaskDataFat[i].TimeSample[0] = 0;
		RAM1_TaskDataFat[i].TimeSample[1] = 0;
		RAM1_TaskDataFat[i].IntervalSample[0] = 0;
		RAM1_TaskDataFat[i].IntervalSample[1] = 0;
		RAM1_TaskDataFat[i].TimeSend[0] = 0;
		RAM1_TaskDataFat[i].TimeSend[1] = 0;
		RAM1_TaskDataFat[i].IntervalSend[0] = 0;
		RAM1_TaskDataFat[i].IntervalSend[1] = 0;
		RAM1_TaskDataFat[i].DINum = 0;
		RAM1_TaskDataFat[i].MpNO = 0;
		RAM1_TaskDataFat[i].FhzSend = 0;
		RAM1_TaskDataFat[i].ByteNum_p = 0;
		for(k=0;k<32;k++)
			RAM1_TaskDataFat[i].OutAdd[k] = 0;
		for(k=0;k<32;k++)
			RAM1_TaskDataFat[i].LenDI[k] = 0;	
	}
	//清空当日数据保存空间(SRAM1)
	for(m=0;m<128*1024;m++)
		TaskData[m] = 0;
		
	add_TaskData = (INT32U)TaskData;
	
	//清空历史数据保存空间(FLASH1:SA15--SA38=1.5M),擦除后全为0xFF;
	for(m=0;m<24;m++)
	{
		ATMELEraseSector(FLASH1_BASE_TASK_DATA+1024+m*0x10000);//每次递增64K
	}
	

	for(i=0;i<32;i++)
	{
		if(crc_check(ParamInSram.Term_Par.X8100,3361)<0) ;//SRAM0中的参数区有错误,读取SRAM1中的参数
		else
		{
		/*
		if(ParamIn.Term_Par.X81FE[0] != 0)
		{
			for(i=0;i<8;i++)
			{
				if(ParamIn.Term_Par.X81FE[0]&(1<<i))
				{ 
					
					fat_init(&RAM1_TaskDataFat[i],ParamIn.Term_Par.X8101+104*i);
					RAM1_TaskDataFat[i].TaskNO = i+1;
				}
			}
		}
		*/
			if(ParamInSram.Term_Par.X81FE[31-i] != 0)
			{
				for(m=0;m<8;m++)
				{
					if(ParamInSram.Term_Par.X81FE[31-i]&(1<<m))
					{
						fat_init(&RAM1_TaskDataFat[i*8+m],ParamInSram.Term_Par.X8101+104*(i*8+m));
						RAM1_TaskDataFat[i*8+m].TaskNO = i*8+m+1;	
						flag_r[i*8+m]	= 0;
						flag_f[i*8+m] = 0;
						j_r[i*8+m] = 0;
						j_f[i*8+m] = 0;		
					}
				}
			}
		}
		
	}
}

/*********************************************************************************************************
** 函数名称: crc_check
** 功能描述: 校验处理
** 输   入: buf,处理数据的起始地址;
**			 len,校验的字节长度
** 输   出:   >=0 :校验成功。
**          < 0 : 校验失败。
********************************************************************************************************/
INT32S crc_check(INT8U *buf,INT16U len)
{
	INT16U i,crc = 0;
	for(i=0;i<len;i++)
	{
		crc = *(buf+i)+crc;
	}
	if(crc == *(buf+len)+((*(buf+len+1))<<8))  return 2;
	else	return -2;
}



/*********************************************************************************************************
** 函数名称: DI_InAdd
** 功能描述: 由数据项的标示码寻找该数据的存储地址
** 输   入: Mp,测量点号
**			 di0,数据项标示码0
**  		 di1,数据项标示码1
** 输   出: 本数据项的长度(字节数)
********************************************************************************************************/
INT32U DI_InAdd(INT8U Mp,INT8U di0,INT8U di1,INT8U *lenth)
{
	volatile INT32U i,rep,len=0;
		
	i=0;
	while((CUR_DATA_TAB[i] != di1)||(CUR_DATA_TAB[i+1] != di0))
	{
		if((CUR_DATA_TAB[i+1]&0x0f) != 0x0f)
		{
			len = CUR_DATA_TAB[i+2]+len;
		}
		i += 3;
		if(i>1000)	break;
	}
	*lenth = CUR_DATA_TAB[i+2];
	rep = (INT32U)(cur_data[Mp].X9010)+len;
	return rep;
}


/*********************************************************************************************************
** 函数名称: fat_init
** 功能描述: 任务数据分配表初始化
** 输   入: fat,任务数据分配表
**			 buf,任务参数
** 输   出: 无
********************************************************************************************************/
void fat_init(Task_Data_Fat * fat,INT8U * buf)
{	
	volatile INT32U temp;
	INT32U MemTotal=0;
	static INT32U MemDay=0,MemFlash=0;
	INT8U len_di,i;		
	if(fat == &(RAM1_TaskDataFat[0]))
	{
		MemDay=0;
		MemFlash=0;
	}
	fat->Type = *buf;
	fat->TimeSample[0] = *(buf+1);
	fat->TimeSample[1] = *(buf+2);
	fat->IntervalSample[0] = *(buf+3);
	fat->IntervalSample[1] = *(buf+4);
	fat->TimeSend[0] = *(buf+5);
	fat->TimeSend[1] = *(buf+6);
	fat->IntervalSend[0] = *(buf+7);
	fat->IntervalSend[1] = *(buf+8);
	fat->FhzSend = bcd_hex(*(buf+9));
	
	if((fat->IntervalSend[1])<((fat->IntervalSample[1])*(fat->FhzSend)))	
	{
		fat->State = 0;
		//改变任务有效标志,改变的同时要改变数据块校验码;
		//标志3个空间有保存:RAM0,RAM1,FLASH1,都要修改
		return;
	}
	else if(((fat->IntervalSend[1])%(fat->IntervalSample[1])) != 0)
	{
		fat->State = 0;
		//改变任务有效标志,改变的同时要改变数据块校验码;
		//标志3个空间有保存:RAM0,RAM1,FLASH1,都要修改
		return;
	}
	
	
	fat->MpNO = *(buf+10);
	temp = (((INT32U)(*(buf+12)))<<8)+(INT32U)(*(buf+11));
	fat->NumTotal = bcd_hex(temp);
	
	switch(fat->IntervalSample[0])
	{
		case MINU:	
		{
			fat->DayNum = 1440/(fat->IntervalSample[1]);
			
			if((1440%(fat->IntervalSample[1])) != 0)
				fat->DayNum += 1;
		
		}
		break;
			
		case HOU:	
		{
			fat->DayNum = 24/(fat->IntervalSample[1]);
			if((24%(fat->IntervalSample[1])) != 0)
				fat->DayNum += 1;
		}
		break;
		
		

				
		case DAY:	
		{
			fat->DayNum = 1;
			
			
		}
		break;
					
		case MON:	
		{
			fat->DayNum = 1;
			
		}
		break;
		
		default:break;
	}
	
	if((fat->NumTotal)<(fat->DayNum))	//假如任务的总点数小于任务一天的点数;(因为计算方法的缘故)
		fat->NumTotal=fat->DayNum;		//如果不这样处理会造成任务在FLASH中分配存储空间时出错;这种方法浪费空间
	
	
	temp = (((INT32U)(*(buf+14)))<<8)+(INT32U)(*(buf+13));
	fat->ExeCnt = bcd_hex(temp);
	fat->DINum = bcd_hex(*(buf+15));
	MemTotal = 0;
	for(i=0;i<fat->DINum;i++)
	{
		fat->OutAdd[i] = DI_InAdd(fat->MpNO,*(buf+16+2*i),*(buf+17+2*i),&len_di);
		fat->LenDI[i] = len_di;
		
		MemTotal += fat->LenDI[i];
	}
	fat->ByteNum_p = MemTotal+6;//6个字节时标
	fat->State = 1;
	temp = (fat->ByteNum_p)*(fat->DayNum);
	MemDay += temp;//
	if(MemDay<128*1024)	fat->AddStart = MemDay-temp;//  **一天所需的存储空间的大小,此空间大小是由该任务的采样间隔和一整天算出的
	else	
	{
		fat->State = 0;
		//改变任务有效标志,改变的同时要改变数据块校验码;
		//标志3个空间有保存:RAM0,RAM1,FLASH1,都要修改
		return;
	}
	
	
	//if((fat->NumTotal)<(fat->DayNum))
	//	fat->DayNum = fat->NumTotal;
		
	temp = (fat->ByteNum_p)*(fat->NumTotal);
	MemFlash += temp;
	if(MemFlash<FLASH1_MEM_TASK_DATA)	//  **FLASH1存储空间的分配是由该任务的总点数算出的
	{
		fat->AddStartFlash = MemFlash-temp+FLASH1_BASE_TASK_DATA;
		fat->AddStartFlash = ((fat->AddStartFlash)+1)&(0xFFFFFFFE);
	}
	else	
	{
		fat->State = 0;
		//改变任务有效标志,改变的同时要改变数据块校验码;
		//标志3个空间有保存:RAM0,RAM1,FLASH1,都要修改
		return;
	}
	
	if(fat->IntervalSample[0]==HOU)	
		fat->IntervalSample[1] = (fat->IntervalSample[1])*60;
	if(fat->TimeSample[0]==HOU)	
		fat->TimeSample[1] = (fat->TimeSample[1])*60;
	if(fat->IntervalSend[0]==HOU)	
		fat->IntervalSend[1] = (fat->IntervalSend[1])*60;
	//else if
	if(fat->TimeSend[0]==HOU)	
		fat->TimeSend[1] = (fat->TimeSend[1])*60;
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -