分享

浅谈嵌入式软件开发之Qorivva MPC57xx和S32R系列多核MCU启动配置与bootload...

 西北望msm66g9f 2018-06-10

内容提要

引言

1. S32R274的系统功能框图和多核系统介绍

2. S32R274的存储器地址映射与使用Tips

3. S32R274的S32DS应用工程多核启动配置详解

4. Qorivva MPC57xx和S32R系列多核MCU bootloader开发要点详解

4.1 只需要为boot core CPU内核开发bootloader,因为每次MCU复位后,首先运行boot core CPU,然后再由其配置和使能非boot core内核;

4.2 运行在boot core内核的bootloader工程,需要启动配置半字(RCHW),可通过其链接文件(linker file)指定放置到MCU的Flash Boot Location区域,且必须保证在所有bootloader工程和应用工程地址空间分配中,bootloader的RCHW所在的boot location最小,推荐将bootloader的RCHW分配到MCU的boot location 0;

4.3 Flash分区时,bootloader与不同的多核APP工程之间不能跨Flash Block和RWW分区

4.4 bootloader到APP工程跳转时,使用硬件复位(推荐SWT看门狗复位)跳转至多核APP工程的boot core内核复位函数(通过将函数指针指向boot core内核的复位向量);

  4.5 将多核APP工程编译生成的.S19/.HEX文件使用文本编辑器合并作为最终的下载文件

    总结


引言


基于之前本公众号的技术分析文章(直接点击文章标题即可跳转阅读)S32DS使用Tips--S32DS for Power V1.2 链接文件和启动过程详解》和《汽车电子ECU BootLoader开发之基于CAN总线通信的MPC574xP系列MCU bootloader开发详解》,很多读者想了解Qorivva MPC57xx和S32R系列MCU中的多核MCU的启动过程和bootloader开发细节;在此,本文就以S32R274这颗针对ADAS 77GHz雷达应用的多核MCU为例,为大家讲解一下。


1. S32R274的系统功能框图和多核系统介绍


S32R274是基于PowerPC e200z4和e200z7内核的多核MCU,其集成了1个最大运行频率为133MHz的双核锁步(LSP--Lock Step)的e200z4内核,作为系统的启动内核(boot core)和功能安全应用内核,以及2个可以独立运行最大工作频率为266MHz的e200z7高性能计算内核,当然为了支持77GHz雷达信号的实时处理,其还集成了一个NXP专门针对雷达信号处理开发的SPT--Signal Processing Toolbox,信号处理工具箱,以及带端到端的ECC(e2eECC--End to End ECC) 内部互联总线系统和带ECC的Flash和SRAM存储器,内核和外设模块的错误与失效收集与处理模块(FCCU),,从而在满足系统高性能工作的情况下,还可以实现汽车电子要求的ISO-26262 ASIL-D功能安全等级。其完整的的系统框图如下:


2. S32R274的存储器地址映射与使用Tips


S32R274的存储器地址映射如下表:

System memory map

Start Address 

End Address 

Size [KB]

Description

RWW Partition

SRAM Bank

 Flash  

0x00000000 

0x003FFFFF 

-

Reserved 

-

UTest NVM Block 

0x00400000 

0x00403FFF 

16

UTest Block 

-

0x00404000 

0x007FFFFF 

-

Reserved 

-

Data Flash 

0x00800000 

0x00803FFF 

16

EEPROM Block 0 

0

0x00804000 

0x00807FFF 

16

EEPROM Block 2 

1

0x00808000 

0x0080BFFF 

16

EEPROM Block 1 

0

0x0080C000 

0x0080FFFF 

16

EEPROM Block 3 

1

0x00810000 

0x009FFFFF 

-

Reserved 

-

Boot Flash Blocks 

0x00A00000 

0x00A03FFF 

16

CSE2 flash block 0 

4

0x00A04000 

0x00A07FFF 

16

CSE2 flash block 1 

5

0x00A08000 

0x00F97FFF 

-

Reserved 


0x00F98000 

0x00F9BFFF 

16

Flash Block 0 (boot location 0) 

2

0x00F9C000 

0x00F9FFFF 

16

Flash Block 1 (boot location 1) 

3

0x00FA0000 

0x00FAFFFF 

64

Flash Block 2 (boot location 2) 

2

0x00FB0000 

0x00FBFFFF 

64

Flash Block 3 (boot location 3) 

2

0x00FC0000 

0x00FCFFFF 

64

Flash Block 4 

2

0x00FD0000 

0x00FDFFFF 

64

Flash Block 5 

3

0x00FE0000 

0x00FEFFFF 

64

Flash Block 6 

3

0x00FF0000 

0x00FFFFFF 

64

Flash Block 7 

3

Code Flash Blocks 

0x01000000 

0x0103FFFF 

256

Flash Block 8 (boot location 4) 

6

0x01040000 

0x0107FFFF 

256

