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

📄 9311db.c

📁 详细介绍了arm7-at91r40008,的开发全过程
💻 C
📖 第 1 页 / 共 5 页
字号:
/*------------------------------------------------------------------*/
/*模块名称:9311db.c                                            	*/
/*模块功能:9311的数据库和时间处理函数,主要是管理NVRAM    			*/
/*编写日期:2004年8月                                         		*/
/*编写者:  dingding												*/
/*------------------------------------------------------------------*/

#include "includes.h"



//全局变量
INT32U	CurNVRAMAddr = (INT32U)OTHERADDR;
INT32U	NVRAMSIZE = 0x8000;
struct DBBOOPInfos		DBCommQs;
struct DBManage			*DBManag;
struct AbsTime_t		pAbsTime;
INT8U					*pFReset;

extern INT16U	TimeCounter2;
extern INT16U	FDNum;
extern struct SysConfig		SysCfg;
extern struct MyConfig		MyCfg;
extern struct SysPort		*SysPorts;
extern struct DBConfig		*DBCfgs;
extern struct DBInitInfo	*DBInfos;

/*------------------------------------------------------------------*/
/*函数名称:DBInit(void)											*/
/*函数功能:数据库初始化											*/
/*------------------------------------------------------------------*/
BOOL DBInit(void)
{
	BOOL	dd;
	INT16U	i, j;
	volatile INT8U	*wp;
			
	dd = DBCreate();
	if (!dd)
		return (FALSE);
	
	memset (&DBCommQs, 0, sizeof (struct DBBOOPInfos));
	DBCommQs.Max = DBBOOPINFOMAX;
	
	//YX初始化为分
	for (i=0; i<SysCfg.DBAllNum; i++)
	{
		wp = (volatile INT8U*)GetDBAddr(i, YXDATA, TRUE);
		for (j=0; j<DBCfgs[i].YXNum; j++)
		{
			#ifdef BOOT_PROG
			if (0x80 & *(wp + j))
				*(wp + j) = YX_H;
			else
			#endif
				*(wp + j) = YX_F;
		}
	}			
	
	return (TRUE);
}

/*------------------------------------------------------------------*/
/*函数名称:NVRAMInit(void)											*/
/*函数功能:NVRAM初始化,以备上层使用								*/
/*------------------------------------------------------------------*/
BOOL NVRAMInit(void)
{
	volatile INT8U	*wp;
	INT8U	rc, tmp;
	INT16U	j, size;
	INT32U	i;
	struct DBInfo	info;

	//检测大小
	wp = (volatile INT8U *)(NVRAM_BASE);
	rc = *(wp + 0x7FFF);
	tmp = (INT8U)(rc + 0x55);
	*(wp + 0x1FFFF) = tmp;
	if (*(wp + 0x7FFF) == tmp)
	{
		CurNVRAMAddr = (INT32U)OTHERADDR2;
		NVRAMSIZE = 0x8000;
//		ErrorInfo(OSPrioCur, "NVRAM--32K");
	}
	else
	{
		CurNVRAMAddr = (INT32U)OTHERADDR;
		NVRAMSIZE = 0x20000;
//		ErrorInfo(OSPrioCur, "NVRAM--128K");
	}
	*(wp + 0x1FFFF) = rc;
	
	//冷启动时清零
	info.DevID = ROOTID;
	info.Type = FRESET;
	DBRead(pFReset, &info);
	if (*pFReset != RESET_RETAIN)
	{
		wp = NVRAMBASEADDR;
		for (i=0; i<NVRAMSIZE; i++)
		{
			*(wp + i) = 0x0;
			if (*(wp + i) != 0x0)
				return (FALSE);
		}

		//系统信息APPID初始化为0xFFFF
		wp = SYSINFOADDR + 1;
		size = sizeof(struct SysInfo_t);
		for (i=0; i<SYSINFOLIMIT; i++)
			for (j=0; j<2; j++)
				*(wp + i*size + j) = 0xFF;	
	}
	else	//初值初始化
	{
		//...
	}
	
	*pFReset = RESET_RETAIN;
	DBWrite(pFReset, &info);

	return (TRUE);
}

