汽车标定技术(九)--标定常量与#pragma的趣事

 目录

1. 不添加#pragma语句

2. 添加#pragma语句

 3. 标定量只给flash空间,不给ram指定空间

4. 总结


    

         在之前不会使用overlay机制的时候,我们想要做汽车标定,标定常量编译出来的地址一般都应该是ram的地址,而且在链接文件中都会指定一段区域来存放标定量和观测量。

        那么为什么要提出这样奇怪的问题呢?

        起因是在向客户询问标定量存放在在ram的哪个位置时,客户说不需要指定特定的段。

        这就有点疑惑了,在标定中明确说了,标定过程会分为两页:workingpage和referencepage;WP:可以进行数据修改的页,通常是ram段;RP:不能修改的页,通常是flash段;在ETAS的文档里更明确的表示:

        所以不指定位置的话,标定数据会存放到哪里呢?那么我用#pragma来做了如下试验,分享给大家。

1. 不添加#pragma语句

        不添加上述语句,则不指定标定数据具体会放在什么位置;

        经过编译(此时未给变量分配地址)、链接(分配地址)之后,结果如下: 

        可以看到,编译器将变量放在了0xd0000840这个位置。结合ld文件 :

        发现它把变量放在了DMI_DSPR(ram)段;所以有理由来谈谈变量在MCU放的位置:

        MCU能存放数据的地方有三处:register、rom、ram,涉及到预定义的:

.text段   :存放代码

.rodata段 :存放只读数据

.noinit段  :存放不需要初始化数据

.bss段   :存放默认初始化数据(一般为0)

.data段   :存放已初始化数据

CSTACK段 :栈

HEAP段   :堆

         下面来看一些变量的例子:

属性

位置

操作

举例

宏变量

预编译期间被汇编进.text段;

运行已不存在

常量

放在.rodata段

程序访问在.rodata读取

未初始化全局变量

放在.noinit段;一般在ram

在.noinit

_no_init uint32_t ni_global_var;    

默认0初始化全局变量

存放在.bss段;一般放在ram

启动时将bss清零;程序访问时在.bss段存取

已初始化全局变量

初始化值存放在.data_init段,一般是ROM;变量本身是存在.data段,一般放在ram

启动时将初值从.data_init段复制到.data段;程序访问时均是在.data段存取

  注:(1)观测量是放在.bss段的

(2)标定量本身应该是放在.data段的

        可以看到,calibration1变量本身是放在ram里的,在程序上电但未运行时,ram里肯定是为0的,所以必须有一个从rom把值拷贝到ram指定位置的操作:

        根据链接文件里,可以看到,DMI_DSPR是从PFLASH1l里读取值,所以有理由相信,在未指定ram区域给标定量时,初始化值存在PFLASH1且变量本身是放在ram里位置由链接文件指定。那么这个值是存在flash里的具体位置应该如何找:

         可以看到.data_start是从0x802a20a8开始,那么0x802a20a8肯定是calibra1的初始值:[1,1,1,1,1],查看hex文件里:

2. 添加#pragma语句

        在添加上述语句之后,正常情况下标定量和观测量是会放到我们指定的区间的,

         通过链接文件给标定量分别划分了ram区和flash区:

        在这里,给标定量划分的flash区间是:0Xaf004000,共80K;给标定量划分的RAM区间是:0x60000000,也是80k;

        同时也给观测量划分了ram区间是:0x60015000,共4K。

        那么现在就看如何将标定量观测量放到指定区间了;

        首先看看结果:

        calibration1被放到了区域:.calDataOvc;这是一块什么区域呢?来看看链接文件进一步解释: 

        可以看到,在单片机开始运行之后,单片机会把RP_CAL0中的值复制到WP_CAL0,并且是变量名和值是一一对应。

        此时我们来看hex文件,在AF004000处应该是calibration1的初值:[1,1,1,1,1]

 3. 标定量只给flash空间,不给ram指定空间

         在链接文件这样写:

        因为没有指定映射到ram的具体地址,所以在map文件里会出现如下现象:

        对比加上>WP_CAL0 AT>RP_CAL0, 

        可以看到,这个变量本身是放在flash里的,也就起不到标定的作用了。

        而标定量初始值如下,没有变化:

         为了比较,不修改rpcal1,如下:

        在相应位置添加#pragma语句: 

         编译之后,在map文件中,calibration4的位置在60001000;

        而在hex中,af005000能找到其初始值: 

        也就是说,通过语句> WP_CAL1 AT > RP_CAL1,将标定量本身放在了ram里,标定量初始值放在了flash里,在程序上电运行后,通过CALINIT函数把flash的值拷贝到指定的ram区;

        当然也有直接在内核初始化的时候将flash的值copy到ram里(hightec的ld文件);

        这里就要修改链接文件,如下图:

        使用copy_table函数,将指定的flash段的数据拷贝至与之匹配的ram段;