Flash Block 9 (boot location 5) 

6

0x01080000 

0x010BFFFF 

256

Flash Block 10 (boot location 6) 

6

0x010C0000 

0x010FFFFF 

256

Flash Block 11 (boot location 7) 

7

0x01100000 

0x0113FFFF 

256

Flash Block 12 

7

0x01140000 

0x0117FFFF 

256

Flash Block 13 

7

Mirror Mid Flash Blocks

0x08F98000 

0x08FFFFFF 

-

mirrored from 0x00F98000 ­0x00FFFFFF 

-

Mirror Large Flash Blocks

0x09000000 

0x0917FFFF 

-

mirrored from 0x01000000 ­0x0117FFFF 

-

0x0A000000 

0x3FFFFFFF 

-

Reserved 

-

SRAM

0x40000000 

0x4001FFFF 

128

SRAM 

0

0x40020000 

0x4003FFFF 

128

SRAM 

1

0x40040000 

0x4005FFFF 

128

SRAM 

2

0x40060000 

0x4007FFFF 

128

SRAM 

3

0x40080000 

0x400BFFFF 

256

SRAM 

4

0x400C0000 

0x400FFFFF 

256

SRAM 

5

0x40100000 

0x4013FFFF 

256

SRAM 

6

0x40140000 

0x4017FFFF 

256

SRAM (overlay enabled) 

7

0x50800000 

0x5080FFFF 

64

D-MEM core_0 

-

0x50810000 

0x5081FFFF 

64

D-MEM core_1 

-

0x50820000 

0x5082FFFF 

64

D-MEM core_2 

-

其包含:

116KBUTest NVM Block,用于配置MCU加解密信息和储存芯片出厂配置信息;


416KBData Flash Block,用于软件模拟EEPROM,储存用于数据或者亦可用于储存用户代码;


216KB CSE2 flash block,2个16KB Flash Block0/1(boot location 0/1),6个64KB Flash Block2/3/4/5/6/7(含boot location 2/3)组成的Boot Flash Blocks,以及有6个256KB Flash Block8/9/10/11/12/13(含boot location 4/5/6/7)组成的Code Flash Blocks;总共2MBFlash存储器;


SRAM分为有4个128KB小分区和4个256KB的大分区组成的1.5MB系统SRAM和分配给3个e200内核的64KB大小,总共192KBD-MEM SRAM。


使用Tips


1. e200内核的启动配置半字(RCHW)必须放置在CodeFlash的8个boot location,占用其最开始的8个字节地址(4B RCHW配置+4B reset vector),MCU启动时,从boot location 0开始依次查找合法的RCHW:


2. 无论Flash还是SRAM存储器都有写时读分区(RWW-Read-While_Write Partition),一个RWW分区的存储器资源,一个时刻只能被CrossBar总线的一个master访问。所以在分配多核CPU的存储器资源时,尽量不要跨RWW分区,以避免访问冲突和延迟,降低系统存储器访问效率;


3. D-MEM SRAM为各内核特有的访问资源,将其分配给对应的CPU内核作为其专有的存储器,比如其系统堆栈,可以有效防止多核间的相互干扰和非同步操作;


更多关于Qorivva MPC57xx和S32R系列多核MCU 储存器访问的技术细节和使用Tips,请参考本公众号之前的文章(直接点击文章标题即可跳转阅读)

外设使用Tips之MPC57xx系列MCU C55 Flash模块详解及其SSD(标准软件驱动)使用》;


3. S32R274的S32DS应用工程多核启动配置详解


在S32DS for Power v2017.R1中,创建S32R274的应用工程,选择使能所有CPU内核:

3个CPU内核均分Flash和SRAM地址空间:

这样,就为S32R274创建好了多核应用工程,在S32DS for Power IDE的应用工程浏览器窗口中,可以看到以上过程为S32R274的每个CPU内核独自创建了一个应用工程:

其中,e200z4 CPU为boot内核,其启动函数startup在其连接文件中指定到0x1000000

然后再通过e200z4内核的应用工程src/flashrchw.c指定合法的启动配置半字RCHW和e200z4内核的复位向量(启动函数_start)到上图中链接文件中为其保留的启动配置半字(RCHW)段中(address@0xFA0000),0xFA0000为S32R274的boot location 2用户还可以修改e200z4内核应用工程的链接文件,将其放置到其他boot location

另外两个非boot core--e200z7_0/1计算CPU内核的启动地址由e200z4内核应用工程main.c中的hw_init()函数通过初始化MC_ME.CADDR2.RMC_ME.CADDR3.R两个硬件寄存器配置:

Tips:1. 多核MCU的MC_ME模块的CCTL2/3寄存器用于配置e200z7_0/1内核运行工作的模块,而CADDR2/3寄存器用于配置e200z7_0/1内核的启动地址,由于其仅取复位函数地址的高30-bit,所以该地址必须按32-bit(4字节)地址对齐