/*------------------------------------------------------------------*/
/*函数名称:DBCreate(void)											*/
/*函数功能:创建数据库												*/
/*------------------------------------------------------------------*/
BOOL DBCreate(void)
{
	volatile INT8U	*rp;
	INT16U	i, j, size;
	
	size = sizeof (struct DBManage) * SysCfg.DBAllNum;
	DBManag = malloc (size);
	if (!DBManag)
	{
		ErrorInfo(ROOTID, "创建数据库失败125");
		return (FALSE);
	}
	else
		memset (DBManag, 0, size);
		
	for (i=0; i<SysCfg.DBAllNum; i++)
	{
		DBManag[i].DevID = DBCfgs[i].DevID;
		if (DBCfgs[i].YCNum)
		{
			DBManag[i].YCAddr = malloc (DBCfgs[i].YCNum * sizeof(INT16S));
			memset (DBManag[i].YCAddr, 0, DBCfgs[i].YCNum * sizeof(INT16S));
		}
		if (DBCfgs[i].DDNum)
		{
			DBManag[i].DDAddr = SetDBAddr(DDDATA, DBCfgs[i].DDNum);
		}		
		if (DBCfgs[i].YXNum)
		{
			DBManag[i].YXAddr = SetDBAddr(YXDATA, DBCfgs[i].YXNum);
			DBManag[i].SOEAddr = SetDBAddr(SOEDATA, DBCfgs[i].YXNum);
			DBManag[i].COSAddr = SetDBAddr(COSDATA, DBCfgs[i].YXNum);
		}

	}

	for (i=0; i<SysCfg.DBAllNum; i++)
	{
		if (DBCfgs[i].Flag & FDBLOGIC)
		{
			DBCfgs[i].Info.Logic.pOld->SOEOld = *((volatile INT8U*)(DBManag[i].SOEAddr));
			DBCfgs[i].Info.Logic.pOld->COSOld = *((volatile INT8U*)(DBManag[i].COSAddr));
		}
		if (DBCfgs[i].Flag & FDBLOGIC2)
		{
			for (j=0; j<DBCfgs[i].Info.Logic.DevNum; j++)
			{
				rp = (volatile INT8U*)GetDBAddr(DBCfgs[i].Info.Logic.pOld[j].DevID, SOEDATA, TRUE);
				DBCfgs[i].Info.Logic.pOld[j].SOEOld = *rp;
				rp = (volatile INT8U*)GetDBAddr(DBCfgs[i].Info.Logic.pOld[j].DevID, COSDATA, TRUE);
				DBCfgs[i].Info.Logic.pOld[j].COSOld = *rp;
			}
		}
	
	}

	return (TRUE);
}

/*------------------------------------------------------------------*/
/*函数名称:DBWrite()												*/
/*函数功能:数据库写操作											*/
/*输入说明:pData:数据指针											*/
/*			pInfo:数据信息											*/
/*------------------------------------------------------------------*/	
BOOL DBWrite(INT8U *pData, struct DBInfo *pInfo)
{
	volatile INT8U	*wp, *wtmp;
	INT16U	i, j, size, tmp, oldID;

	oldID = OSPrioCur;
	OSTaskChangePrio(OSPrioCur, HID);

	switch (pInfo->Type)
	{
		case YCDOTDATA:
			DBWriteYCDOT(pData, pInfo);
			break;
			
		case YCDATA:
			DBWriteYC(pData, pInfo);
			break;
			
		case YXDOTDATA:
			DBWriteYXDOT(pData, pInfo);
			break;
			
		case YXDATA:
			DBWriteYX(pData, pInfo);
			break;

		case SOEDATA:
			DBWriteSOE(pData, pInfo);
			break;
					
		case COSDATA:
			break;
		
		case DDDATA:
			DBWriteDD(pData, pInfo);
			break;			
		
		case FENTERBOOT: 
			wp = FENTERBOOTADDR;
			*wp = *pData;
			break;
			
		case FRESET:
			wp = FRESETADDR;
			*wp = *pData;
			
			break;
		
		case ABSTIME:
			wp = ABSTIMEADDR;
			size = sizeof(struct AbsTime_t);
			for (i=0; i<size; i++)
				*(wp + i) = *(pData + i);
			break;		

		case BIDATA:
			wp = BIVALADDR;
			size = (pInfo->Num - 1) / 8 + 1;
			for (i=0; i<size; i++)
				*(wp + i) = *(pData + i);
				
			break;

		case FDRLOC:
			if (pInfo->Num >= 15)
				pInfo->Num = 0;
				
			wp = FDRLOCADDR;
			*(wp + pInfo->Num) = *pData;
			
			break;
					
		case INFODATA:
			wtmp = SYSINFOADDR;
			tmp = *wtmp;
			
			size = sizeof(struct SysInfo_t);
			for (i=0; i<pInfo->Num; i++)
			{
				wp = wtmp + tmp * size + 1;
				for (j=0; j<size; j++)
					*(wp + i*size + j) = *(pData + i*size + j);

				tmp = (tmp + 1) % SYSINFOLIMIT;
			}
			*wtmp = tmp;
			
			break;
		
		case LBDATAUA:
		case LBDATAUC:
		case LBDATAIA:
		case LBDATAIB:
		case LBDATAIC:
		case LBDATAIO:
		case LBINFO:
			DBWriteLB(pData, pInfo);
			
			break;

		default:
			break;
	}
	OSTaskChangePrio(OSPrioCur, oldID);
	
	return (TRUE);
}

