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

📄 9311db.c

📁 详细介绍了arm7-at91r40008,的开发全过程
💻 C
📖 第 1 页 / 共 5 页
字号:
				{
					wtt = (volatile INT8U*)GetDBAddr(DBCfgs[pInfo->DevID].Info.Real.LogDevID[0], COSDATA, TRUE);
					tmp = *wtt;
					*wtt = (tmp + 1) % COSLIMIT;
					
					wtt += tmp * size + 1;
					*(wtt + 0) = (INT8U)(rc & 0xFF);
					*(wtt + 1) = (INT8U)((rc>>8) & 0xFF);
					*(wtt + 2) = value;
					
					//检查
					if (!(flag & 0x01))
					{
						flag |= 0x01;
						dbmsg.DevID[dbmsg.Num] = DBCfgs[pInfo->DevID].Info.Real.LogDevID[0];
						dbmsg.Num++;
					}
					
					tmp = DBCfgs[pInfo->DevID].Info.Real.LogDevID[0];
					if (DBCfgs[tmp].Flag & FDBLOGUSEFALG)
					{
						if ((DBCfgs[tmp].Flag & FDBSELFUSE) && (!(flag & 0x02)))
						{
							flag |= 0x02;
							dbmsg.DevID[dbmsg.Num] = DBCfgs[tmp].Log2DevID[0];
							dbmsg.Num++;
						}
						if ((DBCfgs[tmp].Flag & FDBSELF2USE) && (!(flag & 0x04)))
						{
							flag |= 0x04;
							dbmsg.DevID[dbmsg.Num] = DBCfgs[tmp].Log2DevID[1];
							dbmsg.Num++;
						}
					}
				}
			}
		}
		
		if (DBCfgs[pInfo->DevID].Flag & FDBLOG2USE)
		{
			rc = DBCfgs[pInfo->DevID].Info.Real.pBI[rc].Index[1];			
			if (rc != DEFINDEXNO)
			{
				wpp = (volatile INT8U*)GetDBAddr(DBCfgs[pInfo->DevID].Info.Real.LogDevID[1], YXDATA, TRUE);
				wpp[rc] = value;
				
				if (val != value)
				{
					wtt = (volatile INT8U*)GetDBAddr(DBCfgs[pInfo->DevID].Info.Real.LogDevID[1], COSDATA, TRUE);
					tmp = *wtt;
					*wtt = (tmp + 1) % COSLIMIT;
					
					wtt += tmp * size + 1;
					*(wtt + 0) = (INT8U)(rc & 0xFF);
					*(wtt + 1) = (INT8U)((rc>>8) & 0xFF);
					*(wtt + 2) = value;
					
					//检查
					if (!(flag & 0x10))
					{
						flag |= 0x10;
						dbmsg.DevID[dbmsg.Num] = DBCfgs[pInfo->DevID].Info.Real.LogDevID[1];
						dbmsg.Num++;
					}
					
					tmp = DBCfgs[pInfo->DevID].Info.Real.LogDevID[1];
					if (DBCfgs[tmp].Flag & FDBLOGUSEFALG)
					{
						if ((DBCfgs[tmp].Flag & FDBSELFUSE) && (!(flag & 0x20)))
						{
							flag |= 0x20;
							dbmsg.DevID[dbmsg.Num] = DBCfgs[tmp].Log2DevID[0];
							dbmsg.Num++;
						}
						if ((DBCfgs[tmp].Flag & FDBSELF2USE) && (!(flag & 0x40)))
						{
							flag |= 0x40;
							dbmsg.DevID[dbmsg.Num] = DBCfgs[tmp].Log2DevID[1];
							dbmsg.Num++;
						}
					}
				}				
			}
		}

	}//for
	
	if (flag)
		DBMsgSend(&dbmsg, FCOS);
		
	OSFlagPost (SysPorts[0].Event, FCOS, OS_FLAG_SET, &flag);
	if (flag != OS_NO_ERR)
	{
			ErrorInfo(OSPrioCur, "数据库发送失败576");
	}
}

