汽车标定技术(六)--基于模型开发如何生成完整的A2L文件(2)
目录
1. 自定义ASAP2文件
2. asap2userlib.tlc需要修改的部分
3. 标定量观测量地址替换
3.1 由elf文件替换
3.2 由map文件替换
3.3 正则表达式(含asap2post.m修改方法)
4.小结
书接上文汽车标定技术(五)--基于模型开发如何生成完整的A2L文件(1)-CSDN博客
1. 自定义ASAP2文件
自定义文件在程序安装目录\toolbox\rtw\targets\asap2\asap2\user\asap2userlib.tlc,
如果确实找不到可以在matlab command window下输入如下指令:

该文件可以分为静态部分和动态部分
静态部分:不依赖模型的部分,例如头部分等;
动态部分:依赖模型,标定量观测量名字,数据大小等
2. asap2userlib.tlc需要修改的部分
(1)头部分改写

(2)将a2l module部分复制到

这样就完成了a2l的定制,这种方法有个缺点,必须要a2l最初的源代码;但也有好处,可以详细了解A2L文件的ECU描述关键词。
当然,如果嫌麻烦,哈哈哈,CANape直接生成A2L文件。
如果需要修改a2l工程名字,调用asap2setup在里面做出修改即可;
3. 标定量观测量地址替换
Matlab提供了两种替换a2l文件地址的方式
3.1 由elf文件替换
从ELF文件更新地址的方法简单,就是通过调用MATLAB自带的函数rtw.asap2SetAddress(ASAP2File, InfoFile),输入A2L文件和elf文件名(即InfoFile)即可得到更新地址后的A2L。缺点是ELF文件不是文本文件,不能看到其内容,很难检验地址更新的正确性。
示例:
| rtw.asap2SetAddress('TestA2L.a2l', 'tc1782_project.elf') |
3.2 由map文件替换
用MAP文件更新地址的方法较为复杂,使用函数asap2post(ASAP2File, MAPFile) ,其通过调用%matlabroot%\toolbox\rtw\targets\asap2\asap2\asap2post.m 文件来更新地址。但是需要手动更改该文件的内容,使其符合对应你MAP的格式(每种编译器生成的MAP文件格式不一样)。
3.3 正则表达式(含asap2post.m修改方法)
使用asap2post进行变量的地址替换要用到正则表达式;
正则表达式又叫做规则表达式,主要用于检索、替换符合某种规则的文本。
Matlab提供了四个正则表达式的库

思考在A2L文件的标定量观测量地址替换中需要用到哪些库?
首先,需要将从map文件中找到相应变量的地址,不同编译器中有不同给的表达方式,例如hightec的map文件地址如下:

在asap2post中提供了多种编译器map文件的格式,可根据需要进行修改。
在这里使用regexp函数找到匹配的文本,因此需要将map文件和a2l文件均转成文本格式的,会用到库fileread;

下面着重分析regexp(str,expression,’tokens’)
Tokens即标文,使用标文的一个好处是,标文会记住所匹配的内容,因此可以在搜索或替换过程中重新调用和重用匹配的文本。
MAPFileString表示map文件已经转成文本了
\n\s\s+0x([0-9a-fA-f]+)\W+(\S+):
\n:字符表示,这里表示从一个换行符开始匹配;
\s:任意空白字符,从空白字符开始匹配;
0x([0-9a-fA-f]):表示0-9,a-f,A-F(区分大小写)的任意字符,
\W:除字母、数字下划线外的任意字符;
\S:任意非空白字符
通过上述可以读取地址与变量名。
然后将变量名和地址存入到哈希表里。
注:什么是hash表?containers.map是什么?
(1)containers.map:创建一个空的map对象
这个对象里面的值(‘Keytype’ ,'char','ValueType','double')均后面指令,接下来即把变量名和地址放到map
(2)哈希表其实也就是一种根据关键码值(Key value)而直接进行访问的数据结构,在matlab里也就是containers.map。
for i = 1:length(pairs)
MAPFileHash(pairs{i}{2}) = pairs{i}{1};
以上语句在matlab里的用法就是右边valuetype给左边的keytype赋值,由于使用的是hightec编译器,因此pairs{i}{2}指的是变量名,pairs{i}{1}指的是地址。
注:常用的标定工具有CANape和INCA;由于INCA只识别FLASH里的变量地址,因此在a2l描述里应该对标定量做一个地址偏移到flash区,这样才能标定。
我们可以在哈希表里就对需要的标定量地址进行偏移,由于matlab十六进制均为字符串形式,所以要将其转为十进制,使用到库hex2dec,进行地址偏移,最后在转为十六进制。