/*------------------------------------------------------------------*/
/*函数名称:DBWriteYCDOT()											*/
/*函数功能:数据库离散遥测写操作									*/
/*输入说明:pData:数据指针											*/
/*			pInfo:数据信息											*/
/*------------------------------------------------------------------*/	
void DBWriteYCDOT(INT8U *pData, struct DBInfo *pInfo)
{
	INT16U	*pb, *pbb;
	INT16S	val;
	INT16U	i, j, size, tmp;	
	
	pb = (INT16U*)GetDBAddr(pInfo->DevID, YCDATA, FALSE);
	size = sizeof (INT16S);
	for (i=0; i<size*pInfo->Num; i+=size)
	{
		j = *((INT16U*)pData + i);
		if (j >= DBCfgs[pInfo->DevID].YCNum)
			continue;
		
		val = *((INT16U*)pData + i + 1);
		if (DBCfgs[pInfo->DevID].Flag & FDBAICALCULATE)
			val = (INT16U)(((INT32U)val * DBCfgs[pInfo->DevID].Info.Real.pAI[j].a) / DBCfgs[pInfo->DevID].Info.Real.pAI[j].b);
		pb[j] = val;
		
		if (DBCfgs[pInfo->DevID].Flag & FDBLOGUSE)
		{
			tmp = DBCfgs[pInfo->DevID].Info.Real.pAI[j].Index[0];
			if (tmp != DEFINDEXNO)
			{
				pbb = (INT16U*)GetDBAddr(DBCfgs[pInfo->DevID].Info.Real.LogDevID[0], YCDATA, FALSE);
				pbb[tmp] = val;
			}
		}
		if (DBCfgs[pInfo->DevID].Flag & FDBLOG2USE)
		{
			tmp = DBCfgs[pInfo->DevID].Info.Real.pAI[j].Index[1];
			if (tmp != DEFINDEXNO)
			{
				pbb = (INT16U*)GetDBAddr(DBCfgs[pInfo->DevID].Info.Real.LogDevID[1], YCDATA, FALSE);
				pbb[tmp] = val;
			}
		}
	}

}

/*------------------------------------------------------------------*/
/*函数名称:DBWriteYC()												*/
/*函数功能:数据库遥测写操作										*/
/*输入说明:pData:数据指针											*/
/*			pInfo:数据信息											*/
/*------------------------------------------------------------------*/	
void DBWriteYC(INT8U *pData, struct DBInfo *pInfo)
{
	INT16U	*pb, *pbb;
	INT16S	val;
	INT16U	i, num, tmp;

	pb = (INT16U*)GetDBAddr(pInfo->DevID, YCDATA, FALSE);
	num = pInfo->Start + pInfo->Num;
	if (num > DBCfgs[pInfo->DevID].YCNum)
		num = DBCfgs[pInfo->DevID].YCNum;
	
	for (i=pInfo->Start; i<num; i++)
	{
		val = *((INT16U*)pData + (i-pInfo->Start));
		if (DBCfgs[pInfo->DevID].Flag & FDBAICALCULATE)
			val = (INT16U)(((INT32U)val * DBCfgs[pInfo->DevID].Info.Real.pAI[i].a) / DBCfgs[pInfo->DevID].Info.Real.pAI[i].b);
		pb[i] = val;
		
		if (DBCfgs[pInfo->DevID].Flag & FDBLOGUSE)
		{
			tmp = DBCfgs[pInfo->DevID].Info.Real.pAI[i].Index[0];
			if (tmp != DEFINDEXNO)
			{
				pbb = (INT16U*)GetDBAddr(DBCfgs[pInfo->DevID].Info.Real.LogDevID[0], YCDATA, FALSE);
				pbb[tmp] = val;
			}
		}
		if (DBCfgs[pInfo->DevID].Flag & FDBLOG2USE)
		{
			tmp = DBCfgs[pInfo->DevID].Info.Real.pAI[i].Index[1];
			if (tmp != DEFINDEXNO)
			{
				pbb = (INT16U*)GetDBAddr(DBCfgs[pInfo->DevID].Info.Real.LogDevID[1], YCDATA, FALSE);
				pbb[tmp] = val;
			}
		}
	}
}

