内容提要 引言 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的存储器地址映射如下表:
其包含: 1个16KB的UTest NVM Block,用于配置MCU加解密信息和储存芯片出厂配置信息; 4个16KB的Data Flash Block,用于软件模拟EEPROM,储存用于数据或者亦可用于储存用户代码; 由2个16KB 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;总共2MB的Flash存储器; SRAM分为有4个128KB小分区和4个256KB的大分区组成的1.5MB系统SRAM和分配给3个e200内核的64KB大小,总共192KB的D-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.R和MC_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_CPU1和TURN_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.R和MC_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分区
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,或者VECTOR的hexviewer; 总结 本文虽然以S32R274和S32DS for Power为例介绍,但其中的多核启动配置和bootloader开发要点同样适用于Qorivva MPC57xx和S32R系列MCU中的其他多核MCU,比如MPC5748G和MPC5746R以及S32R372等。 这里只是抛砖引玉,希望对大家有所帮助。 |
|
来自: 西北望msm66g9f > 《编程》