CCP协议代码实现—链接脚本
前言
大家好,我是左工,在文章CCP协议代码实现—源码获取中我们学习了CCP协议的代码结构和集成方法。在程序中有很多全局变量和局部变量,那么CCP协议栈中如何对这些变量进行管理的?如何区分哪些是观测量,哪些是标定量呢?今天左工就来回答这个问题。对于本文需要的协议栈,提醒各位可以私信左工,后台发送“CCP源码”即可获取上述协议栈代码。
一、变量定义
在文章CCP协议代码实现—源码获取中我们看见了观测量和标定量的定义就是如下几行代码。那这几行代码是什么意思呢?今天左工就给大家掰开了,揉碎了讲讲。
/*观测量定义*/
#pragma section "app.meas_var"
volatile uint32 Meas_SysCount = 0xAB; //观测量1
volatile uint32 Meas_Output = 0xAC; //观测量2
#pragma section
/*标定量定义*/
#pragma section "app.cali_var"
const volatile uint32 Cali_Proportion = 0xED; //标定参数1
const volatile uint32 Cali_Offset = 0xEF; //标定参数2
#pragma section
在上面的代码中有一对带有 #pragma section 的预处理指令,这一对指令只会出现在嵌入式开发环境中,核心作用是手动控制变量存放在内存的哪个段(Section)。我们对这个解释进行拆解:
- #pragma section “name”
功能:从这一行开始,后面定义的所有全局变量、静态变量、函数、常量,都会被编译器强制放到名为name的段里,不再使用默认段。 - #pragma section
功能:取消上面的自定义段设置,后续变量重新放回默认的段。
所以关于观测量和标定量定义的那几行代码的意义就是将变量 “Meas_SysCount” 和 “Meas_Output” 放在名为 “app.meas_var” 的存储段(section)内。将变量 “Cali_Proportion” 和 “Cali_Offset” 放在名为 “app.cali_var” 的存储段(section)内。那么 “app.meas_var” 和 “app.cali_var” 这两个存储段又该怎么定义呢?
二、链接脚本
存储段的定义我们需要找到链接脚本文件。AurixDev的链接文件是以.lsl后缀结尾的。我们以使用GCC编译器为例,在AurixDev工程中找到带有“Gnuc”字样的.lsl文件在编辑器中打开。

在/Fixed memory Allocations for BMHD/后面的section定义完成后,再添加如下CCP的section定义。位置大约在380行后。这些代码就是定义存储段的。
/*CCP Space Define*/
SECTIONS
{
.ccp_cal_ram (0x70010000) : AT (0xA0068000)
{
*(*.cali_*)
} > dsram0
. = 0x70011000;
.ccp_cal_flash (0xA0068000) :
{
} > pfls0
. = 0xA0069000;
.ccp_mea_ram (0x70011000) :
{
*(*.meas_*)
} > dsram0 AT>pfls0
. = 0x70015000;
}
上面的代码的表述很清晰,可以分成两部分理解。

第一部分是关于标定量的,将含有“.cali_”字样的存储段定义在了两个位置:
- 第一个位置位于RAM区,起始地址为0x70010000,结束地址为0x70011000。
- 第二个位置位于FLASH区,起始地址为0xA0068000,结束地址为 0x0xA0069000。

第二部分是关于测量量的,将含有 “.meas_” 字样的段定义在起始地址为0x70011000,结束地址为0x70015000的内存区域 。
从上面解释我们可以看出标定量被定义在了两个存储段内,分别是RAM区和FLASH区。这是因为App运行的时标定量和测量量是在RAM区获取的,标定量初始化和固化是从FLASH获取的。所以标定量被定义了两遍。
经过如上的存储段定义和变量定义,我们得知测量量被定义在了0x70011000开始的区域内。标定量被定义在0x70010000和0xA0068000两个区域。
三、实验验证
链接脚本文件设置完成后我们就可以编译工程了,我们还是以使用GCC编译为例,编译完成后我们可以在编译生成的文件中找到map文件,如下图所示。

我们通过编译器打开map文件,可以发现这四个变量刚好被定义在上面描述的RAM区域里面,标定量在0x70010000,测量量在0x70011000。


那么FLASH区域内的标定量如何验证呢?我们继续找编译的结果文件,找到.hex文件,如下图所示。

使用在线的hex文件浏览工具打开ccp_text.hex文件。

打开后,我们找到0xA0068000这个位置,发现这里的两个值0xED和0xEF就是我们在定义变量的时候定义的值。这说明我们将这两个标定量在FLASH区合适的位置正确定义了。
const volatile uint32 Cali_Proportion = 0xED; //标定参数1
const volatile uint32 Cali_Offset = 0xEF; //标定参数2
总结
今天我们讲解了CCP协议栈中标定量和测量量的定义方法。ECU中的变量位置定义好了,如何通知给上位机软件呢?需要用到A2L文件。下一讲左工就向大家介绍如何编写A2L文件,并向大家提供编写A2L文件的开源工具。请敬请收藏关注,不迷路。再次提醒对于本文需要的协议栈,各位可以私信左工,后台发送“CCP源码”即可获取上述协议栈代码。
更多推荐



所有评论(0)