汽车电子expert成长之路

本博客发布的个人原创精品----嵌入式系统技术文章,欢迎大家参考学习,并转发分享!

CodeWarrior IDE使用Tips之利用prm链接文件实现储存器数据填充和代码编译结果CRC校验和自动生成详解

0
阅读(10960)

作者按:本文虽然以S12G128的CW 5.2 IDE应用工程为例进行介绍,其方法同样适用于CW6.3和CW10.x和CW11.x中 S08和MagniV S12Z系列MCU的CodeWarrior应用工程。

内容提要

引言

1. 使用prm链接文件关键词FILL实现储存器数据填充

1.1 CodeWarror IDE应用工程prm链接文件的关键词FILL的使用语法

1.2 S12G128的CW 5.2 应用工程FILL数据填充实例

2. 使用prm链接文件关键词CHECKSUM实现代码编译结果CRC校验和自动生成

2.1 CodeWarror IDE应用工程prm链接文件的关键词CHECKSUM的使用语法

2.2 S12G128的CW 5.2 应用工程CHECKSUM CRC校验实例

总结


引言


在开发汽车ECU的bootloader时,通常车厂(Car OEM)要求APP程序中要将未使用的Flash地址空间填充指定的数据或者代码,以便在量产后出现功能故障时,判断是否存在程序异常运行导致非预期Flash储存器擦除或改写,以防止ECU受干扰CPU运行到未用Flash储存器地址时,可以通过预先填充的死循环指令等待看门狗溢出或者BGND指令请求CPU进入调试模式,从而触发内核非法指令复位,达到恢复ECU正常功能。


另一方面,车厂(Car OEM)还要求对APP程序代码进行完整的CRC校验,从而在bootloader升级完APP程序时和每次有bootloader跳转到APP之前做同样的CRC校验以保证APP代码的完整性。


很多工程师实现以上两个功能都是选择一些专业第三方工具软件(比如Vector的HEXVIEW)或者自己在bootloader PC上位机软件中增加相应的功能代码对编译器生成的S19/HEX/BIN文件进行后期处理。前者会增加开发成本,后者则会增加bootloaderPC上位机软件开发难度和工作量。


其实,若使用是Freescale/NXP的S08、S12(X)或者MagniV S12Z系列MCU,软件开发工具链选择CodeWarror IDE的话,通过其应用工程的prm链接文件就可以非常轻松的实现以上功能了。

1.jpg

接下来,本文我就S12G128的CodeWarrior 5.2 IDE应用工程为例,给大家详细介绍一下以上两种功能的具体实现方法。


Tips:关于CodeWarrior IDE的prm链接文件,请参考如下文章:

《CodeWarrior IDE使用tips之prm链接文件详解(自定义存储器分区以及自定义RAM数据初始化与在RAM中运行函数)》;

Tips:关于CodeWarrior IDE的license和功能特性,请参考如下文章:


《 CodeWarrior IDE 版本选择与 License功能(feature)和价格,授权形式差异、激活方法与安装使用》;


1. 使用prm链接文件关键词FILL实现储存器数据填充


1.1 CodeWarror IDE应用工程prm链接文件的关键词FILL的使用语法


prm链接文件中定义储存器区域(SGEMENTS)时,在指定的储存器区域定义后 增加关键词FILL + 用户自定义填充的数据/代码二指令进制结果,即可完成该储存器区域未使用地址的数据/代码指令自动填充。


比如通过如下链接文件,即可将编译结果中S08系列MCU的直接存储RAM--DIRECT_RAM区域未使用地址填充0xAA,而RAM_AREA区域未使用地址填充0x22,以及将ROM_AREA代码区域未使用地址填充0xAA22:

2.jpg

1.2 S12G128的CW 5.2 应用工程FILL数据填充实例


新建一个S12G128 的应用工程,其默认的prm链接文件如下:

3.jpg

编译后生成的S19文件如下:

4.jpg

可以看到prm链接文件中的ROM_C000区域仅使用了79个字节,16KB的分页P-FlashPAGE_08未占用,要想把这两个P-Flash块未使用地址分别填充BGND指令和死循环指令,则使用FILL关键将其分别填充指令对应的二进制结果0x00和0x20FE/0x20 0xFE即可:


ROM_C000      = READ_ONLY     0xC000 TO   0xFEFF

                    FILL 0x00;

PAGE_08       = READ_ONLY   0x088000 TO 0x08BFFF

                    FILL 0x20 0xFE;


完整的prm链接文件如下:

6.jpg

Tips:通过CodeWarrior IDE的反汇编(disassemble)功能即可获得BGND指令和死循环指令对应的二进制结果:

