Autosar代码阅读和调试方法

news2024/12/20 11:40:33

一、前言

      众所周知Autosar工程代码量非常庞大,而且有非常多的宏定义,代码可读性非常不友好。但是目前国内外很多OEM和Tire1都是基于Autosar系统进行项目开发的。在开发过程中,出现一些BUG时必须去阅读和调试代码。这就要求开发人员具备很强代码阅读能力和调试能力。根据多年Autosar项目开发经验选择总结了代码阅读和调试的一些经验,如有不足之处,还望各位进行指出。

二、Autosar代码如何阅读

1、熟悉代码工程的结构

     要提高Autosar代码阅读能力,首先得了解Autosar代码工程的结构。不然从几十万行代码中去找问题,会感觉到无从下手。下面大致的列出Autosar工程的结构,很多模块并没有一一列出。

其中MCAL、BSW和RTE大多是通过工具链如Davinci/ETAS,EB等配置出来的代码,当然还有Vector SIP包里的静态代码。ASW中算法模块一般可以用MBD建模通过Matlab/TargetLink工具生成的代码,当然这个里面也有很多根据软件需求手写的逻辑代码。复杂驱动里的代码也是根据芯片的Datasheet手写的驱动代码。

1.1 MCAL代码

MCAL部分的代码分成EB配置出来的代码和MCAL包里的静态代码,如下图所示:

1.2 BSW基础软件代码

基础软件部分的代码量非常大 ,主要包含两部分,一个是SIP包里的静态代码和工具链配置出来的代码,如下图所示为SIP包里按模块划分的静态代码:

 另外一部分是用工具链生成的代码,如下图所示:

 连接BSW和ASW的运行时环境RTE也是工具生成的,在GenData文件夹中。

1.3 ASW代码 

ASW应用层代码主要包括MBD生成的算法和控制代码,以及手写代码。MBD建模生成的代码如下图所示:

 其他有些手写代码也是在ASW中,例如诊断22/2E服务DID的读写逻辑代码的实现,如下图所示:

1.4 复杂驱动代码

复杂驱动代码包括一些驱动芯片和电源芯片的手写代码,这部分主要是手写代码,如下图所示:

以上就是Autosar代码工程的几大块。知道代码结构后,在项目开发过程中,若遇到了问题就知道从哪里去找到相应的代码打断点进行调试。

2、代码有问题从哪些地方查

当我们在开发过程中遇到了问题,从哪些代码入手查呢?首先要明白一点:MCAL静态代码是芯片厂商对外设模块写的一些固件代码,一般是没有问题;BSW静态代码是Vector随SIP包一起下发的,一般也是AUTOSAR标准的的代码,一般也是不会出问题的。所以就要查EB和Davinci配置的代码,复杂驱动和ASW部分的代码。当然在追查问题的时候或者弄清楚某个模块的原理,是需要结合所有代码一起看的。这样就把问题查找的范围缩小了。大家可以在实际项目中根据实际情况去做尝试。

注:有时候软件跑不起来了,该如何查呢?我在此讲一下我的思路:先查EcuM_AL_DriverInitZero/EcuM_AL_DriverInitOne/EcuM_AL_DriverInitTwo,BswM_Init,OsTask_Init_OsCore0这些初始化函数是否能正常运行?因为只有初始化运行完才会进入各个周期Task中。当这些初始化函数都跑不进去,那就要查一些资源和内存配置是否有问题,以及启动代码是否有问题。

三、代码调试技巧

在实际开发过程中,经常面临着程序跑飞的情况?我们一般的做法有:打断点、看变量、对比正常代码和异常代码的变动。实际上有些简单的问题可以用上述方法,但是有些问题并不能通过这几个方法查的出来。下面再介绍在开发阶段的三种调试方法查此类问题:

  • ErrorHook:    极少数情况使用。
  • Det: 在配置阶段,勾选相应模块Det Enable,但是报的信息太过笼统,有一定的作用,在开发阶段使用。
  • PC指针: 可以精确定位到某一行,在开发阶段使用。

