当前位置: 首页 > news >正文

DiagnosticSessionControl (10服务) 函数解析及UDS $10服务指导文档

1. 功能概述

Dcm_DcmDiagnosticSessionControl是AUTOSAR DCM模块中实现诊断会话控制服务(SID 0x10)的核心函数。该服务用于在ECU(服务器)中启用不同的诊断会话,每个会话对应一组特定的诊断服务和功能。

核心作用

  • 接收并处理诊断仪(客户端)发送的会话控制请求
  • 验证请求的有效性(会话支持、长度、权限等)
  • 管理会话状态切换
  • 发送肯定/否定响应

2. 函数接口

函数原型

Std_ReturnTypeDcm_DcmDiagnosticSessionControl(Dcm_SrvOpStatusType OpStatus,Dcm_MsgContextType*pMsgContext,Dcm_NegativeResponseCodeType*dataNegRespCode_u8)

参数说明

参数名类型描述
OpStatusDcm_SrvOpStatusType服务操作状态(如DCM_CANCEL用于取消服务)
pMsgContextDcm_MsgContextType *消息上下文指针,包含请求数据、响应数据缓冲区及长度信息
dataNegRespCode_u8Dcm_NegativeResponseCodeType *输出参数,用于存储否定响应码(NRC)

返回值

返回值描述
E_OK服务处理成功(或取消操作成功)
E_NOT_OK服务处理失败(需结合dataNegRespCode_u8判断具体原因)
DCM_E_PENDING服务正在处理中(需等待应用层回调完成)

3. 状态机详解

函数内部通过状态机Dcm_stDsc_en管理会话控制流程,主要状态如下:

状态描述
DCM_DSP_DSC_INIT初始状态,解析请求并验证会话支持性、请求长度
DCM_DSP_DSC_CHECK_PERMISSION检查会话切换权限(调用应用层回调)
DCM_DSP_DSC_WAIT等待状态(仅用于跳转Bootloader场景)
DCM_DSP_DSC_SEND_RESP准备并发送肯定响应
DCM_DSP_DSC_ERROR发送否定响应并重置状态机

4. 处理流程(分步骤)

步骤1:初始化与取消操作处理

