1、简述
在汽车ECU开发中,标定是必不可少的一环,Infineon Tc3xx提供的overlay功能可以将flash地址重映射到ram区域,进而通过XCP等协议就可以直接修改flash地址对应的变量,非常方便。
2、Overlay
相关的内容可以在UserManel的5.3.9节中找到,在CPU章节,感兴趣可以看看原文。
2.1 数据访问重定向
如上图所示,当开启Overlay功能后,在访问目标内存的时候会转而访问重定向内存地址,在配置Overlay Block的时候有几个比较重要的东西:
① Target Base Address:要重定向的目标地址范围的起始地址
② Block Size:标定区域块大小
③ Redirection Base Address:重定向基地址
个人认为还是比较好理解的,就是你要从哪准备标,标多大块,定义好了之后方便干活。同时在Tricore里每个核给了32个可定义大小和范围的overlay block,可通过寄存器使能和关闭。
2.2 相关寄存器
与2.1节提到的几个地址和块大小相关的配置寄存器有四个,分别是OSEL、OTARx、OMASKx和RABRx,还有一个全局重映射控制寄存器在SCU里面,下面我们详细介绍下各个寄存器和配置项。
2.2.1 OESL(CPUx Overlay Range Select Resiger)
每个core都有32个可配置的overlay block,每个block的使能和关闭都对应着寄存器的一个bit,同时OVCCON.OVSTRT也可用关闭overlay block;
2.2.2 RABRi(CPUx Redirected Address Base Register i)
重映射地址基础配置寄存器,其中OBASE是标定区域的基地址,但不是32位的,后面会详细描述,是在OMEM选择的基础上,从选择地方的基地址进行偏移的,如LMU、DSPR等。
2.2.3 OTARi(CPUx Overlay Target Address Register i)
重定向目标地址配置寄存器,主要配置的就是需要重映射的地址,这个地址是bit27-bit5,用来设置需要的重定向地址的,即8h / Ah,开头范围内的Flash区域,如下图,包含PFlash、DFlash、OLDA和EBU,后面我们跟OBASE一起来讲下如何配置。
2.2.4 OMASKi(CPUx Overlay Mask Register i)
重映射掩码寄存器,主要是用来配置重定向区域大小的,可用看到rw的只有OMASK,配置时配置此项即可,共12个bit,如下面手册中节选的图片所示,overlay blocK只能是2的n次方的32个字节大小,比如我现在需要配置block位128KByte,那么就是128 x 1024 Byte,我们再除以32(只能是32Byte的2的次方)得到4096,也就是2的12次方,OMASK中0是有效,所以12个位全部填0即可;同理,如果想要32KByte,那么就是32 x 1024Byte,除上32得到1024,是2的10次方,那么10个位填0,其余2个位填1,即1100 0000 0000b,也就是手册上写的C00h。
2.2.5 OVCENABLE(Overlay Enable Register)
这个寄存器把对应核的使能开启来就可以了,主要跟需求有关。
2.2.6 OVCCON(Overlay Control Register)
重定向控制寄存器,在手册5.3.9.4详细描述了具体操作,只要是用来禁用和启用每个核overlay功能的,这里不具体描述了,感兴趣可以自行查看原文。
2.3 相关功能配置
如上图所示,这就是Overlay的进程展示,其中Original(Target)Address是Flash地址,Redirected Address是重定向的地址,假设我们现在想将0x80220000重映射到CPU0的DLMU(0xB0000000),TC38x的CPU0的DLMU大小是64Kbyte,基于这个场景来配置下寄存器。
① 首先使能下block,(CPU0)OVCENABLE.OVEN0 = 1;(block0)OESL.SHOVEN_0 = 1;
② 其次可以确定下我们的块大小是64Kbyte,OMASK为800h,再加上reserved和fix 1的bits,当前整个寄存器的值是0x0FFF0000;
③ 对于OTARx和RABRx寄存器,需要联合整个过程来配置,首先我们想配到CPU0的DLMU,则需要配置RABRx.OMEM = 8h,即选择LMU,其地址应该是0xB0000000;带入图中,假设Redirected Address是0xB0000000,所以Base2 bits 21..5正好对应RARBx寄存器的OBASE,因此OBASE应该填00000000000000000b,同时设置RABRx.OVEN = 1,因此现在RABRx寄存器的值应该为0x88000000h,截至目前RABRx已经配置好了;现在再看OTARx,根据上图,是否选择Redirected区域取决于TBASE和源地址的(Flash)bits 27..5,根据手册需要这两者的bit完全相同才会启用overlay,那么显而易见,配置TBASE等于Flash地址的bits 27..5就可以了,对于这个例子来说是80220000h,TBASE=02200h000b,所以OTARx寄存器的值为0x00220000。
Ok了,现在已经配置完CPU0对于80220000h地址到CPU0_DLMU B0000000h地址的重映射了,如果有多核需要同时对一个地址访问的需求,比如这个变量在core2使用,xcp标定任务在core0,那么就要保持这两个核配置的一致,即配置完cpu0之后要把cpu2的按照相同的配置搞一遍。
2.4 验证测试
需要注意的是如果是通过debug来观测标定量的话是不会看到变量被成功标定的,因为overlay和debug走的路径不同;可以用劳特巴赫从dump上看下对应overlay地址是否更改了,或者通过link定义变量在对应的overlay地址上,再看对应的变量就可以了。
3、小结
Tricore的overlay配置还是有些绕的,需要多读一读手册,写这篇文章希望对各位在相关配置上有所帮助。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/null_scl/article/details/143744421
|