2.  以上代码使用的条件编译宏定义TURN_ON_CPU1TURN_ON_CPU2在创建多核应用工程时由IDE自动定义在多核工程的C编译器(C Compiler-->Preprocessor)和汇编器(Assembler-->Symbols)选项中全局定义:

多核MCU应用工程的汇编器编译选项设置:

其中,Z7_0 CPU内核的startup地址在0x1080000

Z7_1 CPU内核的startup地址在0x1100000


Tips在多核工程中,如果修改了链接文件中Z7_0/1内核的地址分配,必须保证其m_text的地址与boot core内核中MC_ME.CADDR2.RMC_ME.CADDR3.R两个硬件寄存器配置一致,才能正常启动和工作


这里介绍的是多核MCU的启动配置,关于多核MCU的中断和异常配置,请参考以下文章(直接点击文章标题即可跳转阅读):


外设使用Tips之Qorivva MPC56xx_57xx系列MCU内核异常(IVORx)与IRQ中断处理详解》;


4. Qorivva MPC57xx和S32R系列多核MCU bootloader开发要点详解


基于以上分析,我们在开发Qorivva MPC57xx和S32R系列多核MCU bootloader时,需要注意以下方面:


4.1 只需要为boot core CPU内核开发bootloader,因为每次MCU复位后,首先运行boot core CPU,然后再由其配置和使能非boot core内核;


在多核MCU中,每个CPU内核都可以访问MCU所有的片上Flash和SRAM储存器(各自内核的D-MEM SRAM除外),只需要在链接文件中将相应的地址分配好即可。


Tips:在创建多核MCU的bootloader工程时,只需要创建boot core内核的单核工程就好,在S32DS for Power应用工程创建向导的第二步只勾选boot core就可以了:

但是请注意,以上界面中可以调整每个CPU内核的Flash和SRAM大小,但不能调整boot core内核的起始地址,其默认为0x1000000,其属于Size = 256KB的Flash Block 8(boot location 4), 其Flash Size较大,且boot location也不是最小,所以并不适合分配给bootloader工程使用,所以建议修改工程的链接文件将其分配到0xF98000开始Flash Block 0(boot location 0)开始的Flash地址空间(Flash size较小且包含boot location 0)


4.2 运行在boot core内核的bootloader工程,需要启动配置半字(RCHW),可通过其链接文件(linker file)指定放置到MCU的Flash Boot Location区域,且必须保证在所有bootloader工程和应用工程地址空间分配中,bootloader的RCHW所在的boot location最小,推荐将bootloader的RCHW分配到MCU的boot location 0


将bootloader的RCHW分配到MCU的boot location 0可以保证每次MCU复位后,都首先运行bootloader,而不是其他代码。


4.3 Flash分区时,bootloader与不同的多核APP工程之间不能跨Flash Block和RWW分区


  • bootloader与APP工程占用不同的Flash Block,可以保证bootloader与APP的相互独立,提高APP升级效率;


  • bootloader与APP工程占用不同的Flash RWW分区,可以将bootloader中的Flash驱动放在Flash上直接运行,二无需将其拷贝/重映射到SRAM中运行;


4.4 bootloader到APP工程跳转时,使用硬件复位(推荐SWT看门狗复位)跳转至多核APP工程的boot core内核复位函数(通过将函数指针指向boot core内核的复位向量);


使用SWT timeout 的硬件复位跳转可以保证,运行APP工程之前,内核和外设处于复位状态,与单独运行APP程序时一致,从而避免出现跳转后外设模块初始化失败的情况(尤其是时钟模块,eg. PLL/ME等)。


4.5 将多核APP工程编译生成的.S19/.HEX文件使用文本编辑器合并作为最终的下载文件


由于多核APP工程为每一个CPU内核都创建了不同的应用工程,所以也会生产各自的编译结果(.map存储器映射文件、.elf二进制可执行调试文件和.S19/HEX/BIN编程文件)。


其中.S19和.HEX文件都是文本格式的,可以直接使用任意文本编辑器打开,然后将其中与Flash编程无关的行(比如S19文件的S0/S7/S8/S9行)去掉,拷贝到一个.S19/.HEX文件作为bootloader上位机的输入文件即可


.BIN文件仅包含编程数据,无编程地址,编程地址需要在编程时指定。所以在更新.BIN文件结果时,其编程地址根据各自内核的APP工程链接文件和map文件结果来决定其为非文本文件,需要使用专门的阅读/编辑器才可以打开,比如Segger的编程软件J-Flash,或者VECTORhexviewer;


总结


本文虽然以S32R274和S32DS for Power为例介绍,但其中的多核启动配置和bootloader开发要点同样适用于Qorivva MPC57xx和S32R系列MCU中的其他多核MCU,比如MPC5748G和MPC5746R以及S32R372等。


这里只是抛砖引玉,希望对大家有所帮助。




    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多