配置e200系列CPU内核MMU实现MCU的参数在线实时标定
0赞汽车ECU参数标定之配置e200系列CPU内核MMU实现Qorivva MPC56xx_57xx系列MCU的参数在线实时标定
内容提要
引言
1.PowerPC e200z4内核MMU工作原理介绍
2. MMU配置寄存器与辅助寄存器MAS介绍
2.1 MMU配置寄存器--MMUCFG/SPR-1015 与 TLBCFG/SPR-689
2.2 MAS0寄存器--SPR-624
2.3 MAS1寄存器--SPR-625
2.4 MAS2寄存器--SPR-626
2.5 MAS3寄存器--SPR-627
2.6 MAS4寄存器--SPR-628
2.7 MAS6寄存器--SPR-630
3. MMU配置相关汇编指令介绍
4. MMU TBL操作详解
4.1TLB传输重加载(Translation Reload)
4.2 读取TBL
4.3 写入TBL
4.4 搜索TLB
5. 复位后TBL的加载(默认配置)和MMU调试Tips
6. MMU配置标定地址映射具体实现步骤和结果
6.1 按照标定需求编程MMU配置API函数
6.2 配置工程链接文件
6.3 在线标定实测代码和结果分析
总结
引言
在汽车ECU开发过程中,为了适应不同的车型和工况,常常需要对类似驱动电机参数,发动机控制曲线以及空调温度控制曲线等若干参数进行标定,以实现控制算法与控制目标的匹配从而达到最佳效果。
由于一个标定系统中存在若干参数,其大小不一,可能是1个字节、2个字节,甚至长达若干个字节,为了提高存储器的利用效率(Flash需要先按照sector/block擦除,然后才能编程数据,而SRAM可以按照字节读写,无需先擦除,访问效率极高),在常见的汽车ECU标定协议CCP中都是将标定参数放置在指定地址范围Flash/EEPROM等非易失性存储器中,而在标定时,将其被映射到SRAM中,以方便在线实时修改并观察效果----即在线实时参数标定。
Tips:关于如何在Freescale/NXP的汽车级MCU软件集成开发环境(IDE)--CodeWarrior和S32DS中指定全局变量到特定存储器地址,且不被编译器优化,请参考如下文章(点击标题即可直接跳转阅读):
《S32DS使用Tips--S32DS for Power V1.2 链接文件和启动过程详解》;
接下来,我就为大家详细介绍如何通过配置Qorivva MPC56xx_57xx系列MCU的的e200系列CPU内核MMU实现参数在线实时标定。
1.PowerPC e200z4内核MMU工作原理介绍
Qorivva MPC56xx/57xx系列MCU中使用PowerPC e200z3、e200z4、e200z6和e200z7内核的MCU,典型如MPC563xM(基于e200z4内核),MPC564xA/MPC574xP/MPC574xR(基于e200z4内核),MPC577xK/M/C(基于e200z7内核),其内核中集成了MMU--Memory Management Unit,内存管理单元,从而支持虚拟地址(Virtual Address)到物理地址(Physical Address)的转换映射和管理。
Tips:此处虚拟地址为函数和全局变量的运行时地址(Run-Time Address),也被称作有效地址(Effective Address),而物理地址为函数和全局变量的存储地址(Store Address),也称作真实地址(Real Address)。
不同的PowerPC内核支持的MMU特性有所差别,具体请参考相应的内核手册,本文以典型的MPC564xA系列MCU使用的e200z446n3内核为例介绍MMU及其配置方法。
具体来看,从e200z446n3的CPU内核手册(e200z4 Power Architecture™ Core Reference Manual, Rev. A, 03/2009)可以查到其MMU具有以下特性:
支持虚拟内存管理;
支持32-bit的虚拟和物理地址;
8-bit的处理识别器;
多达16条目(entry)的TLB(Translation Lookaside Buffer,(地址)转换查找缓冲);
TLB错过(miss)异常的硬件辅助处理(IVOR13(Data TLB Error Interrupt)和IVOR14(Instruction TLB Error Interrupt)的内核异常);
每个TLB条目支持的页大小(page size)从1KB到4GB;
TLB条目冲洗保护(flush protection);:
通过汇编指令--tlbre, tlbwe, tlbsx, tlbsync, and tlbivax软件管理/配置;
兼容Freescale EIS(Embedded Implementation Standards,嵌入式实现标准) MMU架构;
支持外部控制TID值子集条目匹配,从而实现非入侵式的在线实时映射修改功能;
MMU配置使能后,每次CPU内核发起存储器访问(通过加载(load)和保存(store)指令存取数据)时都会使用其虚拟地址与有效的MMU TLB条目地址映射配置进行比较,并确定其在不同CPU模式下的访问权限,如果匹配成功,则MMU允许CPU的此次存储器访问,该过程叫做TLB条目命中(TLB entry hit); 如果所有的MMU TLB都没有与当前CPU访问虚拟地址请求匹配的,则MMU将阻止CPU的此次存储器访问,并产生响应的VOR13(Data TLB Error Interrupt,数据存取访问)和IVOR14(Instruction TLB Error Interrupt,取指令访问)内核异常,此过程叫做MMU TLB错过(TLB entry miss)。
内核存储器访问时的虚拟地址与MMU TLB条目比较流程示意图如下:
e200z446n3内核支持的有效地址(EA)页大小及其与MMU TLB条目中的有效页号(EPN)比较如下:
Tips:配置MMU TLB条目时,其有效地址和真实地址必须按照此表中的size进行地址对齐;
MMU中有效地址到真实地址的转换流程图如下:
下图为MMU TLB的访问权限授权逻辑:
一个完整的MMU TLB条目配置信息如下表:
Tips:其中详细的位域功能描述请参考下文MAS0~3寄存器介绍。
2. MMU配置寄存器与辅助寄存器MAS介绍
在e200z4内核中,定义了若干特殊寄存器用于提供其MMU的硬件实现/配置信息以及用于辅助配置MMU TLB的MAS0~3寄存器,以及用于处理MMU TLB 错过(miss)异常MAS4和MAS6寄存器,本小节将对其进行详细介绍。
2.1 MMU配置寄存器--MMUCFG/SPR-1015 与 TLBCFG/SPR-689
通过查询/读取只读特殊寄存器SPR-689可以获得该内核的MMU硬件实现/配置信息--RASIZE(支持的真实地址位宽)、NPIDS(PID寄存器序号r)、PIDSIZE(PID寄存器大小)、NTLBS(TLB结构数量)以及MAVN(MMU架构版本号):
2.2 MAS0寄存器--SPR-624
特殊寄存器SPR-624, MMU配置辅助寄存器MAS0用于选择当前访问的TLB序号/索引(TLBSEL,对于e200系列内核,只有TLB1,故该位域只能为01'b)、想要配置的TLB条目(ESEL)以及用于TLB错误处理的NV信息(默认配置为0即可):
2.3 MAS1寄存器--SPR-625
特殊寄存器SPR-625, MMU配置辅助寄存器MAS1用于配置所选MMU TLB条目是否正确/可用(VALID)、是否受Invalidation保护(IPROT)、与有效地址的处理ID比较的转换ID(TID)、转换地址空间(TS)以及该MMU TLB的转换页大小(TSIZE):
2.4 MAS2寄存器--SPR-626
特殊寄存器SPR-626, MMU配置辅助寄存器MAS2用于配置所选MMU TLB条目管理存储器页的有效地址页号(EPN)、是否为Power ISA(指令集架构)VLE页(VLE)、是否缓冲(cache write through)(W)、是否禁止缓冲(I)、是否要求存储器一致(M)、是否需要访问保障(G)以及大小端选择(E):
2.5 MAS3寄存器--SPR-627
特殊寄存器SPR-627, MMU配置辅助寄存器MAS3用于配置所选MMU TLB条目管理存储器页的转换真实地址页号(RPN)、系统软件保留位(U0~U3)以及访问权限(PERMIS,UX/W/R--用户模式(User mode)下可执行(X)/可写(W)/可读(R);SX/W/R--管理员模式(Supervisor mode)下可执行(X)/可写(W)/可读(R)):
2.6 MAS4寄存器--SPR-628
特殊寄存器SPR-628, MMU配置辅助寄存器MAS4用于在TLB错误发生时的TLB条目的硬件替换辅助配置:
2.7 MAS6寄存器--SPR-630
特殊寄存器SPR-630, MMU配置辅助寄存器MAS6与MAS4一样,都用于TLB错误发生时的异常处理,对MMUTLB配置时无需关心:
最后,总结所有MMU配置辅助寄存器MAS0~3、MAS4和MAS6的配置位域映射如下表,方便大家查阅和参考:
3. MMU配置相关汇编指令介绍
PowerPC e200z4内核的MMU配置TLB通过若干MMU辅助寄存器(MAS)进行读写访问。由于MAS寄存器都属于内核特殊寄存器,所以,用户软件需要通过汇编指令mtspr(move to special register,将CPU通用寄存器(GPR0~31)的值写入指定特殊寄存器(SPR))和mfspr(move from special register,将指定特殊寄存器(SPR)的值读取到CPU通用寄存器(GPR0~31)中)来读写MAS寄存器;
然后,数据再通过指令tlbre(TLB read entry,TLB读取条目)从TLB条目读到MAS寄存器中,通过指令tlbwr(TLB write entry,TLB写入条目)将MAS寄存器的内容写入到TLB条目中。
当出现TLB操作指令或者数据错误时,MAS寄存器的特定位域也将被硬件修改,以帮助用户判读问题原因。
在TLB错误中断发生时,硬件将相应的有效地址(EA)、默认属性(TID,WIMEG和操作权限)以及TLB选择信息等写入到MAS寄存器中以替代原有TLB。用户软件可以通过在TBL误操作时更新一个可替代的条目配置值来管理这些条目选择信息。在执行指令tlbwe之前,软件必须通过正确的真实地址序号(RPN)和权限信息到其中一组MAS寄存器。
在处理DSI或者ISI中断时,软件应该使用DSI或者ISI异常发生/识别时PID0寄存器和相应的MSR[IS]或者MSR[[DS]位值更新MAS寄存器中的搜索PID(SPID)和搜索地址空间(SAS)位域。此时,在中断处理函数中,软件需要使用TLB搜索指令--tlbsx,其执行时将使用SPID和SAS位域以决定哪个TLB条目引起了相应的DSI或者ISI异常;
总结一下,MMU的TLB配置和相关异常处理时会用到的汇编指令如下:
相应的指令编码和执行过程如下:
Tips:①如果在DSI或者ISI异常发生/识别到tblsx指令执行之前有个TLB验证(invalidate)或者替换移除了相应的条目的话,到TLB搜索发生时,相应的条目信息已经不再存在TLB中了。
②tlbre、 tlbwe、 tlbsx,、tlbivax和tlbsync都是特权指令,需要在特权/管理员权限下运行,也就执行它们时必须满足MSR[PR]=0。
4. MMU TBL操作详解
4.1TLB传输重加载(Translation Reload)
TBL重加载功能通过执行一些硬件辅助软件,这些硬件辅助包括以下资源/操作:
5个32-bit的MMU辅助寄存器(MAS0~4和MAS6)以支持tlbre、 tlbwe、 tlbsxTLB管理指令;
根据TLB丢失异常MAS4寄存器的默认值加载MAS0~2,这将自动生成大部分TLB条目;
加载引起对齐、数据TLB丢失或者数据存储中断的加载(load),存储(store)或者缓存管理(cache management)指令的有效地址到数据异常地址寄存器(DEAR--data exception address register);
当指令tlbwe指令执行时,包含在MAS0~2中的新的TBL配置将被写入TLB;
4.2 读取TBL
TLB数组通过先使用mtspr指令写入必要信息到MAS0,然后执行tlbre指令的方式读取。当读取TBL时,MAS0[TLBSEL]必须设置为0b'01且MAS0[ESEL]必须指向期望读取的条目,在执行tlbre指令后,MAS1~3将被来自TLB条目的数据更新;
4.3 写入TBL
TLB数组通过先使用mtspr指令写入必要信息到MAS1~3,然后执行tlbwe指令的方式写入配置信息。当写入TBL时,MAS0[TLBSEL]必须设置为0b'01且MAS0[ESEL]必须指向期望配置的条目,在执行tlbwe指令后,MAS1~3中存储的TLB条目信息将被写入到所选的TLB条目中;
4.4 搜索TLB
TLB可以通过先使用mtspr指令写入必要信息到MAS6,然后执行tlbsx指令的方式进行搜索。tlbsx指令使用本指令选择的GPR中的EPN[0–21]和MAS6中的SAS(搜索AS位)SPID进行搜索,如果搜索成功,给定TLB条目信息将被加载到MAS0~3中,同时MAS1中的正确位将作为操作成功标志被置位,即MAS1[V]=1;若操作失败,该位将被清零,即MAS1[V]=0。tlbsx指令在寻找引起DSI或者ISI异常TLB条目时非常有用。
5. 复位后TBL的加载(默认配置)和MMU调试Tips
MCU复位后,除了条目0之外的所有TBL条目都是作废,不起作用的。TLB条目0将加载下表中的配置:
通过CW 2.10自带的ICDPPCNEXUS debugger的MMU Table Registers窗口,可以读取目标MCU的MMU TLB条目配置并以图形化方式显示配置结果,十分方便。
以上复位后e200z4内核MMU配置结果如下:
Tips:在CW2.10 的调试界面中,MMU Table Registers窗口的值不会自动更新,所以要想查看当前断点时真实的MMU配置,必须将其关闭,重新打开:
Tips:MPC5644A在CW2.10 IDE调试环境下,点击debug下载elf到目标板之后,默认将运行位于其安装目录的debug控制脚本(\CW for MPC55xx and MPC56xx 2.10\pemicro\mpc564xA_vle.mac),故在进入debug之后,用户看到的MMU配置如下,而非上图复位结果:
原因是在mpc564xA_vle.mac中,有如下MMU初始化脚本对TLB0~5进行了如上配置:
REM Setup MMU for for Periph B Modules
REM Base address = $FFF0_0000
REM TLB0, 1 MByte Memory Space, Guarded, Don't Cache, All Access
spr 624t $10000000 ; MAS0
spr 625t $C0000500 ; MAS1
spr 626t $FFF0002A ; MAS2
spr 627t $FFF0003F ; MAS3
execute_opcode $7C0007A4 ; tlbwe
REM Set up MMU for Internal SRAM
REM Base address = $4000_0000
REM TLB3, 256 KByte Memory Space, Not Guarded, Don't Cache, All Access
spr 624t $10030000 ; MAS0
spr 625t $C0000400 ; MAS1
spr 626t $40000028 ; MAS2
spr 627t $4000003F ; MAS3
execute_opcode $7C0007A4 ; tlbwe
REM Set up MMU for Periph A Modules
REM Base address = $C3F0_0000
REM TLB4, 1 MByte Memory Space, Guarded, Don't Cache, All Access
spr 624t $10040000 ; MAS0
spr 625t $C0000500 ; MAS1
spr 626t $C3F0002A ; MAS2
spr 627t $C3F0003F ; MAS3
execute_opcode $7C0007A4 ; tlbwe
REM Set up MMU for External Memory
REM Base address = $2000_0000
REM TLB2, 16 MByte Memory Space, Not Guarded, Cachable, All Access
spr 624t $10020000 ; MAS0
spr 625t $C0000700 ; MAS1
spr 626t $20000020 ; MAS2
spr 627t $2000003F ; MAS3
execute_opcode $7C0007A4 ; tlbwe
REM Set up MMU to put internal Flash at 0...
REM Virtual address 0x0 -> Physical address = $0000_0000
REM TLB1, 16 MByte Memory Space, Not Guarded, Cachable, All Access
spr 624t $10010000 ; MAS0
spr 625t $C0000700 ; MAS1
spr 626t $00000020 ; MAS2
spr 627t $0000003F ; MAS3
execute_opcode $7C0007A4 ; tlbwe
REM Set up MMU for External Memory - SRAM
REM Base address = $3FC0_0000
REM TLB5, 4 MByte Memory Space, Not Guarded, Cachable, All Access
spr 624t $10050000 ; MAS0
spr 625t $C0000600 ; MAS1
spr 626t $3FC00020 ; MAS2
spr 627t $3FC0003F ; MAS3
execute_opcode $7C0007A4 ; tlbwe
Tips:以上脚本中, REM开始的行为注释行,不影响实际命令执行;
此处mac文件的作用与之前本公众号文章《CodeWarrior IDE使用Tips之Qorivva MPC56xx新建应用工程选项、调试高级选项及下载过程控脚本详解》中介绍的CW 10.6/7应用工程的debugger控制脚本.tcl文件作用相同--通过debugger控制脚本为程序下载和调试做准备;
6. MMU配置标定地址映射具体实现步骤和结果
6.1 按照标定需求编程MMU配置API函数
在配置MMU之前,需要先对目标MCU的存储地址空间分区有一个十分清晰的规划,比如本例中,对MPC5644A的地址空间规划如下:
在此基础上,按照上文介绍方法通过MAS0~3寄存器和tlwe指令实现对MMU TLB条目的配置,比如将标定数据所在32KB Flash虚拟地址空间0020_0000~0020_7FFF映射到SRAM的物理地址空间4002_8000~4002_FFFF的MMU TLB 1配置API实现代码如下:
Tips:其中mtMAS0 r3是特殊汇编指令,其等效于mtspr 624 r3;而mtMAS3 r3,等效于mtspr 627 r3,使用mtMAS0,mtMAS1,mtMAS2和mtMAS3指令更方便简洁,无需知道具体的MAS寄存器对于的特殊寄存器编号。
6.2 配置工程链接文件
首先,在工程链接文件的MEMORY{}分区中,为用于标定的Flash和SRAM地址空间单独分区:
在工程C源文件中,定义用于标定的标定参数,并使用#pragma section data_type ".CalRefPage" ".CalRefPage"和__declspec(section ".CalRefPage")指定到特定数据段(.CalRefPage)中:
然后,在工程链接文件的SECTION{}段放置中,将标定数据段放入Flash分区中:
并将标定数据定义数据添加到FORCEACTIVE{}中,以避免被优化掉:
Tips:关于如何在Freescale/NXP的汽车级MCU软件集成开发环境(IDE)--CodeWarrior和S32DS中指定全局变量到特定存储器地址,且不被编译器优化,请参考如下文章(点击标题即可直接跳转阅读):
《CodeWarrior与S32DS IDE使用 Tips之如何在应用工程中保留定义但未使用的全局常量、变量(用于参数标定)》;
6.3 在线标定实测代码和结果分析
在开始在线标定之前,需要配置MMU,使能SRAM和Flash存储器以及外设桥(使能MCU片上外设的访问)地址空间的地址映射和属性配置,本例MMU配置地址映射(使用32KB标定空间的测试用例case 2)如下:
Tips:考虑到Qorivva MPC56xx的Flash的擦除最小单元Block的大小,在MPC5644A中0x0020_0000开始的CodeFlashBlock为512KB,而我们配置标定参数区域受限于SRAM的大小,只有32KB或者64KB,要想将剩下的480KB或者448KB也使用的话,需要增加MMU TLB条目将其地址空间也进行配置和映射才行,本例中未分配(在工程链接文件中同样将其保留),是为了支持使用CCP协议通过调用Flash驱动,在在线标定最后将SRAM中的标定数据直接写入Flash空间,而不影响其他程序和数据(当然为了提高Flash利用效率也可以选择size较小的Flash Block(比如64KB的L8和L9以及16KB的L4~L7等Code-Flash Block)来存储标定数据):
并将存储在Flash上的标定参数初始化值,拷贝到相应的SRAM标定区域以实现初始化:
在线实时标定测试代码如下:
将标定Flash地址段映射到Flash地址时,标定变量不能被实时修改:
相应的MMU映射如下, TBL1将虚拟地址0020_0000~0020_7FFF映射到了
其本来的存储物理地址0020_0000~0020_7FFF:
将标定Flash地址段映射到SRAM之后,则可以实时修改标定参数:
相应的MMU映射如下, 此时TBL1将虚拟地址0020_0000~0020_7FFF映射到了SRAM的物理地址4002_8000~4002_FFFF:
总结
本文以MPC5644A使用的PowerPC e200z4内核为例,介绍了e200系列CPU内核的MMU配置和用于在线标定的方法和步骤,利用MMU TLB条目配置改变标定数据虚拟地址到物理地址的映射关系:
在标定时,将标定数据所在的Flash逻辑地址空间映射到SRAM的物理地址空间,从而可以实时修改标定数据,从而可以实时观察到标定参数修改后的程序运行结果,实现在线实时标定;
在量产时,将标定数据所在的Flash逻辑地址空间映射到其本身的Flash物理地址空间即可;
将标定结果更新到Flash的方法有两种:
①通过CCP协议导出标定结果到上位机软件,修改应用工程编译结果S19文件中标定数据所在的S19行(通过工程解析map文件获得地址信息),然后重新下载S19文件;
②通过CCP协议API调用底层的Flash驱动程序,在线擦除并编程标定结果到其Flash物理地址空间;
MMU对虚拟地址到物理地址的映射配置除了可以应用于在线实时参数标定外,还可以用于固件(Firmware)双备份的FOTA(Firmware On The Air)--将Firmware A和Firmware B存储物理地址与运行虚拟地址隔离,使其运行时虚拟地址一致,而存储时物理地址在不同的Flash分区中,以便于Flash的程序运行时在线Flash编程;
关于MMU或者MPC57xx系列的Flash Overlay在FOTA中的应用,我将在后面的文章中为大家介绍,敬请关注!