1610612769 转为十六进制为 0x60000000,后面以此类推。
将变量和地址一一对应后,就需要读取a2l的变量和地址进行替换,用到库函数regexprep以及动态正则表达式的概念。


这里引入定制的a2l生成的格式:

regexprep中的表达式行匹配的字段是0000 /* @ECU_Address@Param3@ */
那么为什么要用(\w+),主要是后面replace要来匹配它;
${MAPFileHash($1)}表示hash表里的第一列的元素,即变量名,当其去(\w+)的变量名相匹配时,将hash表的值替换expression。
通过上面的表达式替换,会出现如下结果:

那么下次再替换的时候就不太方便,必须要重新生成a2l来保证地址为0x0000,为了能够多次重复替换,需要将替换后的格式改为如下:

因此需要将regexprep(str,expression,replace)的expression和replace进行修改;其中:
- Expression表示用于匹配的字符,我们可以看到,在a2l文件里,需要匹配的就是地址这一段,
在最初版本中使用的是:expression=[addrPrefix '(\w+)' addrSuffix],
为了能够匹配任意数字(地址),
将expression改为:'[0-9]* /\* @ECU_Address@(\w+)@ \*/';
表示:将匹配 (任意长度数字)+(空格)+(/\* @ECU_Address@(\w+)@ \*/)
保存之后替换a2l如下:

这样我们在做开发时就可以不用再重新生成代码,直接移植,替换a2l即可。
使用\* 的原因
![]()
完成上述工作后,将新的字符串写到a2l里