Copy_table函数是在mcal的coreinit函数里;

4. 总结

       从以上结果来看,如果只是给标定量确定了flash的位置和大小,而不确定ram的大小,那么编译器会直接把标定量本身以及值都会存放在指定的flash里面,并且无法映射到ram,因为没有做这个操作;所以需要给ram去指定一个区间存放变量名,把值放到flash;这样我们就能做标定操作了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HTML5学习系列之简单使用1

HTML5学习系列之简单使用1 前言基础显示学习定义网页标题定义网页元信息定义网页元信息定义文档结构div元素di和classtitlerole注释 总结 前言 下班加班期间的简单学习。 基础显示学习 定义网页标题 <html lang"en"> <head> <title>从今天开始努…

内存缓存系统

胤凯 (oyto.github.io)&#xff0c;欢迎到我的博客阅读。 今天我们围绕一个面试题来实现一个内存缓存系统。 面试题内容 1. 支持设置过期时间&#xff0c;精度到秒 2. 支持设置最大内存&#xff0c;当内存超出时做出合理的处理 3. 支持并发安全 4. 按照以下接口要求实现 typ…

【poi导出excel模板——通过建造者模式+策略模式+函数式接口实现】

poi导出excel模板——通过建造者模式策略模式函数式接口实现 poi导出excel示例优化思路代码实现补充建造者模式策略模式 poi导出excel示例 首先我们现看一下poi如何导出excel&#xff0c;这里举个例子&#xff1a;目前想要导出一个Map<sex,List>信息&#xff0c;sex作为…

使用Dockerfile依赖maven基础镜像部署springboot的程序案例

1、准备springboot Demo代码 就一个controller层代码&#xff0c;返回当前时间及hello world 2、项目根目录下&#xff0c;新建DockerFile文件 注意&#xff0c;等本地配置完毕后&#xff0c;Dockerfile文件需要与项目helloworld同级&#xff0c;这里先放项目里面 3、docker …

【MATLAB源码-第73期】基于matlab的OFDM-IM索引调制系统不同子载波数目误码率对比,对比OFDM系统。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 OFDM-IM索引调制技术是一种新型的无线通信技术&#xff0c;它将正交频分复用&#xff08;OFDM&#xff09;和索引调制&#xff08;IM&#xff09;相结合&#xff0c;以提高频谱效率和系统容量。OFDM-IM索引调制技术的基本思想…

Flink SQL自定义标量函数(Scalar Function)

使用场景&#xff1a; 标量函数即 UDF&#xff0c;⽤于进⼀条数据出⼀条数据的场景。 开发流程&#xff1a; 实现 org.apache.flink.table.functions.ScalarFunction 接⼝实现⼀个或者多个⾃定义的 eval 函数&#xff0c;名称必须叫做 eval&#xff0c;eval ⽅法签名必须是 p…

快速入门安装及使用git与svn的区别常用命令

一、导言 1、什么是svn&#xff1f; SVN是Subversion的简称&#xff0c;是一个集中式版本控制系统。与Git不同&#xff0c;SVN没有分布式的特性。在SVN中&#xff0c;项目的代码仓库位于服务器上&#xff0c;团队成员通过向服务器提交和获取代码来实现版本控制。SVN记录了每个…

Hbuilder打包项目为h5

Hbuilder打包项目为h5 manifest.json 配置 修改 web 配置下的 页面标题、路由模式、运行的基础路径 发行 H5 发行 填入网站标题和网站域名 编译 编译完成之后存放在 unpackage/dist/build/h5 目录下

Day26力扣打卡

打卡记录 搜索旋转排序数组&#xff08;二分&#xff09; 链接 class Solution {int findMin(vector<int> &nums) {int left -1, right nums.size() - 1; // 开区间 (-1, n-1)while (left 1 < right) { // 开区间不为空int mid left (right - left) / 2;if…