1. ErrorHook的使用

图片

在OS_Callout_Stubs.c下面的函数,FUNC(void, OS_ERRORHOOK_CODE) ErrorHook(StatusType Error),这里面打断点。

如果程序真的进了ErrorHook,可以从CurrentError里面来捕获这个错误ID。怎么样破解这个ErrorID的具体含义?

最快捷的方法是,转到Os_Types.h中,在Os_StatusType这个enum的注释下面有对ErrorID的解释。

图片

2. Det的使用

方法类同ErrorHook的使用。但要注意:要观察哪一块的错误,就要使能那一块的DET,比如,你的工程一进行ADC采集就跑飞,那么你必须要打开ADC模块的DET功能,和DET模块。这样你才能观测DET错误信息。

图片

图片

然后在Det.c模块的Det_ReportError进行错误信息的捕获。该函数中最有用的信息就是这4个参数:ModuleId、InstanceId、ApiId、ErrorId(也叫ErrorCode)。

图片

关于ModuleID的定义,是AUTOSAR标准,所有SIP供应商都遵循的,在AUTOSAR标准《List of Basic Software Modules 》中可以查到。

图片

在定位到Module以后,可以在每个Module的头文件代码下面或者TechnicalReferences下面(仅适用于Vector的工具)找到具体的ErrorCode/ErrorId的含义。这样就能大体定位出问题所在。

图片

3. PC指针的使用

应对程序跑飞,这是目前博主认为最高效,也是博主最喜欢用的方法。这种方法几乎可以说是程式化的,其每一步都是固定且目的清晰的。

因为博主没用过其他软件调试工具,所以我还是给这个方法加一个适用条件,免得误导别人。

编译器: Tasking

调试软件: TRACE32

调试硬件: 劳特巴赫

芯片平台: 英飞凌AURIX系列

先说一下这个方法的原理,就是上下文切换机制。关于英飞凌CSA,网络上有不少讲解,可以参考一下这篇博文《TriCore处理器的上下文切换原理》。程序运行过程就是一个上下文的链表延伸的过程,这个链表的节点中记录着当前位置和历史位置。

第一步:在TRACE32中,打开CPU/CSFR这个模块。

观察PC指针这个寄存器,是不是固定在某一个值不变,或者在某一个非常小的范围内跳动。

图片

图片

如上图,这个时候程序停在了0x80080098这个位置。

第二步:打开Var/show Function视图。

图片

这个视图里,有所有的函数列表,及他们各自对应地址区间,左边是函数名,右边一列是地址:

图片

结合第一步中的0x80080098,找到该地址属于哪个函数。注意在“Find”窗口中最好不要直接搜索80080098,因为这是函数内的一个指令对应的地址,不一定恰好是函数边界地址。一个函数对应的是一个地址区间,所以可以按地址范围搜索,比如搜索800800,然后在搜索出来的结果中找到正确的0x80080098所在区间,即所属函数

图片

第三步:找到PC指针停在的哪个函数,然后在函数内部(比如第一条语句处)打断点。打断点之后重新运行程序,这个时候程序必然会停在断点处。

图片

Note上图地址只作为示意,博主在家里写的博客,没有劳特巴赫,无法展示真实的调试过程。

第四步:打开Var/show Stack视图。

你会发现在程序跑飞之前的函数调用关系尽收眼底。那么是谁引起的跑飞,就一目了然。注意:在STACK视图中越是靠上的函数越是时间上靠后的。即程序是从下面的函数调用上面的函数这样跳转的。

图片

图片

比如我们前期已近明确,一旦使能XCP功能,程序就跑飞, 那么在Stack视图中显示,XCP模块的最后一个函数是Xcp_CmdHlp_WriteMta(),那么我们就进入该函数,通过单步调试,定位出到底哪一行代码执行导致了程序进入Trap

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1121505.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaScript基础知识16——分支语句

