文章目录
- 前言
- 一、检查生成的接口以及数据类型
- 1. 读DID函数接口生成
- 2. 写DID函数接口生成
- 3. 写NvM接口生成
- 4. RAM数组生成
- 二、代码编写
- 1. 读DID
- 2. 写DID
- 总结
前言
本系列主要基于DaVinCi工具链来展开具体DID读写的配置以及最终实现。
DID读写功能实现流程包括如下几点:
1, CDD准备 2, 工具链配置 3, 代码实现 4, 验证结果
本文讲述流程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接口进行二次封装了。
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);
}
~
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);
}
总结
博主是AutoSar小白,如果哪里表达的有问题,还请大佬们指点指点哈。接下来,让我们在下章关于测试验证的博文再相会哈~