当前位置: 首页 > news >正文

英飞凌TC3xx-Overlay

目录

1.数据访问重定向

2.寄存器说明

3.Overlay功能配置

3.1 确认用于重定向的CPU

3.2 配置重定向Block大小

3.3 配置目标地址和重定向地址

4.结果验证

5.小结


        今天说要开个专栏讲讲XCP标定,但在将标定之前,先把英飞凌专门为标定功能设计overlay功能讲解清楚。                

        英飞凌的overlay全称叫做Data Access Overlay,其作用是 redirect selected data access to the OVERLAY memory(意味着通过overlay memory来访问数据?)对于Trcicore系列来说,通过CPU访问PFlash、Online Data Acquisition space或者EBU可以被重定向;OVERLAY memory可以分配到Local memory、Emulation Memory或者DPSR/PSPR。

        Overlay功能可以在程序运行时在线实时修改标定参数(这些参数通常存放在Flash中)。注意,overlay仅对数据访问有效;且Overlay机制是针对CPU对数据的访问重定向,一定要注意这点。

1.数据访问重定向

        我们首先来看overlay原理图。

对于一个overlay block有三个非常重要的参数:

  1. Target Base Address --需要被重定向的目标起始地址(一般为Flash);
  2. Block Size -- 需要被重定向的块大小;
  3. Redirection Base Address -- 重定向块的起始地址(一般为RAM);

对于这三个参数,都有相应的寄存器来配置:

  1. Target Base Address -- OTARx;
  2. Block Size  -- OMASKx;
  3. Redirection Base Address -- RABRx

根据芯片手册,TC3xx有32个block用于overlay功能,且size可配置(32byte~128KB)。

2.寄存器说明

  • OTARx(i=0-31)

        该寄存器只有一个参数可配置,TBASE;

        该参数的有效性受OMASK寄存器控制;而所谓target base是指的源地址(通俗将即flash地址,这容易混淆)

  • OMASKi(i=0~31)

        OMASK位域用于设置overlay block size。

        需要注意是,OMASK 只有当bit设置为0时才会参与block大小的配置,例如,当OMASK配置为000时,也即全部12bit有效,因此block size = 2^12 * 32 = 131082byte = 128KB;那么当我需要配置1024byte时,2^n*32 = 1024 ,n= 5,OMASK = 1111 1110 0000 = 0xFE0;

        当bit为1时,OMASK中置1 的位用于地址比较。

  • RABRi(i= 0~31)

        OVEN--Overlay 使能

        OMEM -- 选取overlay memory

        OBASE -- Overlay memory基地址

         看到这里我想大家明白我说TBASE容易搞混淆的原因,按正常想法,我们都是从源地址overlay到目标地址,即访问flash但实际访问到的是ram;英飞凌不一样,他说目标地址overlay到overlay memory。

  • OVCENABLE

        这个寄存器用于使能核的overlay功能,所以大家这里就要搞明白,为什么overlay是放在CPU这一章节;后面我会做一个验证,通过debug口看到的数据和开启overlay的cpu看到的数据其实是不一样的。

  • OVCCON

        Overlay control register,用于控制某个核的overlay功能

CSELx -- 用于选择某个核使能overlay

OVSTRT -- 如果CPU选择了overlay,那么OVCx_OSEL选择的block会被激活;

OVSTP -- 对于CSEL选择的CPU,所有的overlay block会被失效;OVCx_RABRy.OVEN会被清除。

OVCONF -- overlay configured;置1,overlay block control寄存器已经配置好,并且已经为overlay start做好准备。

DCINVAL -- Data Cache Invalidate ;Data Cache Lines使能。

3.Overlay功能配置

        有了上述寄存器认识后,下面来看寄存器配置是如何实现重定向功能:

        假设我们现在想把PFlash0(0x8000 1000)(128byte)重定向到CPU0DSPR,那么我们要考虑三个关键因素,目标地址、映射block大小、重定向地址;

        很明显:目标地址即要重定向的flash地址:0x80001000(提问:可不可以不指定地址,让编译器随意分配地址?)

        Block大小:128byte即可;

        重定向地址:CPU0DSPR 0x70011000

        那么如何来配置寄存器呢?

3.1 确认用于重定向的CPU

        根据datasheet,通过核访问PFlash等可以被重定向;所以这里我们选择CPU0开启overlay功能。

        OVCCON.CSEL0 = 1,因为每个CPU都有至少32个可重定向的block,因此这里我们选取block0用于定向到CPU0DSPR,CPU0_OSEL.SHOVEN0=1

3.2 配置重定向Block大小

        Block大小为128byte,那么根据芯片手册,配置为0的为有效位,因此根据公式计算2^n * 32 = 128 ,得出n=2,也即OMASK 位域 = 0x 1111 1111 1100 (0xFFC)

OMASKi.OMASK = 0xFFC,OMASK.U = 0x0FFFFF800

