目录
1.为什么要Flash Loader
2.Flash Loader设计细节
2.1 简单的代码框架
2.2 迷人的宏使用
2.3 关键的配置文件
3.dmac和mac文件
4.小结
搞国产车规芯片,IAR是必不可少的编译调试集成工具,历史背景不赘述,今天主要聊聊基于IAR的Flash Loader设计关键点。
1.为什么要Flash Loader
MCU基本都带eFlash,如果想基于Flash进行调试,直接通过Debug口去擦写Flash,指定是行不通的,因为每家芯片的Flash IP不一样,控制器、命令序列也不尽相同;
因此需要一小段基于各家芯片Flash定制的驱动程序来实现代码的刷写,这个程序就是Flash Loader,逻辑和汽车ECU的Bootloader一样,只是在这里IAR充当了上位机,所以Flash Loader就需要满足IAR的一些定制要求。
有兴趣的可以读一读IAR关于FlashLoader文档《Flash Loader Development Guide》。
具体流程可以简单总结为下图:
- IAR Debugger组件C-SPY 首先将Flash Loader下载到目标板的RAM中,剩余的RAM用于Buffer存放镜像文件。
- Image被下载到RAM Buffer;Flash Loader调用相关驱动将Image刷写至Flash,直到所有Image被刷进Flash;
- C-SPY清空RAM,将PC指向用户程序入口,设置SP,开始进行调试。
2.Flash Loader设计细节
2.1 简单的代码框架
IAR提供了关于Flash Loader的模板文件,路径如下:IAR Systerms\arm\src\flashloader\framework2,主要包含如下五个文件:
- flash_config.h:Flash Loader的配置文件,用于设定C-SPY和驱动函数的参数等;
- flash_loader_extra.h:额外的框架声明,不过没咋关注;
- flash_loader_asm.s:基于MCU内核的启动源码,几乎不用大改,唯一要注意就是SP设置;
- flash_loader.c:包含了框架代码,不能修改;
- flash_loader.h:框架原型声明;
- flash_loader_ram.c:真正需要添加具体驱动的文件。
flash_loader_ram.c里设置好了框架,具体函数接口如下表所示:
源码如下:
很明显,对于Flash,代码实现的擦写方式显然是不可取的,所以我们需要做的就是在上述函数里实现基于特定MCU的驱动,如果芯片厂家接口已经封装好了,直接拿来主义即可。 如下所示:
2.2 迷人的宏使用
代码框架看起来一点也不复杂,但是如果我们遇到了flash、optionByte默认受到保护的情况,那么就需要提前去干一些事情,IAR提供了Macro这个功能,用于串联起C-SPY和目标硬件,我们以Debug in Flash流程为例:
图片来源: IAR C-SPY® Debugging Guide
在C-SPY与目标MCU连接、下载Code的过程中,可通过执行上述宏,来实现我们想要的功能;例如,在C-SPY下载完Flash Loader到RAM后,紧接着就可以执行execUserFlashReset(),在里面我们可以根据语法添加任意代码,执行完成后C-SPY设置PC到Flash Loader入口,开始执行擦写Flash的功能,其余Macro用法依次类推。
设计Flash Loader时要熟悉这个流程,才能让每个Macro在合适的时机发挥作用。
2.3 关键的配置文件
上面全是流程的东西,到现在还没有讨论到最关键的几个地方:C-SPY如何知道要刷Flash的地址映射空间?上述宏在哪里定义?Flash Loader编译出来放到哪里?
我们直接看看芯驰E3104关于Flash Loader的配置文件,路径如下:
其中
- .board文件,XML格式,是Flash memory系统的配置文件,告诉了IAR目标板Flash相关属性文件,它长这样:
- .flash文件,同样是XML格式,告知IAR flash loader程序的路径、flash memory基地址、flash memory page、block大小等,一个board文件可以包含多个.flash文件,这样一次可刷写多个image;
- .mac文件,包含辅助宏,也就是前面那种图里的各种函数,如下:
那么.out文件是干的呢?就是flash loader工程编译过后的产物。
有兴趣的朋友可以到 路径\arm\src\flashloader中看看NXP、Infineon、GD等flash loader的源码。
最后,就是如何在调试界面使用flash loader,点击Project->Option->Debugger,选择目标.board文件,即可加载flash相关信息;
点击Debugger->Setup,选择.mac文件即可。
3.dmac和mac文件
有一个容易搞混淆的就是,在安装目录下Debugger文件夹里有个dmac文件,在整个调试过程中它里面的宏也会被调用,我们常用来开关MPU、操作看门狗等等,如下:
实际上在运行Flash loader的时候,dmac文件里的函数也会被调用,因此我们在设计mac文件里的函数时,也需要参考dmac里已实现的内容,我们可以打开对应硬件的调试log系统,来观察mac和dmac中的函数调用顺序。
4.小结
到这里,基于IAR的Flash Loader设计思路就梳理完毕了,剩下的就是开始接收各种调试bug,就酱!