项目所采用的Flash空间本来就只有1MB,其中采购的第三方AUTOSAR基础软件就占了一大半。看了下代码,每个BSW模块中几乎都有大量的Development Error Check相关代码,如下代码所示:
/* --- Development Error Checks --*/
#if (NVM_DEV_ERROR_DETECT == STD_ON)
/* check pointer first */
if(NvM_CheckNotNull(DataIndexPtr) == FALSE)
{
detErrorId = NVM_E_PARAM_DATA;
}
else if(NvM_CheckInitialized() == FALSE)
{
*DataIndexPtr = 0u;
detErrorId = NVM_E_NOT_INITIALIZED;
}
else if(NvM_CheckBlockId(BlockId) == FALSE)
{
*DataIndexPtr = 0u;
detErrorId = NVM_E_PARAM_BLOCK_ID;
}
else
#endif
根据AUTOSAR规范中对于这类检查的介绍,本意应该也是要用户在项目量产后关闭掉。但又觉得其中有些检查还是很有必要的,关闭后,会影响系统的鲁棒性。不知道大家都是怎做的?
以下引用自AUTOSAR SWS_BSW_00042:
Example: The EEPROM driver provides internal checking of API parameters which is
only activated for the first software integration test (“development build”) and disabled
afterwards (“deployment build”).
按照AUTOSAR标准中的说法,“development error detection”的初衷是“Extended error detection for debugging and especially integration” 量产后确实可以关闭。不过实际软件中,各家AUTOSAR供应商提供的相关检查对于系统的可靠性还是很有必要的,因此不建议删除。举个例子:如下DIO模块中在读对应Port通道前针对形参ChannelId
检查就很有必要,否则如果传入一个超范围值而被函数Dio_Ipw_ReadChannel
使用,则可能导致数组溢出等情况,出现难以预计的后果。
Dio_LevelType Dio_ReadChannel (Dio_ChannelType ChannelId )
{
....
#if (STD_ON == DIO_DEV_ERROR_DETECT)
Std_ReturnType Valid = Dio_ValidateChannel(ChannelId, DIO_READCHANNEL_ID);
if ((Std_ReturnType)E_OK == Valid)
{
#endif
ChannelLevel = Dio_Int_ReadChannel(ChannelId);
#if (STD_ON == DIO_DEV_ERROR_DETECT)
}
#endif
除了关闭与打开两个选择,某大厂则采用了第三种方案,继续以上述代码为例:
......
Std_ReturnType Valid = Dio_ValidateChannel(ChannelId, DIO_READCHANNEL_ID);
if ((Std_ReturnType)E_OK != Valid)
{
#if (STD_ON == DIO_DEV_ERROR_DETECT)
Det_ReportError(xxxx);
#endif
}
else
{
ChannelLevel = Dio_Int_ReadChannel(ChannelId);
}
......
也就是将Error的“Dectection”和“Report”两个动作分开,Detection动作不论量产前后都做,而Report动作则在量产后关闭。当然,这种做法对于减少代码空间作用不大。
以上思路供参考。