/*------------------------------------------------------------------*/
/*函数名称:DBWriteYX()												*/
/*函数功能:数据库遥信写操作										*/
/*输入说明:pData:数据指针											*/
/*			pInfo:数据信息											*/
/*------------------------------------------------------------------*/	
void DBWriteYX(INT8U *pData, struct DBInfo *pInfo)
{
	volatile INT8U	*wp, *wtmp, *wpp, *wtt;
	INT8U	val, value, flag;
	INT16U	i, num, tmp, rc;
	struct DBMSGCheck	dbmsg;
	
	flag = 0;
	memset (&dbmsg, 0, sizeof (struct DBMSGCheck));

	wp = (volatile INT8U*)GetDBAddr(pInfo->DevID, YXDATA, TRUE);
	num = pInfo->Start + pInfo->Num;
	if (num > DBCfgs[pInfo->DevID].YXNum)
		num = DBCfgs[pInfo->DevID].YXNum;

	for (i=pInfo->Start; i<num; i++)
	{
		val = *(wp + i);
		value = pData[i - pInfo->Start];
		if (DBCfgs[pInfo->DevID].Info.Real.pBI[i].Control & FCFGBIREVERSE)
			value = value ^ 0x80;
		
		*(wp + i) = value;
		if (val != value)	//写入COS
		{
			wtmp = (volatile INT8U*)GetDBAddr(pInfo->DevID, COSDATA, TRUE);
			tmp = *wtmp;
			*wtmp = (tmp + 1) % COSLIMIT;
			
			wtmp += tmp * 3 + 1;
			*(wtmp + 0) = (INT8U)(i & 0xFF);
			*(wtmp + 1) = (INT8U)((i>>8) & 0xFF);
			*(wtmp + 2) = 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[i].Index[0];
			if (rc != DEFINDEXNO)
			{
				wpp = (volatile INT8U*)GetDBAddr(DBCfgs[pInfo->DevID].Info.Real.LogDevID[0], YXDATA, TRUE);
				wpp[rc] = value;
				
				if (val != value)
				{
					wtt = (volatile INT8U*)GetDBAddr(DBCfgs[pInfo->DevID].Info.Real.LogDevID[0], COSDATA, TRUE);
					tmp = *wtt;
					*wtt = (tmp + 1) % COSLIMIT;

					wtt += tmp * 3 + 1;
					*(wtt + 0) = (INT8U)(rc & 0xFF);
					*(wtt + 1) = (INT8U)((rc>>8) & 0xFF);
					*(wtt + 2) = value;
					
					//检查
					if (!(flag & 0x01))
					{
						flag |= 0x01;
						dbmsg.DevID[dbmsg.Num] = DBCfgs[pInfo->DevID].Info.Real.LogDevID[0];
						dbmsg.Num++;
					}
					
					tmp = DBCfgs[pInfo->DevID].Info.Real.LogDevID[0];
					if (DBCfgs[tmp].Flag & FDBLOGUSEFALG)
					{
						if ((DBCfgs[tmp].Flag & FDBSELFUSE) && (!(flag & 0x02)))
						{
							flag |= 0x02;
							dbmsg.DevID[dbmsg.Num] = DBCfgs[tmp].Log2DevID[0];
							dbmsg.Num++;
						}
						if ((DBCfgs[tmp].Flag & FDBSELF2USE) && (!(flag & 0x04)))
						{
							flag |= 0x04;
							dbmsg.DevID[dbmsg.Num] = DBCfgs[tmp].Log2DevID[1];
							dbmsg.Num++;
						}
					}

				}
			}
		}
				
		if (DBCfgs[pInfo->DevID].Flag & FDBLOG2USE)
		{
			rc = DBCfgs[pInfo->DevID].Info.Real.pBI[i].Index[1];
			if (rc != DEFINDEXNO)
			{
				wpp = (volatile INT8U*)GetDBAddr(DBCfgs[pInfo->DevID].Info.Real.LogDevID[1], YXDATA, TRUE);
				wpp[rc] = value;
				
				if (val != value)
				{
					wtt = (volatile INT8U*)GetDBAddr(DBCfgs[pInfo->DevID].Info.Real.LogDevID[1], COSDATA, TRUE);
					tmp = *wtt;
					*wtt = (tmp + 1) % COSLIMIT;					
					
					wtt += tmp * 3 + 1;
					*(wtt + 0) = (INT8U)(rc & 0xFF);
					*(wtt + 1) = (INT8U)((rc>>8) & 0xFF);
					*(wtt + 2) = value;
				
					//检查
					if (!(flag & 0x10))
					{
						flag |= 0x10;
						dbmsg.DevID[dbmsg.Num] = DBCfgs[pInfo->DevID].Info.Real.LogDevID[1];
						dbmsg.Num++;
					}
					
					tmp = DBCfgs[pInfo->DevID].Info.Real.LogDevID[1];
					if (DBCfgs[tmp].Flag & FDBLOGUSEFALG)
					{
						if ((DBCfgs[tmp].Flag & FDBSELFUSE) && (!(flag & 0x20)))
						{
							flag |= 0x20;
							dbmsg.DevID[dbmsg.Num] = DBCfgs[tmp].Log2DevID[0];
							dbmsg.Num++;
						}
						if ((DBCfgs[tmp].Flag & FDBSELF2USE) && (!(flag & 0x40)))
						{
							flag |= 0x40;
							dbmsg.DevID[dbmsg.Num] = DBCfgs[tmp].Log2DevID[1];
							dbmsg.Num++;
						}
					}
				
				}
			}
		}		
	
	}//for
	
	
	if (flag)
		DBMsgSend(&dbmsg, FCOS);
		
	OSFlagPost (SysPorts[0].Event, FCOS, OS_FLAG_SET, &flag);
	if (flag != OS_NO_ERR)
	{
			ErrorInfo(OSPrioCur, "数据库发送失败744");
	}
}

