汽车标定技术(九)--标定常量与#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.rhkb.cn/news/189943.html

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

相关文章

深度学习AI识别人脸年龄

以下链接来自 落痕的寒假 GitHub - luohenyueji/OpenCV-Practical-Exercise: OpenCV practical exercise GitHub - luohenyueji/OpenCV-Practical-Exercise: OpenCV practical exercise import cv2 as cv import time import argparsedef getFaceBox(net, frame, conf_thresh…

基于C#+WPF编写的调用讯飞星火大模型工具

工具源码:https://github.com/lishuangquan1987/XFYun.SparkChat 工具效果截图: 支持流式输出: 其中ApiKey/ApiSecret/AppId需要自己到讯飞星火大模型官网去注册账号申请,免费的。 申请地址:https://xinghuo.xfyun.cn/ 注册之…

代码随想录算法训练营第23期day49| 123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV

目录 一、(leetcode 123)买卖股票的最佳时机III 二、(leetcode 188)买卖股票的最佳时机IV 一、(leetcode 123)买卖股票的最佳时机III 力扣题目链接 增加了两次的限制,相应的就是需要考虑的状…

【AI】自回归 (AR) 模型使预测和深度学习变得简单

自回归 (AR) 模型是统计和时间序列模型,用于根据数据点的先前值进行分析和预测。这些模型广泛应用于各个领域,包括经济、金融、信号处理和自然语言处理。 自回归模型假设给定时间变量的值与其过去的值线性相关,这使得它们可用于建模和预测时…

R语言将向量横向转换为单行数据框,随后整合数量不确定的数据框

vector1 c(1, “karthik”, “IT”) names(vector1) c(“id”, “name”, “branch”) df data.frame(as.list(vector1)) print(df) 先给向量的元素命名,然后转换为列表,最后转换为数据框。 我的需求大概是这个样子:数量不确定的仅有单行…

JL-29 雪深监测仪

技术参数 太阳能功率&#xff1a;10W 电池供电&#xff1a;3.7V/20AH 测量量程&#xff1a;0&#xff5e;5m&#xff08;探头处有15cm的盲区&#xff09; 分 辨 率&#xff1a;1mm 随机误差&#xff1a;1.5mm 非线性误差&#xff1a;<0.7mm 温度误差&#xff1a;<0…

PostgreSQL 入门教程

PostgreSQL 入门教程 1. 历史背景2. 概念3. 特点4. 用法4.1 数据库连接4.2 数据库创建4.3 表创建4.4 数据插入4.5 数据查询4.6 数据更新4.7 数据删除 5. 安装步骤6. 简单示例7. 扩展7.1 数据类型7.2 查询优化7.3 并发控制7.4 数据备份和恢复7.5 扩展性和高可用性7.6 安全性加固…

数据复现-企业数字化转型与中国实体经济发展分析

数据简介&#xff1a;在当今快速发展的数字化时代&#xff0c;数字技术已经成为企业数字化转型的核心驱动力之一。尤其对于中国这样一个拥有庞大实体经济的国家而言&#xff0c;结合数字技术的应用&#xff0c;可以为企业带来前所未有的巨大机遇和挑战。在中国&#xff0c;实体…

大促期间治理品牌窜货的诀窍

渠道问题中&#xff0c;最常见的是窜货&#xff0c;窜货还会伴随低价&#xff0c;会影响其他经销商的利益&#xff0c;同时窜货还可能带来假货&#xff0c;所以治理窜货是品牌的责任&#xff0c;对于出货量巨大的双十一大促&#xff0c;品牌更应重视对窜货问题的治理。 力维网络…

MySQL binlog 日志解析后的exec_time导致表示什么时间?

1. exec_time 到底表示什么时间&#xff1f; MySQL binlog日志解析后&#xff0c;我们能看到会有 exec_time &#xff0c;从字面意思理解这个记录的是执行时间&#xff0c;那这个记录的到底是单条sql的执行时间&#xff1f;还是事务的执行时间&#xff1f;下面通过测试来解读一…

Scikit-LLM:一款大模型与 scikit-learn 完美结合的工具!

Scikit-LLM 是文本分析领域的一项重大变革&#xff0c;它将像 ChatGPT 这样强大的语言模型与 scikit-learn 相结合&#xff0c;提供了一套无与伦比的工具包&#xff0c;用于理解和分析文本。 有了 scikit-LLM&#xff0c;你可以发现各种类型的文本数据中的隐藏模式、情感和上下…

c++分割路径的字符串,得到 目录 文件名 扩展名

简单的做一个c小代码片的记录 c分割了图片的 路径字符串&#xff0c;得到 目录 文件名 扩展名 #include <iostream> using namespace std;int main() {std::string path "E:\\set1_seg\\32.jpg";//index:"\\"在字符串中的位置int index path.find…

深度学习基于python+TensorFlow+Django的花朵识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 花朵识别系统&#xff0c;基于Python实现&#xff0c;深度学习卷积神经网络&#xff0c;通过TensorFlow搭建卷积神经…

【图像处理:OpenCV-Python基础操作】

【图像处理&#xff1a;OpenCV-Python基础操作】 1 读取图像2 显示图像3 保存图像4 图像二值化、灰度图、彩色图&#xff0c;像素替换5 通道处理&#xff08;通道拆分、合并&#xff09;6 调整尺寸大小7 提取感兴趣区域、掩膜8 乘法、逻辑运算9 HSV色彩空间&#xff0c;获取特定…

教育共赴 行以致远 |忻州市高级技工学校领导一行莅临唯众考察交流

​ 2023年11月9日下午&#xff0c;忻州市高级技工学校副校长曲云凤、计算机应用与维修专业负责人王彪、计算机应用与维修专业五名骨干教师李巧英、卢艳、官雪梅、李帅、段娜一行七人到访武汉唯众智创科技有限公司&#xff0c;就物联网专业人才培养方案、课程体系建设等进行了考…

Codeforces Round 908 (Div. 2)题解

目录 A. Secret Sport 题目分析: B. Two Out of Three 题目分析: C. Anonymous Informant 题目分析: A. Secret Sport 题目分析: A,B一共打n场比赛&#xff0c;输入一个字符串由A和‘B’组成代表A赢或者B赢&#xff08;无平局&#xff09;&#xff0c;因为题目说明这个人…

如何在CentOS上安装SQL Server数据库并通过内网穿透工具实现远程访问

文章目录 前言1. 安装sql server2. 局域网测试连接3. 安装cpolar内网穿透4. 将sqlserver映射到公网5. 公网远程连接6.固定连接公网地址7.使用固定公网地址连接 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;…

遇到了别感到奇怪!这其实是python的三目运算!

三目运算定义 我们熟知的三目运算通常表达式是&#xff1a; 判断条件(返回布尔值) ? 为真的结果 &#xff1a;为假的结果。 Python中的三目运算 而在Python中的三目运算并无 ?和:的表达式这种形式。Python的三目运算符也被称为三元运算符&#xff0c;是一种简洁的条件表达…

Vue.js中的路由(router)和Vue Router的作用?

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

Spring Cloud LoadBalancer基础知识

LoadBalancer 概念常见的负载均衡策略使用随机选择的负载均衡策略创建随机选择负载均衡器配置 Nacos 权重负载均衡器创建 Nacos 负载均衡器配置 自定义负载均衡器(根据IP哈希策略选择)创建自定义负载均衡器封装自定义负载均衡器配置 缓存 概念 LoadBalancer(负载均衡器)是一种…