3.3 配置目标地址和重定向地址

        目标地址寄存器为OTAR,重定向寄存器为RABR,该寄存器配置的难点在于:RABR.OBASE仅有17bit,OTAR.TBASE仅有23bit,如何把目标地址和重定向地址放进去?就需要参考下图:

        再来回顾 PF地址0x80001000,DSPR 0x70011000,OMASK 0x0FFFF800。

        首先我们来看,Destination有两种来源,一种是Original Address,一种是redirected;那么根据实际情况来看,什么时候选择原始地址,什么时候选择重定向地址,很明显要看左边比较的结果。

        根据芯片手册,需要A和TBASE所有参与比较的bit都相同,才会使用重映射地址;参考下图:

        源地址绿色部分(bit27:bit7)会参与地址比较,也即OTAR要装绿色部分一样的数据才会使用重映射地址;很明显,要比较的位域位置一样,因此要填到TBASE的值就为Target >> 5。

        OTAR - 0x00001000

        那么RABR寄存器该如何配置;

        我们知道,要定向的ram地址为0x70011000 = Base1+Base2+offset

        其中Base1 = b1000 0000 00,Offset = b00000

        很明显,需要把绿色部分填进OBASE,因此也是重定向地址 >>5,

        故RABR = 0x80011000

        配置完成后,来看结果

4.结果验证

        Overlay是针对CPU的,由于debug是走bypass功能,因此如果直接去memory看overlay flash值,必定还是原flash的值。因此在代码上做如下工作:

        首先在0x70011000 定义一个数组Test_Map_Cal_Ram,值如下:

        在0x80001000(flash)定义一个数组Test_Map_Cal_Flash,值如下:

        为了验证overlay功能,还需要一个中间变量来承接,定为Test_Algo_Update = 0;

上电时,我们首先看Test_Algo_Update,此时应该为0

Flash值为:

Ram值为:

现在开启overlay功能,

        要达到的效果为:通过cpu0读取flash的值,但实际上应该读的是ram的值,如下

        Debug看,确实是通过访问flash实际读取的ram的值

        从上图就可以看出,CPU0把数组Test_Map_Cal_Flash赋给了数组Update,如果overlay功能没有奏效,那这个时候应该Update  = {0,1,2,3....};

        但实际上我们可以看到Update = {20,21,22....},说明CPU0是把Cal_Ram的值赋给了Update,overlay奏效了。

5.小结

        通过上面验证,我们就可以用这个功能来做标定啦;标定量A存在PFlash地址0x80004000,使用overlay时,上位机就直接download 该变量的flash地址即可完成标定,不用再做flash和ram的映射了,特别是当有多块标定数据要做标定时,这个功能简直丝滑。

相关文章:

  • 多模态论文学习之ALBEF(Align BEfore Fusing)
  • 京东h5st逆向 python代码算法还原逆向分析 h5st代码
  • SpringMVC Day 10 : 拦截器
  • 最小化安装移动云大云操作系统--BCLinux-R8-U2-Server-x86_64-231017版
  • 【嵌入式开发学习】__hex文件、bin文件、axf文件的区别
  • Mybatis—XML配置文件、动态SQL
  • [idea]关于idea开发乱码的配置
  • 从零开始的目标检测和关键点检测(一):用labelme标注数据集
  • LeetCode----1979. 找出数组的最大公约数
  • 安装pytorch报错torch.cuda.is_available()=false的解决方法
  • input 调起键盘 ,键盘距离输入框底部太近
  • 我做云原生的那几年
  • Linux RPM包离线安装mysql数据库
  • 遥遥领先一个量级,平头哥发布首颗SSD主控芯片镇岳510
  • 人大金仓助力中国人民银行征信中心业务系统异地容灾优化升级
  • [deviceone开发]-do_Webview的基本示例
  • avalon2.2的VM生成过程
  • Hibernate最全面试题
  • LeetCode29.两数相除 JavaScript
  • OSS Web直传 (文件图片)
  • Python实现BT种子转化为磁力链接【实战】
  • Swift 中的尾递归和蹦床
  • webpack入门学习手记(二)
  • WePY 在小程序性能调优上做出的探究
  • 对象管理器(defineProperty)学习笔记
  • 番外篇1:在Windows环境下安装JDK
  • 基于组件的设计工作流与界面抽象
  • 精彩代码 vue.js
  • 力扣(LeetCode)21
  • 扑朔迷离的属性和特性【彻底弄清】
  • 区块链分支循环
  • 山寨一个 Promise
  • 微信小程序实战练习(仿五洲到家微信版)
  • 线性表及其算法(java实现)
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • 追踪解析 FutureTask 源码
  • #Java第九次作业--输入输出流和文件操作
  • #mysql 8.0 踩坑日记
  • (1)STL算法之遍历容器
  • (3)llvm ir转换过程
  • (6)添加vue-cookie
  • (C++17) optional的使用
  • (Java)【深基9.例1】选举学生会
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (第一天)包装对象、作用域、创建对象
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (六)激光线扫描-三维重建
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (转) 深度模型优化性能 调参
  • (转)3D模板阴影原理
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • *p++,*(p++),*++p,(*p)++区别?
  • .net framework 4.0中如何 输出 form 的name属性。
  • .NET 表达式计算:Expression Evaluator
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明