4.小结
这只是我前几年在验证标定协议栈的一个实验,把模型开发、a2l生成、基础软件从上至下走了一通,再加上做了一个UI界面,基本上把这一套工具链缩减为编译器、matlab/simulink再加标定工具即可,还是比较有成就感的,分享给大家。
相关文章:
汽车标定技术(六)--基于模型开发如何生成完整的A2L文件(2)
目录 1. 自定义ASAP2文件 2. asap2userlib.tlc需要修改的部分 3. 标定量观测量地址替换 3.1 由elf文件替换 3.2 由map文件替换 3.3 正则表达式(含asap2post.m修改方法) 4.小结 书接上文汽车标定技术(五)--基于模型开发如何生成完整的A2L文件(1)-C…...
普华永道于进博会发布全新升级的DSAI投资管理数字化平台
上海,2023年11月9日——今日,在第六届中国国际进口博览会上,全球领先的专业服务机构普华永道推出了全新升级的创新投资管理产品:DSAI投资管理数字化平台。升级后的DSAI投资管理数字化平台具有收益分配自动计算和智能BI看板功能。作…...
ssm+vue的高校学生课堂考勤系统设计与实现(有报告)。Javaee项目,ssm vue前后端分离项目。
演示视频: ssmvue的高校学生课堂考勤系统设计与实现(有报告)。Javaee项目,ssm vue前后端分离项目。 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转…...
常用hivesql记录
前言 hivesql中很多常用的功能,过段时间没有使用就容易忘记,需要去网上搜索,这里总结一下,省的以后还去去搜,供自己以后参考。 查看分区的行 show rowcount extended table_name;创建二级分区表 set hive.default.…...
C# OpenCvSharp 去除文字中的线条
效果 中间过程效果 项目 代码 using OpenCvSharp; using System; using System.Drawing; using System.Windows.Forms; using static System.Net.Mime.MediaTypeNames;namespace OpenCvSharp_Demo {public partial class frmMain : Form{public frmMain(){InitializeComponent…...
【树的存储结构,孩子链表】
文章目录 树和森林树的存储结构孩子链表 树和森林 森林:是m(m>0)棵互不相交的树的集合。 树的存储结构 1.双亲表示法 实现:定义结构数组存放树的结点,每个结点含两个域。 数据域:存放结点本身信息。 双亲域:指…...
到蒙古包了,这边天气-9度 很冷
【点我-这里送书】 本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的…...
淘宝天猫京东苏宁1688等平台关键词监控价格API接口(店铺商品价格监控API接口调用展示)
淘宝天猫京东苏宁1688等平台关键词监控价格API接口(店铺商品价格监控API接口调用展示)代码对接如下: item_get-获得淘宝商品详情 公共参数 请求地址: https://o0b.cn/anzexi 名称类型必须描述keyString是调用key(必须以GET方式…...
案例:用户管理
案例:用户管理 1.展示用户列表2.添加用户3.删除用户 1.展示用户列表 url函数 获取用户星系HTML渲染 2.添加用户 url函数 GET。看到页面,输入内容POST。提交->写入到数据库 3.删除用户 url函数 http://127.0.0.1:8000/info/add/?ni…...
AIGC:使用生成对抗网络GAN实现MINST手写数字图像生成
1 生成对抗网络 生成对抗网络(Generative Adversarial Networks, GAN)是一种非常经典的生成式模型,它受到双人零和博弈的启发,让两个神经网络在相互博弈中进行学习,开创了生成式模型的新范式。从 2017 年以后&#x…...
excel中超级表和普通表的相互转换
1、普通表转换为超级表 选中表内任一单元格,然后按CtrlT,确认即可。 2、超级表转换为普通表 选中超级表内任一单元格,右键,表格,转换为区域,确定即可。 这时虽然已经变成了普通表,但样式没有…...
element中el-switch用法汇总(拓展:el-switch开关点击弹出确认框时,状态先改变,点击确认/取消失效,怎么解决?)
概述: el-switch 表示两种相互对立的状态间的切换,多用于触发「开/关」。 常见用法: 1、绑定v-model到一个Boolean类型的变量。可以使用active-color属性与inactive-color属性来设置开关的背景色。 2、使用active-text属性与inactive-tex…...
mysql之高阶语句
1、使用select语句,用order by对表进行排序【尽量用数字列进行排序】 select id,name,score from info order by score desc; ASC升序排列(默认) DESC降序排列(需要添加) (1)order by结合whe…...
视频编软件会声会影2024中文版功能介绍
会声会影2024中文版是一款加拿大公司Corel发布的视频编软件。会声会影2024官方版支持视频合并、剪辑、屏幕录制、光盘制作、添加特效、字幕和配音等功能,用户可以快速上手。会声会影2024软件还包含了视频教学以及模板素材,让用户剪辑视频更加的轻松。 会…...
IS-LM模型:从失衡到均衡的模拟
IS-LM模型:从失衡到均衡的模拟 文章目录 IS-LM模型:从失衡到均衡的模拟[toc] 1 I S − L M 1 IS-LM 1IS−LM模型2 数值模拟2.1 长期均衡解2.2 政府部门引入2.3 价格水平影响2.4 随机扰动因素 1 I S − L M 1 IS-LM 1IS−LM模型 I S − L M IS-LM IS−LM是…...
【Linux】进程终止
进程退出场景 代码运行完毕,结果正确代码运行完毕,结果不正确代码异常终止 可以用return 的不同的返回值数字,表征不同的出错原因退出码,所以进程运行正不正常我们可以查看退出码来判断; 如果进程异常,退…...
55.跳跃游戏
题目描述:给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。 示…...
php实现钉钉机器人推送消息和图片内容(完整版)
先来看下实现效果: 代码如下: function send_dingtalk_markdown($webhook , $title , $message "", $atMobiles [], $atUserIds []) {$data ["msgtype" > "markdown","markdown" > ["title" > $title,&quo…...
A Survey on Neural Network Interpretability
A Survey on Neural Network Interpretability----《神经网络可解释性调查》 摘要 随着深度神经网络的巨大成功,人们也越来越担心它们的黑盒性质。可解释性问题影响了人们对深度学习系统的信任。它还与许多伦理问题有关,例如算法歧视。此外,…...
代码随想录 Day41 动态规划09 LeetCode T121 买卖股票的最佳时机 T122 买卖股票的最佳时机II
前言 这两题看起来是不是有点眼熟,其实我们在贪心章节就已经写过了这两道题,当时我们用的是将利润分解,使得我们始终得到的是最大利润 假如第 0 天买入,第 3 天卖出,那么利润为:prices[3] - prices[0]。 相当于(prices[3] - prices[2]) (pri…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
