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

📄 9311db.c

📁 详细介绍了arm7-at91r40008,的开发全过程
💻 C
📖 第 1 页 / 共 5 页
字号:
		return;
	}

	len2 = (pInfo->Num & 0xFF) * ADBIT + (pInfo->Num >>8);
	if (info.Length*2 >= LBBLOCK)
	{
		len1 = 0;
	}
	else if ((info.Length + len2)*2 > LBBLOCK)
	{
		len1 = LBBLOCK/2 - info.Length;
		len2 -= len1;
	}
	else
	{
		len1 = len2;
		len2 = 0;
	}
	
	if ((limit == 0) || (info.Length + len2) >= LB2LIMIT)	//使用区限制
	{
		len2 = 0;
	}
	
	if (len1)
	{	
		for (i=0; i<ADNUM; i++)
		{
			wp = LBADDR + LBFDBLOCK*((pInfo->SuperID*limit) + cur) + LBBLOCK*i + info.Length*2;
			for (j=0; j<len1*2; j++)
			{
				*(wp + j) = *(pData + i*(len1+len2)*2 + j);
			}
		}
	}

	if (len2)
	{
		for (i=0; i<ADNUM; i++)
		{
			wp = LBADDR2 + LB2LIMIT*i + (info.Length+len1)*2 - LBBLOCK;
			for (j=0; j<len2*2; j++)
			{
				*(wp + j) = *(pData + i*(len1+len2)*2 + len1*2 + j);
			}
		}		
	}
	
	info.Length += len1 + len2;	

	*wtmp = cur;
	*(wtmp + cur + 1) = 0x3F;
	if ((info.Length*2 > LBBLOCK) || (limit == 0))
	{
		wtmp = LBMANAG2ADDR;
		*wtmp = cur + (INT8U)(info.FDIndex<<4);
	}


	wp = LBINFOADDR + ((pInfo->SuperID*limit) + cur) * LBINFOSIZE;
	for (i=0; i<size; i++)
	{
		*(wp + i) = *((INT8U*)&info + i);
	}
	
}


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

	oldID = OSPrioCur;
	OSTaskChangePrio(OSPrioCur, HID);

	switch (pInfo->Type)
	{
		case YCDOTDATA:
			OSTaskChangePrio(OSPrioCur, oldID);
			return (FALSE);
			break;
			
		case YCDATA:
			if (pInfo->Start >= DBCfgs[pInfo->DevID].YCNum)
			{
				OSTaskChangePrio(OSPrioCur, oldID);
				return (FALSE);
			}
			
			pb = (INT16U*)GetDBAddr(pInfo->DevID, YCDATA, FALSE);
			tmp = pInfo->Num;
			if (pInfo->Start + tmp > DBCfgs[pInfo->DevID].YCNum)
				tmp = DBCfgs[pInfo->DevID].YCNum - pInfo->Start;
			pInfo->Num = tmp;	//realnum
			
			if (DBCfgs[pInfo->SuperID].Flag & FDBLOGIC2)		//log2
			{
				if (DBCfgs[pInfo->DevID].Flag & FDBLOGIC)		//log1
				{
					tmp = tmp * sizeof(INT16S);
					memcpy (pData, &pb[pInfo->Start], tmp);
				}
				else
				{
					j = 0;					
					for (i=0; i<DBCfgs[pInfo->DevID].YCNum; i++)
					{
						if (j == pInfo->Num)
							break;
						if (DBCfgs[pInfo->DevID].Info.Real.pAI[i].Control & FCFGYCSEND)
						{
							memcpy (&pData[2*j], &pb[i], sizeof(INT16S));
							j++;
						}
					}
					if (j == 0)
					{
						OSTaskChangePrio(OSPrioCur, oldID);
						return (FALSE);
					}
					pInfo->Num = j;
				}
			}
			else
			{
				tmp = tmp * sizeof(INT16S);
				memcpy (pData, &pb[pInfo->Start], tmp);
			}
			break;
			
		case YXDOTDATA:
			OSTaskChangePrio(OSPrioCur, oldID);
			return (FALSE);
			break;
			
		case YXDATA:
			if (pInfo->Start >= DBCfgs[pInfo->DevID].YXNum)
			{
				OSTaskChangePrio(OSPrioCur, oldID);
				return (FALSE);
			}
			
			rp = (volatile INT8U*)GetDBAddr(pInfo->DevID, YXDATA, TRUE);
			num = pInfo->Start + pInfo->Num;
			if (num > DBCfgs[pInfo->DevID].YXNum)
				num = DBCfgs[pInfo->DevID].YXNum;
			pInfo->Num = num;	//realnum
			
			if (DBCfgs[pInfo->SuperID].Flag & FDBLOGIC2)		//log2
			{
				if (DBCfgs[pInfo->DevID].Flag & FDBLOGIC)		//log1
				{
					for (i=pInfo->Start; i<num; i++)
						pData[i - pInfo->Start] = *(rp + i);
				}
				else
				{
					j = 0;					
					for (i=0; i<DBCfgs[pInfo->DevID].YXNum; i++)
					{
						if (j == pInfo->Num)
							break;
						if (DBCfgs[pInfo->DevID].Info.Real.pBI[i].Control & FCFGBISEND)
						{
							pData[j] = *(rp + i);
							j++;
						}
					}
					if (j == 0)
					{
						OSTaskChangePrio(OSPrioCur, oldID);
						return (FALSE);
					}
					pInfo->Num = j;
				}
			}
			else
			{
				for (i=pInfo->Start; i<num; i++)
					pData[i - pInfo->Start] = *(rp + i);
			}
			
			break;

		case SOEDATA:
			rc = DBReadSOE(pData, pInfo);
			OSTaskChangePrio(OSPrioCur, oldID);
			return (rc);
			break;
					
		case COSDATA:
			rc = DBReadCOS(pData, pInfo);
			OSTaskChangePrio(OSPrioCur, oldID);
			return (rc);
			break;
					
		case DDDATA:
			rp = (volatile INT8U*)GetDBAddr(pInfo->DevID, DDDATA, TRUE);
			tmp = pInfo->Num;
			if (pInfo->Start + tmp > DBCfgs[pInfo->DevID].DDNum)
				tmp = DBCfgs[pInfo->DevID].DDNum - pInfo->Start;
			pInfo->Num = tmp;	//realnum
			
			if (DBCfgs[pInfo->SuperID].Flag & FDBLOGIC2)		//log2
			{
				if (DBCfgs[pInfo->DevID].Flag & FDBLOGIC)		//log1
				{
					tmp = tmp * sizeof(INT32U);
					for(i=0; i<tmp; i++)
						pData[i] = *(rp + pInfo->Start*4 + i);
				}
				else
				{
					j = 0;					
					for (i=0; i<DBCfgs[pInfo->DevID].DDNum; i++)
					{
						if (j == pInfo->Num)
							break;
						if (DBCfgs[pInfo->DevID].Info.Real.pDD[i].Control & FCFGDDSEND)
						{
							for (size=0; size<4; size++)
								pData[4*j + size] = *(rp + 4*i + size);
							j++;
						}
					}
					if (j == 0)
					{
						OSTaskChangePrio(OSPrioCur, oldID);
						return (FALSE);
					}
					pInfo->Num = j;
				}
			}
			else
			{			
				tmp = tmp * sizeof(INT32U);
				for(i=0; i<tmp; i++)
					pData[i] = *(rp + pInfo->Start*4 + i);
			}
		
			break;			
		
		case FRESET:
			rp = FRESETADDR;
			*pData = *rp;

			break;
		
		case FENTERBOOT:
			rp = FENTERBOOTADDR;
			*pData = *rp;

			break;
		
		case ABSTIME:
			OSTaskChangePrio(OSPrioCur, oldID);
			return (FALSE);
			break;
		
		case BIDATA:
			rp = BIVALADDR;
			size = (pInfo->Num - 1) / 8 + 1;
			for (i=0; i<size; i++)
				*(pData + i) = *(rp + i);
				
			break;

		case FDRLOC:
			if (pInfo->Num >= 15)
				pInfo->Num = 0;
			rp = FDRLOCADDR;
			*pData = *(rp + pInfo->Num);

			break;

					
		case INFODATA:
			rp = SYSINFOADDR;
			*pData = *rp;
			size = sizeof (struct SysInfo_t);
			
			tmp = pInfo->Start;
			for (i=0; i<pInfo->Num; i++)
			{
				rp += tmp * size + 1;
				for (j=0; j<size; j++)
					*(pData + i*size + j + 1) = *(rp + j);

				tmp = (tmp + 1) % SYSINFOLIMIT;
			}
			
			break;
		
		case LBDATAUA:
		case LBDATAUC:
		case LBDATAIA:
		case LBDATAIB:
		case LBDATAIC:
		case LBDATAIO:
		case LBINFO:		
			DBReadLB(pData, pInfo);
		
			break;
		
		case YCFULLVAULE:
			if (pInfo->Start >= DBCfgs[pInfo->DevID].YCNum)
			{
				OSTaskChangePrio(OSPrioCur, oldID);
				return (FALSE);
			}
			
			tmp = pInfo->Num;
			if (pInfo->Start + tmp > DBCfgs[pInfo->DevID].YCNum)
				tmp = DBCfgs[pInfo->DevID].YCNum - pInfo->Start;
			pInfo->Num = tmp;
			
			for (i=pInfo->Start; i<tmp; i++)
			{
				for (j=0; j<SysCfg.DBAllNum; j++)
				{
					if (DBCfgs[j].Flag & (FDBLOGIC | FDBLOGIC2))
						continue;
					if ((DBCfgs[j].Flag & FDBLOGUSE) && (DBCfgs[j].Info.Real.LogDevID[0] == pInfo->DevID))
					{
						for (tmp=0; tmp<DBCfgs[j].YCNum; tmp++)
						{
							if (DBCfgs[j].Info.Real.pAI[tmp].Index[0] == i)
								*((INT16U*)pData + i) = DBCfgs[j].Info.Real.pAI[tmp].b;
						}
					}
					if ((DBCfgs[j].Flag & FDBLOG2USE) && (DBCfgs[j].Info.Real.LogDevID[1] == pInfo->DevID))
					{
						for (tmp=0; tmp<DBCfgs[j].YCNum; tmp++)
						{
							if (DBCfgs[j].Info.Real.pAI[tmp].Index[1] == i)
								*((INT16U*)pData + i) = DBCfgs[j].Info.Real.pAI[tmp].b;
						}
					}
				}
			}
			break;
				
		default:
			break;
	}
	OSTaskChangePrio(OSPrioCur, oldID);
	
	return (TRUE);
}