哈喽,大家好,我是雷工。 今天学习JavaScript基础知识的分支语句,以下为学习笔记。 1、程序三大流程控制语句 ○写几句就从上往下执行几句,这种叫做顺序结构; ○有时要根据条件选择执行代码,这种叫分支结构…

深度学习 | Pytorch深度学习实践 (Chapter 10、11 CNN)

十、CNN 卷积神经网络 基础篇 首先引入 —— 二维卷积:卷积层保留原空间信息关键:判断输入输出的维度大小特征提取:卷积层、下采样分类器:全连接 引例:RGB图像(栅格图像) 首先,老师…

2001-2022年全国290+个地级市高铁开通数据

2001-2022年全国290个地级市高铁开通数据 1、时间:2001-2022年 2、范围:298地级市(293地级市数(其中莱芜市2019年撤市设区)4直辖市数 ) 3、来源:国家铁路局、铁路客货运输专刊及相关统计 国…

Homeassistant docker配置

Homeassistant docker配置 【说明】本系列为自用教程,记录以便下次使用 【背景】一台J1900 4G64G的小主机,安装了OP系统,里面自带了Docker。为实现Homeassistant(简称HA)控制智能家居设备,进行如下配置。 【…

使用 Data Assistant 快速创建测试数据集

使用 Data Assistant 快速创建测试数据集 Data Assistant 提供超过 100 种数据类型,为任何开发、测试或演示目的生成大量、异构、真实的数据。 官网地址: http://www.redisant.cn/da 主要功能 Windows 原生 Data Assistant 使用 Windows Native 技术…

Redis常见问题的解决方案(缓存穿透/缓存击穿/缓存雪崩/数据库缓存数据不一致)

Redis解决缓存数据库不一致的方案 用 先 操作数据库 再 操作缓存 的策略来实现缓存数据库数据一致具体做法是 更新数据库数据然后删除缓存 虽然还是会有线程安全问题 比如 假设此时缓存刚好失效了 线程1 查询缓存失败 从数据库读取了旧数据 还没写入缓存的时候 被调度到 线程…

C++标准模板(STL)- 类型支持 (运行时类型识别,type_info )

运行时类型识别 定义于头文件 <typeinfo> 含有某个类型的信息&#xff0c;由实现生成。​​这是 typeid 运算符所返回的类。 std::type_info 定义于头文件 <typeinfo> class type_info; 类 type_info 保有一个类型的实现指定信息&#xff0c;包括类型的名称和…

《机器学习》第6章 支持向量机

文章目录 6.1 间隔与支持向量6.2 对偶问题6.3 核函数支持向量展式核函数 6.4 软间隔与正则化6.5 支持向量回归6.6 核方法6.7 阅读材料 6.1 间隔与支持向量 分类学习最基本的想法就是基于训练集D在样本空间中找到一个划分超平面,将不同类别的样本分开.但能将训练样本分开的划分…

UG\NX二次开发 取消抑制特征 UF_MODL_unsuppress_feature

文章作者:里海 来源网站:《里海NX二次开发3000例专栏》 感谢粉丝订阅 感谢 bullzhanghao 订阅本专栏,非常感谢。 简介 UG\NX二次开发 取消抑制特征 UF_MODL_unsuppress_feature 效果 代码 #include "me.hpp" #include <vector> #

100114. 元素和最小的山形三元组 II

如果下标三元组 (i, j, k) 满足下述全部条件&#xff0c;则认为它是一个 山形三元组 &#xff1a;i < j < k nums[i] < nums[j] 且 nums[k] < nums[j] 请你找出 nums 中 元素和最小 的山形三元组&#xff0c;并返回其 元素和 。如果不存在满足条件的三元组&#xf…

昇腾AscendCL推理应用开发入门教程(基于Python语言)