*dataNegRespCode_u8=0x00;dataRetVal_u8=E_NOT_OK;if(OpStatus==DCM_CANCEL){Dcm_Dsp_DscIni();// 重置DSC状态机dataRetVal_u8=E_OK;}
  • OpStatusDCM_CANCEL,则重置状态机并返回成功。

步骤2:初始状态(DCM_DSP_DSC_INIT

2.1 解析请求的会话类型
Dcm_ReqSess_u8=pMsgContext->reqData[DCM_DSP_DSC_POSITION_SUBFUNC];
  • 从请求数据的子功能位置(通常为第2字节)提取目标会话类型。
2.2 验证会话是否支持
for(idxLoop_qu8=0;idxLoop_qu8<DCM_CFG_DSP_NUMSESSIONS;idxLoop_qu8++){if(Dcm_ReqSess_u8==Dcm_Dsp_Session[idxLoop_qu8].session_level){break;// 会话找到}}
  • 遍历配置的会话表Dcm_Dsp_Session,检查目标会话是否已配置。
  • 若不支持:设置NRC为DCM_E_SUBFUNCTIONNOTSUPPORTED(0x12),并跳转至错误状态。
2.3 验证请求长度
if(pMsgContext->reqDataLen==DCM_DSP_DSC_REQ_LEN){// 长度正确,继续处理}else{*dataNegRespCode_u8=DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT;// 0x13}
  • 检查请求数据长度是否符合预期(通常为2字节:SID + 子功能)。
  • 若长度错误:设置NRC为0x13,并跳转至错误状态。
2.4 获取当前会话并切换状态
dataRetVal_u8=Dcm_GetSesCtrlType(&s_stDspDscActiveSession_u8);if(dataRetVal_u8==E_OK){Dcm_ctDiaSess_u8=(uint8)idxLoop_qu8;// 保存目标会话索引Dcm_stDsc_en=DCM_DSP_DSC_CHECK_PERMISSION;// 切换至权限检查状态}else{*dataNegRespCode_u8=DCM_E_CONDITIONSNOTCORRECT;// 0x22}
  • 调用Dcm_GetSesCtrlType获取当前活跃会话。
  • 若成功,保存目标会话索引并切换至权限检查状态;否则设置NRC为0x22

步骤3:权限检查(DCM_DSP_DSC_CHECK_PERMISSION

dataRetVal_u8=DcmAppl_DcmGetSesChgPermission(s_stDspDscActiveSession_u8,Dcm_Dsp_Session[Dcm_ctDiaSess_u8].session_level,dataNegRespCode_u8);
  • 调用应用层回调DcmAppl_DcmGetSesChgPermission,检查是否允许从当前会话切换至目标会话。
回调返回值处理
返回值后续操作
E_OK权限通过,切换至DCM_DSP_DSC_SEND_RESP(或WAIT状态,若需跳转Bootloader)
DCM_E_PENDING应用层需更多时间处理,保持当前状态,等待下一次调用
其他值权限拒绝,设置NRC(默认0x22),跳转至错误状态

步骤4:等待状态(DCM_DSP_DSC_WAIT,仅Bootloader场景)

#if(DCM_CFG_STORING_ENABLED!=DCM_CFG_OFF)if(Dcm_Dsp_Session[Dcm_ctDiaSess_u8].sessionForBoot==DCM_OEM_BOOT){Dcm_JumpToBootLoader(DCM_JUMPTOOEMBOOTLOADER,dataNegRespCode_u8);}// 类似处理 DCM_SYS_BOOT#endifdataRetVal_u8=DCM_E_PENDING;
  • 若目标会话配置为跳转Bootloader(sessionForBootDCM_OEM_BOOTDCM_SYS_BOOT),则调用Dcm_JumpToBootLoader执行跳转。
  • 返回DCM_E_PENDING,等待跳转完成。

步骤5:发送肯定响应(DCM_DSP_DSC_SEND_RESP

pMsgContext->resDataLen=DCM_DSP_DSC_RESP_LEN;pMsgContext->resData[0]=Dcm_ReqSess_u8;// 响应第1字节:请求的会话类型#if(DCM_CFG_DSP_DSC_SESRECINRESP!=DCM_CFG_OFF)// 填充P2和P2*超时时间(若配置启用)dataTimingValue_u16=(uint16)(Dcm_Dsp_Session[Dcm_ctDiaSess_u8].P2_max_u32/1000u);pMsgContext->resData[1]=(uint8)(dataTimingValue_u16>>8u);pMsgContext->resData[2]=(uint8)(dataTimingValue_u16&0x00ffu);// 类似填充 P2str_max(分辨率10ms)#endifdataRetVal_u8=E_OK;
  • 填充响应数据:
    • 第1字节:请求的会话类型(回显)。
    • 若启用DCM_CFG_DSP_DSC_SESRECINRESP,则填充P2_maxP2str_max超时时间(单位转换:P2_max从μs转为ms,P2str_max从μs转为10ms分辨率)。
  • 设置响应长度并返回E_OK

步骤6:发送否定响应(DCM_DSP_DSC_ERROR

if(*dataNegRespCode_u8==0x00){*dataNegRespCode_u8=DCM_E_CONDITIONSNOTCORRECT;// 默认NRC}Dcm_stDsc_en=DCM_DSP_DSC_INIT;// 重置状态机dataRetVal_u8=E_NOT_OK;
  • 若未设置具体NRC,则默认使用0x22
  • 重置状态机至初始状态,并返回E_NOT_OK

5. 关键配置选项(宏定义)

宏定义描述
DCM_CFG_DSP_DSC_SESRECINRESP若启用(!= DCM_CFG_OFF),则在肯定响应中包含P2_maxP2str_max时间参数
DCM_CFG_STORING_ENABLED若启用,支持跳转Bootloader功能
DCM_CFG_DSP_NUMSESSIONS配置的会话数量(用于遍历会话表Dcm_Dsp_Session

6. 常见否定响应码(NRC)说明

NRC值宏定义触发场景
0x12DCM_E_SUBFUNCTIONNOTSUPPORTED请求的会话类型未在配置表中定义
0x13DCM_E_INCORRECTMESSAGELENGTHORINVALIDFORMAT请求数据长度不符合预期(通常应为2字节)
0x22DCM_E_CONDITIONSNOTCORRECT当前条件不满足(如无法获取当前会话、应用层拒绝权限等)

7. 应用层回调接口

函数依赖以下应用层回调,需由用户实现:

  1. DcmAppl_DcmGetSesChgPermission

    • 功能:检查会话切换权限。
    • 参数:当前会话、目标会话、输出NRC指针。
    • 返回值:E_OK(允许)、DCM_E_PENDING(处理中)或其他(拒绝)。
  2. Dcm_JumpToBootLoader(若启用Bootloader功能):

    • 功能:执行跳转至Bootloader的操作。
    • 参数:跳转类型(OEM或系统供应商)、输出NRC指针。

8. 总结

Dcm_DcmDiagnosticSessionControl函数通过状态机有序管理会话控制流程,涵盖请求解析、验证、权限检查、响应发送等环节。理解其逻辑需结合配置表(Dcm_Dsp_Session)和应用层回调,确保会话切换的安全性和正确性。

需要我帮你生成一份可下载的Markdown或PDF版本的完整解析文档吗?

http://www.jsqmd.com/news/568257/

相关文章:

  • 【PyTorch 3.0静态图分布式训练黑盒揭秘】:从FX Graph到Triton Kernel调度的7个隐藏断点与性能衰减临界值
  • 二叉树高频面试 2 道神题!递归 BFS 层序遍历 + 有序数组转平衡 BST,代码极简秒懂
  • 突破百度网盘限速:面向资源获取者的高效直链解析方案
  • Pixel Epic智识终端用户体验报告:200+科研人员真实反馈与改进建议
  • 救命!电路板维修高频故障排查口诀,背会秒上手,修板快准稳
  • Vivado 时序约束文件 (.xdc) 管理与维护实战指南:从单文件到团队协作
  • 【Agents】自定义子代理进阶:后台执行
  • 大数据在电力行业应用案例解析 -【电力技术】(25)RPA 在电力业扩报装中的自动化应用与实现
  • 图纸加密方法有哪些?分享3种图纸加密的方法,保护图纸安全
  • 路由器、交换机、光猫有什么区别?网络设备基础入门
  • 音频驱动面部动画:Audio2Face技术原理与实践指南
  • 3分钟搞定Windows和Office激活:KMS_VL_ALL_AIO智能脚本使用指南
  • 快马平台快速生成git安装配置交互教程,零基础也能轻松上手
  • Windows前端开发提速:用Bun一键替换Yarn/Npm,加速Vue与React项目构建
  • 【立煌】友达10.1寸G101STN01.C工业液晶屏LCD
  • 嵌入式开发实用代码片段与调试技巧
  • Stable Yogi Leather-Dress-Collection 批量生成与任务队列管理方案
  • Python内存监控体系搭建:Prometheus+Custom Metrics+内存火焰图,实现OOM前15分钟精准预警
  • AI赋能.NET开发:让快马平台智能生成Redis缓存与消息队列集成代码
  • 独立站页面结构优化的注意事项是什么_独立站 SEO 与品牌建设的关系是什么
  • ESP32 Wi-Fi配网实战:AP+Web双模轻量级方案
  • Python大麦网智能抢票脚本:三分钟搭建你的自动购票系统
  • Python智能内存管理策略深度评测(CPython 3.9–3.12全版本横评):谁真正降低了47.6% OOM风险?
  • 效率提升:用快马快速构建排序算法性能对比工具,科学选型
  • 深度解析WindowResizer:Windows窗口强制调整工具的技术架构与实现
  • baidu-wangpan-parse:突破百度网盘限速的直链解析解决方案
  • Whisper-WebUI 语音转写实战指南:从环境配置到模型优化的6个关键突破
  • 飞书设置服务器异常消息
  • DMA传输效率翻倍秘籍:深入解析Burst/Transfer模式在TMS320系列DSP中的配置陷阱
  • intv_ai_mk11商业应用:营销文案润色、会议纪要提炼、邮件草稿生成案例