/*------------------------------------------------------------------*/
/*函数名称:DBReadCOS()												*/
/*函数功能:数据库读COS操作											*/
/*输入说明:pData:数据指针											*/
/*			pInfo:数据信息											*/
/*------------------------------------------------------------------*/
BOOL DBReadCOS(INT8U *pData, struct DBInfo *pInfo)
{
	BOOL	next = FALSE;
	INT8U	err;
	volatile INT8U	*rp, *rtmp;
	INT16U	i, j, size, num, tmp, rc, id, start, cur;
	struct COS_t cos;
	
	size = sizeof (struct COS_t);
	
	if (pInfo->Start >= COSLIMIT)
	{
		if ((pInfo->Start & STARTTYPE) && (DBCfgs[pInfo->SuperID].Flag & (FDBLOGIC | FDBLOGIC2)))		//变化遥信
		{
			num = 0;
			rc = DEFINDEXNO;
			for (i=0; i<DBCfgs[pInfo->SuperID].Info.Logic.DevNum; i++)
			{
				tmp = DBCfgs[pInfo->SuperID].Info.Logic.pOld[i].DevID;
				if (tmp != pInfo->DevID)
					continue;
				

				start = pInfo->Start & 0xFFF;
				rp = (volatile INT8U*)GetDBAddr(tmp, COSDATA, TRUE);
				cur = *rp;
								
				num = 0;				
				if ((DBCfgs[pInfo->SuperID].Flag & FDBLOGIC2) && (!(DBCfgs[pInfo->DevID].Flag & FDBLOGIC)))	//log2
				{
					tmp = 0;
					rc = DBCfgs[pInfo->SuperID].Info.Logic.pOld[i].COSOld;
					for (i=0; i<COSLIMIT; i++)
					{
						if (rc == cur)
							break;
						
						rtmp = rp + rc * size + 1;
						for (j=0; j<size; j++)
							*((INT8U*)&cos + j) = *(rtmp + j);
						rc = (rc + 1) % COSLIMIT;
						
						id = cos.No;
						if (DBCfgs[pInfo->DevID].Info.Real.pBI[id].Control & FCFGBISEND)
						{
							tmp++;
							if (tmp > start)
							{
								for (j=0; j<id; j++)
									if(!(DBCfgs[pInfo->DevID].Info.Real.pBI[j].Control & FCFGBISEND))
										cos.No--;
								memcpy (&pData[size*num], (INT8U*)&cos, size);
								num++;
							}
						}
						
						if (num >= pInfo->Num)
						{
							next = TRUE;
							break;
						}
					}
				}
				else
				{
					rc = DBCfgs[pInfo->SuperID].Info.Logic.pOld[i].COSOld;
					rc = (rc + start) % COSLIMIT;

					for (i=0; i<COSLIMIT; i++)
					{
						if (rc == cur)
							break;
						
						rtmp = rp + rc * size + 1;
						for (j=0; j<size; j++)
							*(pData + i*size + j) = *(rtmp + j);
						rc = (rc + 1) % COSLIMIT;
						
						num++;
						if (num >= pInfo->Num)
						{
							next = TRUE;
							break;
						}
					}
				}
				
				break;
			}	
				
			pInfo->Num = num;	//realnum	
			if (next)
			{
				rc = GetPortofDB(pInfo->DevID);
				if (rc != 0xFFFF)
				{
					OSFlagPost (SysPorts[rc].Event, FCOS, OS_FLAG_SET, &err);
					if (err != OS_NO_ERR)
					{
						ErrorInfo(OSPrioCur, "数据库发送失败1497");
						return (FALSE);
					}
				}
			}
			return (TRUE);
		}
		else
			return (FALSE);
	}
	
	rp = (volatile INT8U*)GetDBAddr(pInfo->DevID, COSDATA, TRUE);
	*pData = *rp;
	
	tmp = pInfo->Start;
	for (i=0; i<pInfo->Num; i++)
	{
		rtmp = rp + tmp * size + 1;
		for (j=0; j<size; j++)
			*(pData + i*size + j + 1) = *(rtmp + j);
		tmp = (tmp + 1) % COSLIMIT;
	}
	
	return (TRUE);
}			

/*------------------------------------------------------------------*/
/*函数名称:DBReadSOE()												*/
/*函数功能:数据库读SOE操作											*/
/*输入说明:pData:数据指针											*/
/*			pInfo:数据信息											*/
/*------------------------------------------------------------------*/
BOOL DBReadSOE(INT8U *pData, struct DBInfo *pInfo)
{
	BOOL	next = FALSE;
	INT8U	err;
	volatile INT8U	*rp, *rtmp;
	INT16U	i, j, size, num, tmp, rc, id, start, cur;
	struct SOE_t soe;
	
	size = sizeof (struct SOE_t);
	
	if (pInfo->Start >= SOELIMIT)
	{
		if ((pInfo->Start & STARTTYPE) && (DBCfgs[pInfo->SuperID].Flag & (FDBLOGIC | FDBLOGIC2)))		//变化遥信
		{
			num = 0;
			rc = DEFINDEXNO;
			for (i=0; i<DBCfgs[pInfo->SuperID].Info.Logic.DevNum; i++)
			{
				tmp = DBCfgs[pInfo->SuperID].Info.Logic.pOld[i].DevID;
				if (tmp != pInfo->DevID)
					continue;

⌨️ 快捷键说明

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