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

news2024/11/25 6:34:02

 目录

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.coloradmin.cn/o/1194538.html

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

相关文章

Django——orm模块创建表关系

django orm中如何创建表关系 1. 表关系分析 表与表之间的关系: 一对多 多对多 一对一 没有关系 判断表关系的方法: 换位思考用4张表举例: 图书表 出版社表 作者表 作者详情表图书和出版社是一对多的关系 外键字段建在多的那一方图书和作者是多对多的关系 需要创建第三张表来…

企业年会/年终活动如何邀请媒体记者报道?

​媒体邀约是企业或组织进行宣传的重要手段之一。通过邀请媒体参加活动,可以增加活动的曝光度和知名度,吸引更多的关注和参与。同时,媒体报道还可以提高企业或组织的权威性和可信度,从而让公众更容易接受其传达的信息。 企业年会或…

比较PID控制和神经网络控制在机器人臂上的应用

机器人臂是自动化领域中常见的机器人形式,其精确控制对于实现复杂任务具有重要意义。在机器人臂的控制中,PID控制和神经网络控制是两种常用的控制方法。本文将比较PID控制和神经网络控制在机器人臂控制方面的应用,包括控制原理、优缺点以及在…

Linux 多线程控制详解

目录 多线程编临界资源访问 互斥锁 API 简述 初始化互斥量 互斥量加锁/解锁 互斥量加锁(非阻塞方式) 互斥量销毁 程序示例 多线程编执行顺序控制 信号量 API 简述 初始化信号量 信号量 P/V 操作 信号量申请(非阻塞方式) 信号量销毁 程序示例 条件变量 创建和销毁…

分享一个JavaScript后台管理项目超实用的提示框

目录 新建js文件 设置css样式 html布局 script代码 调用方式 展示效果 新建js文件 首先我们需要新建一个js文件夹,将下方代码丢进去 "use strict";function _typeof(obj) { "babel/helpers - typeof"; if (typeof Symbol "f…

C/C++输出硬币翻转 2021年6月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C硬币翻转 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C硬币翻转 2021年6月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 假设有N个硬币(N为不大于5000的正整数),从1…

【Linux】tree命令的独特用法

有关tree命令,我们只知道它可以将文件目录以树状图的形式展示,但其实还有很多有意思的功能可以使用。 一、tree命令的安装 各linux版本不同,但软件包名字就叫tree,直接安装即可 ubuntu: apt install tree centos&a…

rust实现quic服务端和客户端

演示如何使用 Quinn 库实现一个简单的 QUIC 客户端和服务器。QUIC 是一种基于 UDP 的协议,用于在互联网上进行快速和安全的通信。 在程序中,使用了 Rust 的标准库中的 error、net 和 sync 模块,以及第三方库 tokio 和 quinn。程序使用了 asy…

智慧畜牧小程序开发流程

本文将详细介绍智慧畜牧小程序的开发流程,包括需求分析、设计、开发、测试和上线等环节。同时,将深入思考智慧畜牧小程序的发展趋势和未来挑战,为读者提供有深度的思考和逻辑性的分析。 一、需求分析 1.明确目标用户:首先…

tomcat+idea--如何在idea上发布项目

对应于idea2022以后的版本 (一)如何配置idea上的tomcat? 1、新建一个项目,左上角File,new,project,新建后就和普通的java项目一样。 2、然后点击项目名,右键选择“Add framework s…

Node.js中的child_process模块的作用

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

unity line renderer绘制的颜色不是想要的红色

线条不是暗红色的,用的是默认的红色 将材质选则为如下即可

数据结构-图的遍历

广度优先遍历(BFS) 树的遍历:不存在“回路”,搜索相邻的结点时,不可能搜到已经访问过的结点 图的遍历:搜索相邻的顶点时,有可能搜到已经访问过的顶点 要点: 找到与一个顶点相邻的所…

Postman基本页面和请求/响应页签介绍

近期在复习Postman的基础知识,在小破站上跟着百里老师系统复习了一遍,也做了一些笔记,希望可以给大家一点点启发。 一、Postman的界面介绍 Home主页、Workspace工作空间、Collections集合、Environments环境变量、Mock Server虚拟服务器、Mo…

Git图形化界面GUI的使用SSH协议及idea集成Git

前言 图形化界面(GUI,Graphical User Interface)是一种用户与计算机程序或操作系统交互的方式,通过图形元素,如图标、按钮、窗口等,而不是通过命令行来完成操作。GUI的设计旨在让用户通过直观的图形界面进行…

云表|低代码开发是否真的靠谱?一试便知

最近,“低代码”这个概念在技术圈里火了起来,引发了广泛的讨论。一些人对其赞不绝口,认为它具有诸多优点,如减少开发周期,提高系统开发效率,降低开发成本,学习成本低等。他们甚至预测&#xff0…

lv11 嵌入式开发 ARM体系结构理论基础(寄存器)3

目录 1 寄存器 2 ARM寄存器 2.1 专用寄存器 1 寄存器 概念 寄存器是处理器内部的存储器,没有地址 作用 一般用于暂时存放参与运算的数据和运算结果 注:全局变量不应该存入寄存器,数量有限会占用寄存器资源,寄存器读…

矩阵的除法

B/A 如果矩阵A可逆,那么 证明: A/AB 如果矩阵A和B都可逆,那么 证明:

人工智能基础——Python:Numpy与矩阵

人工智能的学习之路非常漫长,不少人因为学习路线不对或者学习内容不够专业而举步难行。不过别担心,我为大家整理了一份600多G的学习资源,基本上涵盖了人工智能学习的所有内容。点击下方链接,0元进群领取学习资源,让你的学习之路更加顺畅!记得…

OTA包添加自定义内容

起因 新开一条线,需要上传的OTA包里加点内容,好让后台校验它是否是当前这条线(短期最小改动)。 开整 之前看过ota包结构,整包和差分包里都有一个payload_properties.txt文件,所以最简单的就是给这个txt文件里追加点自定义内容&…