嵌入式系统的报错设计

嵌入式系统中的报错设计,这个报错系统是配合状态机使用的,能增加代码的易读性。

/******************************************
*报错总共分为两种:1.需要进行状态转移
*                2.不进行状态转移,不影响程序执行
*                这里把两种故障的标志位分开,以便区别,分别是errorFlag和errorNoInfluenceFlag
* 如果需要从报错态转到恢复态,则在报错态中加errorFlag的判断,然后进行转换
* *****************************************/

typedef unsigned int   uint32_t;
typedef unsigned short uint16_t;
typedef unsigned char  uint8_t;

typedef enum{
	n_SYS_CLOSE=0,
	n_SYS_OPEN=1,
	n_SYS_ERROR=2,
}SysStateEnum;
SysStateEnum sysState;//系统状态,状态机
uint8_t sysTime;//系统时间,状态机

uint8_t errorFlag;//故障标志,1:有故障 0:无故障
uint8_t errorNoInfluenceFlag;//对系统无影响的故障标志,1:有故障 0:无故障
uint16_t errorCode;//报错的故障代码,每个bit是一个故障

//报错的变量
uint8_t errorNoSensor;//无传感器-报错
uint8_t errorTempTooHigh;//温度过高-报错
uint8_t errorTempTooLow;//温度过低-报错

typedef struct 
{
	uint8_t *pError;//报错变量
	uint16_t errorBit;//报错产生的标志位
	uint8_t needChangeState;//是否需要状态转移
	uint8_t errorState;//要转换到的系统状态,配合状态机使用

}ErrorStruct;

const ErrorStruct ERROR_ARR[]=//故障数组
{
	{&errorNoSensor,0X0001,1,n_SYS_ERROR},
	{&errorTempTooHigh,0X0002,1,n_SYS_ERROR},
	{&errorTempTooLow,0X8000,0,n_SYS_CLOSE},
};


void main(void)
{
	while(1)
	{
		if(timer1ms)
		{
			timer1ms = 0;
			signalDeal();
			errorDeal();

			switch(sysState)//状态机,这里具体实现先不用管
			{
				case n_SYS_CLOSE:
					break;
				case n_SYS_OPEN:
					break;
				case n_SYS_ERROR:
					if(errorFlag == 0)
					{
						sysStateTransition(n_SYS_CLOSE,0);
					}
					break;
				default:
					break;
			}
		}
	}
}


/*
  *@brief  signalDeal: 信号的产生
  *@param  
  *@retval None
  */
void signalDeal(void)
{
	if(1)//加判断条件
	{
		errorNoSensor = 1;
	}
	if(1)//加判断条件
	{
		errorTempTooHigh = 1;
	}
	if(1)//加判断条件
	{
		errorTempTooLow = 1;
	}
}

/*
  *@brief  errorDeal: 报错的产生和取消
  *@param  
  *@retval None
  */
void errorDeal(void)
{
	uint8_t i;
	uint8_t flg = 1;//普通故障标志
	uint8_t flg1 = 1;//无影响故障标志
	for(i=0;i<sizeof(ERROR_ARR)/sizeof(ERROR_ARR[0]);i++)
	{
		if(*(ERROR_ARR[i].pError))
		{
			errorCode |= ERROR_ARR[i].errorBit;
			if(ERROR_ARR[i].needChangeState)
			{
				flg = 0;
				errorCode |= ERROR_ARR[i].errorBit;
				if(errorFlag == 0)
				{
					errorFlag = 1;
					sysStateTransition(ERROR_ARR[i].errorState,0);
				}
			}
			else
			{
				errorNoInfluenceFlag = 1;
				flg1 = 0;
			}
		}
		else
		{
			errorCode &= (~ERROR_ARR[i].errorBit);
		}
	}
	if(flg == 1)
	{
		errorFlag = 0;
	}
	if(flg1 == 1)
	{
		errorNoInfluenceFlag = 0;
	}
}
/*
  *@brief  sysStateTransition: 状态切换
  *@param  sta:系统状态
  *@param  time:预留
  *@retval None
  */
void sysStateTransition(SysStateEnum sta,uint8_t time)
{
	sysState = sta;
	sysTime = time;
}

/*
  *@brief  clearAllError: 清除报错
  *@param  
  *@retval None
  */
void clearAllError(void)
{
	errorFlag = 0;
	errorCode = 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值