pyACL&#xff08;Python Ascend Computing Language&#xff09;是一套在AscendCL的基础上使用CPython封装得到的Python API库&#xff0c;使用户可以通过Python进行昇腾AI处理器的运行管理、资源管理等&#xff0c;实现在昇腾CANN平台上进行深度学习推理计算、图形图像预处理…

表结构的操作【MySQL】

文章目录 创建表例子 查看表结构修改表新增列属性修改列属性修改列名修改表名删除列 删除表 阅读前导&#xff1a; 一般来说&#xff0c;对表的操作可以分为对表结构和对表内容的操作。 对表结构的操作&#xff0c;就是用数据定义语言 DDL 来创建、修改或删除表中的对象&#…

elementUI 中 date-picker 的使用的坑(vue3)

目录 1. 英文显示2. format 与 value-format 无效3. date-picker 时间范围4. 小结 1. 英文显示 <el-date-pickerv-model"dateValue"type"date"placeholder"选择日期"></el-date-picker>解决方案&#xff1a; 引用 zhCn <script&g…

web开发初级工程师学习笔记

web开发初级工程师学习笔记 前端开发工具实验1 VS Code 初体验介绍 前端开发工具 实验1 VS Code 初体验 介绍 VS Code 环境提供的是一个可以在浏览器中使用原生 VS Code 编辑代码的程序。在该环境中&#xff0c;你可以使用到与本地安装近乎一致的 VS Code 程序来编辑代码文件…

PAM从入门到精通(十九)

接前一篇文章&#xff1a;PAM从入门到精通&#xff08;十八&#xff09; 本文参考&#xff1a; 《The Linux-PAM Application Developers Guide》 PAM 的应用开发和内部实现源码分析 先再来重温一下PAM系统架构&#xff1a; 更加形象的形式&#xff1a; 六、整体流程示例 2.…

linux安装visual studio code

下载 https://code.visualstudio.com/ 下载.deb文件 安装 假如文件被下载到了 /opt目录下 进入Opt目录&#xff0c;右键从当前目录打开终端。 输入下面的安装命令。 sudo apt-get install ./code_1.83.1-1696982868_amd64.deb 安装成功。 配置 打开 visual studio cod…

博客续更(五)

十一、后台模块-菜单列表 菜单指的是权限菜单&#xff0c;也就是一堆权限字符串 1. 查询菜单 1.1 接口分析 需要展示菜单列表&#xff0c;不需要分页。可以针对菜单名进行模糊查询。也可以针对菜单的状态进行查询。菜单要按照父菜单id和orderNum进行排序 请求方式 请求路径…

Sentinel授权规则和规则持久化

大家好我是苏麟 , 今天说说Sentinel规则持久化. 授权规则 授权规则可以对请求方来源做判断和控制。 授权规则 基本规则 授权规则可以对调用方的来源做控制&#xff0c;有白名单和黑名单两种方式。 白名单&#xff1a;来源&#xff08;origin&#xff09;在白名单内的调用…

Linux下Jenkins自动化部署SpringBoot应用

Linux下Jenkins自动化部署SpringBoot应用 1、 Jenkins介绍 官方网址&#xff1a;https://www.jenkins.io/ 2、安装Jenkins 2.1 centos下命令行安装 访问官方&#xff0c;点击文档&#xff1a; 点击 Installing Jenkins&#xff1a; 点击 Linux&#xff1a; 选择 Red Hat/…

H3C IMC dynamiccontent.properties.xhtm 远程命令执行

我举手向苍穹&#xff0c;并非一定要摘星取月&#xff0c;我只是需要这个向上的、永不臣服的姿态。 构造payload&#xff1a; /imc/javax.faces.resource/dynamiccontent.properties.xhtml pfdrtsc&lnprimefaces&pfdriduMKljPgnOTVxmOB%2BH6%2FQEPW9ghJMGL3PRdkfmbii…