/*------------------------------------------------------------------*/
/*函数名称:DBWriteDD()												*/
/*函数功能:数据库电度写操作										*/
/*输入说明:pData:数据指针											*/
/*			pInfo:数据信息											*/
/*------------------------------------------------------------------*/	
void DBWriteDD(INT8U *pData, struct DBInfo *pInfo)
{
	volatile INT8U	*wp, *wtmp;
	INT32U	val;
	INT16U	i, j, len, num, tmp;

	wp = (volatile INT8U*)GetDBAddr(pInfo->DevID, DDDATA, TRUE);
	num = pInfo->Start + pInfo->Num;
	len = sizeof (INT32U);
	if (num > DBCfgs[pInfo->DevID].DDNum)
		num = DBCfgs[pInfo->DevID].DDNum;
		
	for (i=pInfo->Start; i<num; i++)
	{
		val = *((INT32U*)pData + (i-pInfo->Start));
		if (DBCfgs[pInfo->DevID].Flag & FDBDDCALCULATE)
			val = (INT32U)(((long long)val * DBCfgs[pInfo->DevID].Info.Real.pDD[i].a) / DBCfgs[pInfo->DevID].Info.Real.pDD[i].b);
		for (j=0; j<len; j++)
			*(wp + i*len + j) = (INT8U)(val>>(j*8));
		
		if (DBCfgs[pInfo->DevID].Flag & FDBLOGUSE)
		{
			tmp = DBCfgs[pInfo->DevID].Info.Real.pDD[i].Index[0];
			if (tmp != DEFINDEXNO)
			{
				wtmp = (volatile INT8U*)GetDBAddr(DBCfgs[pInfo->DevID].Info.Real.LogDevID[0], DDDATA, TRUE);
				for (j=0; j<len; j++)
				*(wtmp + tmp*len + j) = (INT8U)(val>>(j*8));
			}
		}
		
		if (DBCfgs[pInfo->DevID].Flag & FDBLOG2USE)
		{
			tmp = DBCfgs[pInfo->DevID].Info.Real.pDD[i].Index[1];
			if (tmp != DEFINDEXNO)
			{
				wtmp = (volatile INT8U*)GetDBAddr(DBCfgs[pInfo->DevID].Info.Real.LogDevID[1], DDDATA, TRUE);
				for (j=0; j<len; j++)
				*(wtmp + tmp*len + j) = (INT8U)(val>>(j*8));
			}
		}
	}
}

/*------------------------------------------------------------------*/
/*函数名称:DBWriteYXDOT()											*/
/*函数功能:数据库离散遥信写操作									*/
/*输入说明:pData:数据指针											*/
/*			pInfo:数据信息											*/
/*------------------------------------------------------------------*/	
void DBWriteYXDOT(INT8U *pData, struct DBInfo *pInfo)
{
	volatile INT8U	*wp, *wtmp, *wpp, *wtt;
	INT8U	val, value, flag;
	INT16U	i, j, size, tmp, rc;
	struct DBMSGCheck	dbmsg;
	
	flag = 0;
	memset (&dbmsg, 0, sizeof (struct DBMSGCheck));
	wp = (volatile INT8U*)GetDBAddr(pInfo->DevID, YXDATA, TRUE);
	size = sizeof(struct COS_t);
	for (i=0; i<size*pInfo->Num; i+=size)
	{
		rc = pData[i] + (pData[i+1]<<8);
		if (rc > DBCfgs[pInfo->DevID].YXNum - 1)
			continue;
					
		val = *(wp + rc);
		value = pData[i+2];	
		if (DBCfgs[pInfo->DevID].Info.Real.pBI[rc].Control & FCFGBIREVERSE)
			value = value ^ 0x80;
			
		*(wp + rc) = value;
		if (val != value)	//同时写入COS 
		{
			wtmp = (volatile INT8U*)GetDBAddr(pInfo->DevID, COSDATA, TRUE);
			tmp = *wtmp;
			*wtmp = (tmp + 1) % COSLIMIT;
			
			wtmp += tmp * size + 1;
			for (j=0; j<size-1; j++)
				*(wtmp + j) = *(pData + i + j);
			*(wtmp + j) = value;
		}
		
		if (!(DBCfgs[pInfo->DevID].Flag & FDBLOGUSEFALG))
			continue;

		//检查
		if (DBCfgs[pInfo->DevID].Flag & FDBSELFUSE)
		{
			if (!(flag & 0x08))
			{
				flag |= 0x08;
				dbmsg.DevID[dbmsg.Num] = DBCfgs[pInfo->DevID].Log2DevID[0];
				dbmsg.Num++;
			}
		}
		if (DBCfgs[pInfo->DevID].Flag & FDBSELF2USE)
		{
			if (!(flag & 0x80))
			{
				flag |= 0x80;
				dbmsg.DevID[dbmsg.Num] = DBCfgs[pInfo->DevID].Log2DevID[1];
				dbmsg.Num++;
			}
		}	

		if (DBCfgs[pInfo->DevID].Flag & FDBLOGUSE)
		{
			rc = DBCfgs[pInfo->DevID].Info.Real.pBI[rc].Index[0];
			if (rc != DEFINDEXNO)
			{
				wpp = (volatile INT8U*)GetDBAddr(DBCfgs[pInfo->DevID].Info.Real.LogDevID[0], YXDATA, TRUE);
				wpp[rc] = value;
				
				if (val != value)

⌨️ 快捷键说明

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