打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
ArcticCore重构

基于官方arc-stable-9c57d86f66be,AUTOSAR版本3.1.5

基本问题

Arctic Core中使用了VALIDATE, VALIDATE_RV, VALIDATE_NO_RV等一系列宏简化参数判断。

#if ( CAN_DEV_ERROR_DETECT == STD_ON )#define VALIDATE(_exp,_api,_err, ... )         if( !(_exp) ) {           (void)Det_ReportError(CAN_MODULE_ID,0,_api,_err);           return __VA_ARGS__;        }#define VALIDATE_NO_RV(_exp,_api,_err )         if( !(_exp) ) {           (void)Det_ReportError(CAN_MODULE_ID,0,_api,_err);           return;         }#define DET_REPORTERROR(_x,_y,_z,_q) (void)Det_ReportError(_x, _y, _z, _q)#else#define VALIDATE(_exp,_api,_err, ... )#define VALIDATE_NO_RV(_exp,_api,_err )#define DET_REPORTERROR(_x,_y,_z,_q)#endif

方法是在每一个使用到这些宏的文件中都重新定义一遍。理由比较直接,因为每个模块是否打开这些宏,都有各自的开关。

简化的方法也很直接:重复的定义,提取到头文件(validate.h)中即可。

问题在于如何处理:

  1. 每个模块的开关宏;
  2. 每个模块不同的MODULE_ID

因此,不能直接include该头文件就结束。

头文件的定义也依赖于这两个因素。

  1. 头文件中使用的开关宏取决于每个模块的开关宏;
  2. 头文件中使用的MODULE_ID取决于每个模块的MODULE_ID

即:

#ifdef __THIS_MODULE_ENABLE_VALIDATE#include <Det.h>#ifndef __THIS_MODULE_ID#error "__THIS_MODULE_ID should be defined."#endif#define VALIDATE(_exp, _api, _err)     if( !(_exp) ) {         (void)Det_ReportError(__THIS_MODULE_ID,0,_api,_err);         return __VA_ARGS__;    }#define VALIDATE_RV(_exp, _api, _err, _rv)     if( !(_exp) ) {       Det_ReportError(__THIS_MODULE_ID, _instance, _api, _err);       return _rv;     }#define VALIDATE_NO_RV(_exp, _api, _err)     if( !(_exp) ) {         (void)Det_ReportError(__THIS_MODULE_ID,0,_api,_err);         return;     }#define DET_REPORTERROR(_module, _instance, _api, _err)     Det_ReportError(_module,_instance,_api,_err)#else#define VALIDATE(_exp, _api, _err)#define VALIDATE_RV(_exp, _api, _err, _rv)#define VALIDATE_NO_RV(_exp, _api, _err)#define DET_REPORTERROR(_module, _instance, _api, _err)#endif

而使用的地方替换如下:

#if ( CAN_DEV_ERROR_DETECT == STD_ON )#define __THIS_MODULE_ENABLE_VALIDATE   1#define __THIS_MODULE_ID                MODULE_ID_CAN#endif#include <validate.h>

如此每次需要使用VALIDATE_%类宏时,只需要提供所需的编译时信息即可。

提高复用,简洁明了。

更进一步

考虑到某些模块中报错是传递的不是本模块的MODULE_ID,有可能出现某次传递其他非本模块MODULE_ID的情况。为了提高灵活性,可以考虑提供外部传入全部参数的API。如下:

#ifndef __THIS_MODULE_ID#error "__THIS_MODULE_ID should be defined."#endif#define __VALIDATE(_exp, _module, _instance, _api, _err)     if( !(_exp) ) {       Det_ReportError(_module, _instance, _api, _err);     }#define __VALIDATE_RV(_exp, _module, _instance, _api, _err, _rv)     if( !(_exp) ) {       Det_ReportError(_module, _instance, _api, _err);       return _rv;     }#define __VALIDATE_NO_RV(_exp, _module, _instance, _api, _err)     if( !(_exp) ) {       Det_ReportError(_module, _instance, _api, _err);       return;     }#define VALIDATE(_exp, _api, _err)     __VALIDATE(_exp, __THIS_MODULE_ID, 0, _api, _err)#define VALIDATE_RV(_exp, _api, _err, _rv)     __VALIDATE_RV(_exp, __THIS_MODULE_ID, 0, _api, _err, _rv)#define VALIDATE_NO_RV(_exp, _api, _err)     __VALIDATE_NO_RV(_exp, __THIS_MODULE_ID, 0, _api, _err)#define DET_REPORTERROR(_module, _instance, _api, _err)     Det_ReportError(_module,_instance,_api,_err)#else#define __VALIDATE(_exp, _module, _instance, _api, _err)#define __VALIDATE_RV(_exp, _module, _instance, _api, _err, _rv)#define __VALIDATE_NO_RV(_exp, _module, _instance, _api, _err)#define VALIDATE(_exp, _api, _err)#define VALIDATE_RV(_exp, _api, _err, _rv)#define VALIDATE_NO_RV(_exp, _api, _err)#define DET_REPORTERROR(_module, _instance, _api, _err)#endif

如有需要,可以使用__VALIDATE_%类宏。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
PHP 微信支付
Linux驱动编程必备基础知识
条码打印控件源代码,一个大公司的作品 Barcode
驱动模块使用I2C总线范例
LWIP之SOCKET的实现
js模块化历程
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服