嵌入式系统中的报错设计,这个报错系统是配合状态机使用的,能增加代码的易读性。
/******************************************
*报错总共分为两种: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;
}