/*------------------------------------------------------------------*/
/*函数名称:DBWriteSOE()											*/
/*函数功能:数据库SOE写操作											*/
/*输入说明:pData:数据指针											*/
/*			pInfo:数据信息											*/
/*------------------------------------------------------------------*/	
void DBWriteSOE(INT8U *pData, struct DBInfo *pInfo)
{
	volatile INT8U	*wp, *wtmp;
	INT8U	value, flag;
	INT16U	i, j, size, num, tmp;
	struct SOE_t *soe;
	struct DBMSGCheck	dbmsg;
	
	flag = 0;
	memset (&dbmsg, 0, sizeof (struct DBMSGCheck));
	
	wtmp = (volatile INT8U*)GetDBAddr(pInfo->DevID, SOEDATA, TRUE);
	tmp = *wtmp;
	
	size = sizeof(struct SOE_t);
	for (i=0; i<pInfo->Num; i++)
	{
		wp = wtmp + tmp * size + 1;
		for (j=0; j<size; j++)
		{
			if (j == 2)
			{
				num = *(pData + i*size) + (*(pData + i*size + 1)<<8);
				if (DBCfgs[pInfo->DevID].Info.Real.pBI[num].Control & FCFGBIREVERSE)
				{
					value = *(pData + i*size + j);
					value = value ^ 0x80;
					*(wp + j) = value;
					continue;
				}
			}
			*(wp + j) = *(pData + i*size + j);
		}
	
		tmp = (tmp + 1) % SOELIMIT;
	}
	*wtmp = tmp;
				
	if (!(DBCfgs[pInfo->DevID].Flag & FDBLOGUSEFALG))
		return;
		
	//检查
	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)
	{
		wtmp = (volatile INT8U*)GetDBAddr(DBCfgs[pInfo->DevID].Info.Real.LogDevID[0], SOEDATA, TRUE);
		num = *wtmp;
		for (i=0; i<pInfo->Num; i++)
		{
			soe = (struct SOE_t*)((struct SOE_t*)pData + i);
			tmp = DBCfgs[pInfo->DevID].Info.Real.pBI[soe->No].Index[0];
			if (tmp != DEFINDEXNO)
			{
				wp = wtmp + num * size + 1;
				*(wp + 0) = (INT8U)(tmp & 0xFF);
				*(wp + 1) = (INT8U)((tmp>>8) & 0xFF);
				value = *((INT8U*)soe + 2);
				if (DBCfgs[pInfo->DevID].Info.Real.pBI[soe->No].Control & FCFGBIREVERSE)
					value = value ^ 0x80;
				*(wp + 2) = value;
				for (j=3; j<size; j++)
					*(wp + j) = *((INT8U*)soe + j);
	
				num = (num + 1) % SOELIMIT;
				*wtmp = num;
			}
		}
		
		//检查
		if (!(flag & 0x01))
		{
			flag |= 0x01;
			dbmsg.DevID[dbmsg.Num] = DBCfgs[pInfo->DevID].Info.Real.LogDevID[0];
			dbmsg.Num++;
		}
	
		tmp = DBCfgs[pInfo->DevID].Info.Real.LogDevID[0];
		if (DBCfgs[tmp].Flag & FDBLOGUSEFALG)
		{
			if ((DBCfgs[tmp].Flag & FDBSELFUSE) && (!(flag & 0x02)))
			{
				flag |= 0x02;
				dbmsg.DevID[dbmsg.Num] = DBCfgs[tmp].Log2DevID[0];
				dbmsg.Num++;
			}
			if ((DBCfgs[tmp].Flag & FDBSELF2USE) && (!(flag & 0x04)))
			{
				flag |= 0x04;
				dbmsg.DevID[dbmsg.Num] = DBCfgs[tmp].Log2DevID[1];
				dbmsg.Num++;
			}
		}
	}

	if (DBCfgs[pInfo->DevID].Flag & FDBLOG2USE)
	{
		wtmp = (volatile INT8U*)GetDBAddr(DBCfgs[pInfo->DevID].Info.Real.LogDevID[1], SOEDATA, TRUE);
		num = *wtmp;
		for (i=0; i<pInfo->Num; i++)
		{
			soe = (struct SOE_t*)((struct SOE_t*)pData + i);
			tmp = DBCfgs[pInfo->DevID].Info.Real.pBI[soe->No].Index[1];
			if (tmp != DEFINDEXNO)
			{
				wp = wtmp + num * size + 1;
				*(wp + 0) = (INT8U)(tmp & 0xFF);
				*(wp + 1) = (INT8U)((tmp>>8) & 0xFF);
				value = *((INT8U*)soe + 2);
				if (DBCfgs[pInfo->DevID].Info.Real.pBI[soe->No].Control & FCFGBIREVERSE)
					value = value ^ 0x80;
				*(wp + 2) = value;
				for (j=3; j<size; j++)
					*(wp + j) = *((INT8U*)soe + j);
	
				num = (num + 1) % SOELIMIT;
				*wtmp = num;
			}
		}
		
		//检查
		if (!(flag & 0x10))
		{
			flag |= 0x10;
			dbmsg.DevID[dbmsg.Num] = DBCfgs[pInfo->DevID].Info.Real.LogDevID[1];
			dbmsg.Num++;
		}
		
		tmp = DBCfgs[pInfo->DevID].Info.Real.LogDevID[1];
		if (DBCfgs[tmp].Flag & FDBLOGUSEFALG)
		{
			if ((DBCfgs[tmp].Flag & FDBSELFUSE) && (!(flag & 0x20)))
			{
				flag |= 0x20;
				dbmsg.DevID[dbmsg.Num] = DBCfgs[tmp].Log2DevID[0];
				dbmsg.Num++;
			}
			if ((DBCfgs[tmp].Flag & FDBSELF2USE) && (!(flag & 0x40)))
			{
				flag |= 0x40;
				dbmsg.DevID[dbmsg.Num] = DBCfgs[tmp].Log2DevID[1];
				dbmsg.Num++;
			}
		}
	}	

	if (flag)
		DBMsgSend(&dbmsg, FSOE);
}