医学图像 ABIDE 等数据集 .nii.gz Python格式化显示

nii.gz 文件 .nii.gz 文件通常是医学影像数据的一种常见格式&#xff0c;比如神经影像&#xff08;如脑部MRI&#xff09;。这种文件格式通常是经过gzip压缩的NIfTI格式&#xff08;Neuroimaging Informatics Technology Initiative&#xff09;。 要在Python中查看.nii.gz文…

设备零部件更换ar远程指导系统加强培训效果

随着科技的发展&#xff0c;AR技术已经成为了一种广泛应用的新型技术。AR远程指导系统作为AR技术的一种应用&#xff0c;具有非常广泛的应用前景。 一、应用场景 气象监测AR教学软件适用于多个领域&#xff0c;包括气象、环境、地理等。在教学过程中&#xff0c;软件可以帮助学…

黑客(网络安全)技术——高效自学1.0

前言 前几天发布了一篇 网络安全&#xff08;黑客&#xff09;自学 没想到收到了许多人的私信想要学习网安黑客技术&#xff01;却不知道从哪里开始学起&#xff01;怎么学 今天给大家分享一下&#xff0c;很多人上来就说想学习黑客&#xff0c;但是连方向都没搞清楚就开始学习…

Paimon 与 Spark 的集成(一)

Paimon Apache Paimon (incubating) 是一项流式数据湖存储技术&#xff0c;可以为用户提供高吞吐、低延迟的数据摄入、流式订阅以及实时查询能力。Paimon 采用开放的数据格式和技术理念&#xff0c;可以与 ApacheFlink / Spark / Trino 等诸多业界主流计算引擎进行对接&#xf…

听GPT 讲Rust源代码--library/core/src(2)

题图来自 5 Ways Rust Programming Language Is Used[1] File: rust/library/core/src/iter/adapters/by_ref_sized.rs 在Rust的源代码中&#xff0c;rust/library/core/src/iter/adapters/by_ref_sized.rs 文件实现了 ByRefSized 适配器&#xff0c;该适配器用于创建一个可以以…

在Node.js中,什么是事件发射器(EventEmitter)?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

全新Inner-IoU损失函数!!!通过辅助边界框计算IoU有效提升检测效果

摘要 1 简介 2 方法 2.1 边界框回归模式分析 2.2 Inner-IoU 损失 3 实验 3.1 模拟实验 3.2 对比实验 3.2.1 PASCAL VOC上的YOLOv7 3.2.2 YOLOv5 在 AI-TOD 上 4. 参考 摘要 随着检测器的快速发展&#xff0c;边界框回归&#xff08;BBR&#xff09;损失函数不断进…

11月份 四川汽车托运报价已经上线

中国人不骗中国人!! 国庆小长假的高峰期过后 放假综合症的你还没痊愈吧 今天给大家整理了9条最新线路 广州到四川的托运单价便宜到&#x1f4a5; 核算下来不过几毛钱&#x1f4b0; 相比起自驾的漫长和疲惫&#x1f697; 托运不得不说真的很省事 - 赠送保险 很多客户第一次运车 …

多目标优化框架

随着模型越来越复杂&#xff0c;优化目标越来越多&#xff0c;传统算法都慢慢地无法胜任复杂优化任务&#xff0c;更为智能的优化方法也就应运而生了。其中有一类是进化优化算法&#xff0c;这类算法的思想来源是自然界的“优胜劣汰”法则&#xff0c;通过不停地保留好的个体最…

艾默生Emerson EDI需求分析

艾默生Emerson是一家全球领先的工程技术和解决方案提供商。该公司总部位于美国&#xff0c;成立于1890年&#xff0c;经过多年的发展&#xff0c;已经发展成为一个多元化的跨国企业&#xff0c;业务遍及工业、商业和消费者市场。艾默生提供各种产品和服务&#xff0c;包括自动化…

CSS3 过度效果、动画、多列

一、CSS3过度&#xff1a; CSS3过渡是元素从一种样式逐渐改变为另一种的效果。要实现这一点&#xff0c;必须规定两相内容&#xff1a;指定要添加效果的CSS属性&#xff1b;指定效果的持续时间。如果为指定持续时间&#xff0c;transition将没有任何效果。 <style> div…