📄 taskmemset.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 + -