汽车标定技术(九)--标定常量与#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;这样我们就能做标定操作了。

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

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

相关文章

6.5对称二叉树(LC101-E)

算法: 其实就是比较左右子树是否可以翻转 比较的时候: 比较外面的节点是否相等,如示例1中的节点3 比较里面的节点是否相等,如示例1中的节点4 基本思路是这样的,那怎么遍历呢? 二叉树的题一定要掌握到…

更安全的ssh协议与Gui图形化界面使用

目录 前言: 一.Gui图形化界面的使用 二.ssh协议 SSH的主要作用包括: 相比其他网络协议,SSH的优势包括: 三.idea集成Git 前言: 上一篇讲解了git的命令用法以及https协议,但是这个协议放在做团队项目的…

Git系列之Git集成开发工具及git扩展使用

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是君易--鑨,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的博客专栏《Git实战开发》。🎯🎯 &a…

我的月光宝盒初体验失败了

哈哈哈,我爱docker, docker 使我自由!!! docker make me free! 菠萝菠萝蜜口号喊起来。 https://github.com/vivo/MoonBox/ windows上安装好了docker之后,docker-compose是自带的。 docker-compose -f docker-compo…

王学岗visibility改变后调用onLayout()

自定义控件的时候发现了一个bug。 Button位移动画执行结束后我设置了一个不相关的TextView的可见性由gone变为visible.令人郁闷的是,只要我注释的地方放开。动画执行结束后button都会重新绘制在位移动画开始的位置。注释掉这段代码就正常。 经过分析后得知 View的Vi…

C# OpenCvSharp DNN HybridNets 同时处理车辆检测、可驾驶区域分割、车道线分割

效果 项目 代码 using OpenCvSharp; using OpenCvSharp.Dnn; using System; using System.Collections.Generic; using System.Drawing; using System.IO; using System.Linq; using System.Numerics; using System.Text; using System.Windows.Forms;namespace OpenCvSharp_D…

城市内涝积水的原因有哪些?万宾科技内涝积水监测仪工作原理

一旦有暴雨预警出现多地便会立即响应,以防城市内涝问题出现。随着人口迁移,越来越多的人口涌入城市之中,为了完善城市基础设施建设,城市应急管理部门对内涝的监测越来越严格,在信息化时代,城市管理也趋向于…

G2406C是一款高效的直流-直流降压开关稳压器,能够提供高达1A输出电流。

G2406C 1.5MHz,1A高效降压DC-DC转换器 概述: G2406C是一款高效的直流-直流降压开关稳压器,能够提供高达1A输出电流。G2406C在2.7V至5.5V的宽范围输入电压下工作,使IC是低压电源转换的理想选择。在1.5MHz的固定频率下运行允许使用具有小电感…

【C++】异常 智能指针

C异常 & 智能指针 1.C异常1.1.异常的抛出与捕获1.2.异常体系1.3.异常安全与规范1.4.异常优缺点 2.智能指针2.1.RAII2.2.智能指针的使用及原理2.2.1.auto_ptr2.2.2.unique_ptr2.2.3.shared_ptr2.2.4.shared_ptr的循环引用问题 & weak_ptr 2.3.定制删除器 1.C异常 C异常…

伦敦金冬令时开市时间怎样调整

在刚刚过去的一周,欧美的金融市场已经正式进入了冬令时,这对伦敦金市场的交易时间也产生了影响。由于美国于今年11月5日(星期日)开始正式实施冬令时间,所以香港的伦敦金平台的交易时间也随之而有所调整。 从今年11月6日开始&#…

增强地理热图:Highcharts Maps v11.2.0 Crack

Highcharts Maps v11.2.0 添加了对地理热图插值的支持,允许您在类似温度图的图表的已知数据点之间添加估计值。 Highcharts Maps 提供了一种符合标准的方法,用于在基于 Web 的项目中创建逻辑示意图。它扩展了用户友好的 Highcharts JavaScript API&#…

Milvus Cloud——什么是 Agent?

什么是 Agent? 根据 OpenAI 科学家 Lilian Weng 的一张 Agent 示意图 [1] 我们可以了解 Agent 由一些组件来组成。 规划模块 子目标分解:Agent 将目标分为更小的、易于管理的子目标,从而更高效地处理复杂的任务。 反省和调整:Agent 可以对过去的行为进行自我批评和自我反思…

pyOCD

pyOCD 目录结构

Linux的目录的权限

目录 目录的权限 目录的权限 1、可执行权限: 如果目录没有可执行权限, 则无法cd到目录中. 2、可读权限: 如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容. 3、可写权限: 如果目录没有可写权限, 则无法在目录中创建文件, 也无法在目录中删除文件. 上面三个权限是…

微信小程序前端开发

目录 前言: 1. 框架选择和项目搭建 2. 小程序页面开发 3. 数据通信和接口调用 4. 性能优化和调试技巧 5. 小程序发布和上线 前言: 当谈到微信小程序前端开发时,我们指的是使用微信小程序框架进行开发的一种方式。在本文中,我…

划分VOC数据集,以及转换为划分后的COCO数据集格式

1.VOC数据集 LabelImg是一款广泛应用于图像标注的开源工具,主要用于构建目标检测模型所需的数据集。Visual Object Classes(VOC)数据集作为一种常见的目标检测数据集,通过labelimg工具在图像中标注边界框和类别标签,为…

AIGC视频生成/编辑技术调研报告

人物AIGC:FaceChain人物写真生成工业级开源项目,欢迎上github体验。 简介: 随着图像生成领域的研究飞速发展,基于diffusion的生成式模型取得效果上的大突破。在图像生成/编辑产品大爆发的今天,视频生成/编辑技术也引起…

Milvus Cloud——LLM Agent 现阶段出现的问题

LLM Agent 现阶段出现的问题 由于一些 LLM(GPT-4)带来了惊人的自然语言理解和生成能力,并且能处理非常复杂的任务,一度让 LLM Agent 成为满足人们对科幻电影所有憧憬的最终答案。但是在实际使用过程中,大家逐渐发现了通…

conda环境中pytorch1.2.0版本安装包安装一直失败解决办法!!!

conda环境中pytorch1.2.0版本安装包安装一直失败解决办法 cuda10.0以及cudnn7.4现在以及安装完成,就差torch的安装了,现在torch我要装的是1.2.0版本的,安装包以及下载好了,安装包都是在这个网站里下载的(点此进入&…

Kali常用配置(持续更新)

1. 同步系统时间 命令:dpkg-reconfigure tzdata ,这个命令可以同时更新系统时间和硬件时间。 然后选择区域和城市,中国可以先选择Asia,然后选择Shanghai 2.更换系统数据源 # vim /etc/apt/sources.list #不是root用户的话需要…