/*------------------------------------------------------------------*/
/*函数名称:DBWriteLB()												*/
/*函数功能:数据库录波写操作		 								*/
/*输入说明:pData:数据指针											*/
/*			pInfo:数据信息											*/
/*------------------------------------------------------------------*/	
void DBWriteLB(INT8U *pData, struct DBInfo *pInfo)			
{			
	volatile INT8U	*wp, *wtmp;
	INT8U	cur, size, limit;
	INT16U	i, j, len1, len2;
	struct LBInfo_t		info;
	
	size = sizeof (struct LBInfo_t);
	if (NVRAMSIZE == 0x20000)
	{
		limit = LBLIMIT;
		if (pInfo->SuperID >= FDNum)
		{
			wtmp = LBMANAGADDR;
		}
		else
		{
			wtmp = LBMANAGADDR + pInfo->SuperID * (limit + 1);
		}
	}
	else
	{
		limit = 0;
		wtmp = LBMANAGADDR;
	}
		
	cur = *wtmp;
	if (limit)
		cur = (cur + limit - pInfo->DevID) % limit;
	else
		cur = 0;
	
	if (pInfo->Start == 0)	//申请新的存储区
	{
		i = *(wtmp + cur + 1);
		if (i)
		{
			if (limit)
				cur = (cur + 1) % limit;
			else
				cur = 0;
		}
		memset ((INT8U*)&info, 0, size);
	}
	else if (pInfo->Start == 0xFFFF)
	{
		wp = LBINFOADDR + ((pInfo->SuperID*limit) + cur) * LBINFOSIZE;
		for (i=0; i<size; i++)
		{
			*((INT8U*)&info + i) = *(wp + i);
		}
	}
	else 
	{
		info.FDIndex = pInfo->SuperID;
		info.Length = (pInfo->Start & 0xFF) * ADBIT + (pInfo->Start >>8);
	}

	if (pInfo->Type == LBINFO)
	{
		wp = LBINFOADDR + ((pInfo->SuperID*limit) + cur) * LBINFOSIZE;
		for (i=0; i<size; i++)
		{
			*(wp + i) = *(pData + i);
		}
		
		*(wtmp + cur + 1) = *pData;		//同时更换

⌨️ 快捷键说明

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