7.jpg

编译结果如下,实现了想要的指令填充功能:

8.jpg

10.jpg

Tips:若使用了CodeWarrior的Processor Expert,则可以在其CPU组件中,通过配置Build options打开ROM/RAM segments定义的Fill pattern并输入想要填充的值即可,十分方便:

11.jpg

Tips:若要对整个应用工程使用的Flash空间全部填充,则将全部prm链接文件中分配的Flash区域定义都加上关键词FILL定义即可;


2. 使用prm链接文件关键词CHECKSUM实现代码编译结果CRC校验和自动生成


2.1 CodeWarror IDE应用工程prm链接文件的关键词CHECKSUM的使用语法

CodeWarror IDE应用工程prm链接文件的关键词CHECKSUM的使用语法如下:

12.jpg

CRC生成定义以关键词CHECKSUM 开始,以END标识结束,其中可以包含若干段独立的CRC校验条目(entry),以关键词CHECKSUM_ENTRY 开始,以END标识结束;


在每个CRC校验条目(entry)中,需要通过ChecksumMethod选择CRC校验生成方法,可以选择如下常见的CRC校验生成方法:


  • METHOD_XOR ,异或(XOR)所有OF指定MemoryArea数据成员,其数据成员和CRC结果大小可选的关键词SIZE指定或者默认由INTO_AREA 的大小决定;

  • METHOD_ADD ,与操作(ADD,加)所有OF指定MemoryArea数据成员,其数据成员和CRC结果大小可选的关键词SIZE指定或者默认由INTO_AREA 的大小决定;

  • METHOD_CRC_CCITT,生成CRC校验结果占用2字节;

  • METHOD_CRC8,生成CRC校验结果占用1字节;

  • METHOD_CRC16 ,生成CRC校验结果占用2字节;

  • METHOD_CRC32,生成CRC校验结果占用4字节;


OF为后跟的MemoryArea 为需要生成CRC校验结果的存储地址/区域,一个CRC校验条目可以包含若干合法的存储器地址/区域;


INTO为后跟的MemoryArea 为生成CRC校验结果的存储地址/区域,其必须预留足够大的空间,比如,若选择METHOD_CRC_CCITT,则需要至少保留2字节;


其他选项可选输入:


[INIT Number]用于指定CRC校验的初始计算值,若未指定,则默认使用0xFFFFFFFF;


[UNDEFINED Number]用于指定未使用的储存器地址在做CRC计算时使用的代替值,通常CHECKSUM CRC校验与FILL数据填充一起使用,由FILL关键词来指定为使用储存器空间地址的默认值;


比如如下prm链接文件输入,可实现按照METHOD_CRC_CCITT方法对只读区域0xE020 ~0xEEFF和0xEF00 ~ 0xFEFF的数据做CRC校验,并将结果存储在地址0xE010 中:

13.jpg

2.2 S12G128的CW 5.2 应用工程CHECKSUM CRC校验实例


在以上测试工程的基础上,在其prm链接文件在添加如下CHECKSUM输入:

14.jpg

即可将填充后的ROM_C000和 PAGE_08两个P-Flash区域按照METHOD_CRC_CCITT方法,未使用地址按照0xFF计算,生成CRC校验,其结果存储在地址0x0E8100,占用2个字节:


重新编译工程,后生成结果如下:

15.jpg

在地址0x0E8100生成的CRC校验结果为0x1CFA:

16.jpg

完整的工程prm链接文件如下:

17.jpg

Tips:本文测试工程使用了Processor Expert,但其不能配置prm链接文件的CHECKSUM 功能,因此,为了避免被其自动生成prm文件功能覆盖掉工程prm文件中手动增加的CHECKSUM CRC校验输入,需要在其CPU组件中,配置Build options关闭prm文件自动生成选项(Generate PRM file):

18.jpg

总结


本文详细介绍了CodeWarrior应用工程prm链接文件的FILL和CHECKSUM关键词实现指定存储器区域未使用地址空间的数据/代码自动填充和对指定代码区域数据/指令代码编译结果的CRC校验和计算;


本文虽然以S12G128的CW 5.2 IDE应用工程为例进行介绍,其方法同样适用于CW6.3和CW10.x和CW11.x中 S08和MagniV S12Z系列MCU的CodeWarrior应用工程。


为了帮助大家学习,我将本文配套的测试分享到如下百度云盘供大家参考:


链接: https://pan.baidu.com/s/10cbHrbmU7dAlH4wlXKVrEg

提取码: x642


作者公众号

1-1.jpg