当前位置:   article > 正文

《AutoSar实战》读写DID之三:代码实现_autosar did

autosar did


->返回总目录<-

前言

本系列主要基于DaVinCi工具链来展开具体DID读写的配置以及最终实现。
DID读写功能实现流程包括如下几点:
1, CDD准备 2, 工具链配置 3, 代码实现

本文讲述流程3
在这里插入图片描述
话不多说,走你~

一、检查生成的接口以及数据类型

书接上文《AutoSar实战》读写DID之二:工具链配置,我们已经完成了基于DaVinci 工具链 DID 0x6666 的配置以及接口的生成。

打开工程中的SWC(AppDiag.c),并检查以下生成的内容是否齐全了。

1. 读DID函数接口生成

在这里插入图片描述

2. 写DID函数接口生成

在这里插入图片描述

3. 写NvM接口生成

该类接口,由RTE生成,在Rte_AppDIag.h文件中生成。(SWC名称:AppDIag)
看下图可知,其实就是对底层NvM的函数NvM_WriteBlock和NvM_GetErrorStatus接口进行二次封装了。
1)写入NvM接口

4. RAM数组生成

该数组和ROM之间有着映射关系。它里面存储的数据会在下电时清除,上电时重新把ROM的数据Copy一次。
在这里插入图片描述

~

二、代码编写

1. 读DID

博主这里通过再次封装一个函数来实现了,如下图。
在这里插入图片描述

关于上图的生成接口的解析参考下表的技术文档描述:
在这里插入图片描述

形参Data的数据类型为uint8*,通过函数形参的方式将RAM上电存储的数据 赋值在形参Data中
在这里插入图片描述

具体实现

Std_ReturnType	DiagApp_ReadDID_6666_ChunFengYouXin(uint8 *p_bufptr_U8A)
{

  uint8	i;

  for( i = 0; i < sizeof(Rte_AppDiag_NvMShw_6666_ChunFengYouXin); i++)
  {
    p_bufptr_U8A[i] = Rte_AppDiag_NvMShw_6666_ChunFengYouXin[i];
  }

  return		(E_OK);

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

~

2. 写DID

博主这里通过再次封装一个函数来实现了,如下图。
在这里插入图片描述

关于上图的生成接口的解析参考下表的技术文档描述:
在这里插入图片描述

形参ErrorCode的数据类型为Dcm_NegativeResponseCodeType* :uint8*,通过函数形参的方式将写入不成功的情况返回NRC给底层DCM模块。
在这里插入图片描述

具体实现

/* 定义写数据的动作状态 0:未执行写操作; 1:正在执行写操作 */
typedef enum
{
  WRITEDID_NO_ACTION		=	0,
  WRITEDID_PROCESSING
} eDIDWriteStatus; 

eDIDWriteStatus	writeDID_6666; /*声明状态枚举变量*/

writeDID_6666 = WRITEDID_NO_ACTION; /* 初始化操作 */


/*
 *	 Write DID:	6666
 */
Std_ReturnType	DiagApp_WriteDID_6666_ChunFengYouXin(const uint8 *p_bufptr_U8A, uint8 *errorcode)
{
  uint8	i;
  NvM_RequestResultType		NvmErrorStatus;
  Std_ReturnType	writeDIDResult = DCM_E_OK;  /* 函数返回值变量 */

  *errorcode = DCM_E_POSITIVERESPONSE;  /* AutoSar DCM模块的标准数据,标识积极响应,等于0 */

  switch ( DiagApp_DID_Vars.writeDID_6666 ) 
  {
  case WRITEDID_NO_ACTION:
    for( i = 0; i < sizeof(Rte_AppDiag_NvMShw_6666_ChunFengYouXin); i++)
    {
      Rte_AppDiag_NvMShw_6666_ChunFengYouXin[i] = p_bufptr_U8A[i]; /* 将诊断仪要写入的数据存储再RAM中 */
    }

    (void)Rte_Call_PS_AppDiagDID_6666_ChunFengYouXin_WriteBlock(Rte_AppDiag_NvMShw_6666_ChunFengYouXin);   /* 调用写数据接口,将数据写入NVM */

    DiagApp_DID_Vars.writeDID_6666 = WRITEDID_PROCESSING;

    writeDIDResult = DCM_E_PENDING;
    break;
  case WRITEDID_PROCESSING:
    (void)Rte_Call_PS_AppDiagDID_6666_ChunFengYouXin_GetErrorStatus(&NvmErrorStatus); /* 获取NvM写入状态是否存在错误 */

    switch(NvmErrorStatus)
    {
    case NVM_REQ_OK:
      writeDIDResult = DCM_E_OK; /* AutoSar DCM模块的标准数据,标识积极响应,等于0 */

      DiagApp_DID_Vars.writeDID_6666 = WRITEDID_NO_ACTION;
      break;
    case NVM_REQ_PENDING:
      writeDIDResult = DCM_E_PENDING; /* AutoSar DCM模块的标准数据,标识正在执行,等于10 */
      break;
    default:
      writeDIDResult = DCM_E_NOT_OK; /* AutoSar DCM模块的标准数据,标识未成功执行操作,等于1 */

      DiagApp_DID_Vars.writeDID_6666 = WRITEDID_NO_ACTION;

      *errorcode = DCM_E_GENERALPROGRAMMINGFAILURE; /* AutoSar DCM模块的标准数据,标识NRC72,等于114 */
      break;
    }
    break;
  default:
    writeDIDResult = DCM_E_NOT_OK;

    DiagApp_DID_Vars.writeDID_6666 = WRITEDID_NO_ACTION;
    break;
  }

  return		(writeDIDResult);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68

总结

博主是AutoSar小白,如果哪里表达的有问题,还请大佬们指点指点哈。接下来,让我们在后面的博文再相会哈~

->返回总目录<-

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/368436?site
推荐阅读
相关标签
  

闽ICP备14008679号