Flash资源紧张,我可以关掉所有模块的DEV_ERROR_DETECT么?

发布于 2022-05-16 16:47:20
  • MCU:S32K14x

项目所采用的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”).

查看更多

关注者
0
被浏览
633
2 个回答
AaronFU
AaronFU 认证专家 2022-05-16
每天进步一点点

按照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动作则在量产后关闭。当然,这种做法对于减少代码空间作用不大。

以上思路供参考。

jasonal
jasonal 2022-08-01
这家伙很懒,什么也没写!

DET 可以全局关闭或者按照模块关闭,一般在开发过程中还是很有用的,可以在早期就找到一些bug.
在开发晚期和SOP以后,一般都是关掉的。
至于code size optimization, 需要自己分析code size, 分析到底哪个component太大了,可以添加一些compile optimization. 一般来说 Os 可以 -Osize。其他的需要参考 compiler 的文档,进行不同程度的优化。

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览