徽州骆驼 · 6 天前

IAR 环境下的 FlashLoader 设计

目录

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》。

具体流程可以简单总结为下图:

image.png

  1. IAR Debugger 组件 C-SPY 首先将 Flash Loader 下载到目标板的 RAM 中,剩余的 RAM 用于 Buffer 存放镜像文件。
  2. Image 被下载到 RAM Buffer;Flash Loader 调用相关驱动将 Image 刷写至 Flash,直到所有 Image 被刷进 Flash;
  3. C-SPY 清空 RAM,将 PC 指向用户程序入口,设置 SP,开始进行调试。

2.Flash Loader 设计细节

2.1 简单的代码框架

IAR 提供了关于 Flash Loader 的模板文件,路径如下:IAR Systerms\arm\src\flashloader\framework2,主要包含如下 6 个文件:

  • 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 里设置好了框架,具体函数接口如下表所示:

Image

源码如下:

Image

很明显,对于 Flash,代码实现的擦写方式显然是不可取的,所以我们需要做的就是在上述函数里实现基于特定 MCU 的驱动,如果芯片厂家接口已经封装好了,直接拿来主义即可。  如下所示:

Image

2.2 迷人的宏使用

代码框架看起来一点也不复杂,但是如果我们遇到了 flash、optionByte 默认受到保护的情况,那么就需要提前去干一些事情,IAR 提供了 Macro 这个功能,用于串联起 C-SPY 和目标硬件,我们以 Debug in Flash 流程为例:

Image

图片来源: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 的配置文件,路径如下:

Image

其中

  • .board 文件,XML 格式,是 Flash memory 系统的配置文件,告诉了 IAR 目标板 Flash 相关属性文件,它长这样:

Image

  • .flash 文件,同样是 XML 格式,告知 IAR flash loader 程序的路径、flash memory 基地址、flash memory page、block 大小等,一个 board 文件可以包含多个.flash 文件,这样一次可刷写多个 image;

Image

  • .mac 文件,包含辅助宏,也就是前面那种图里的各种函数,如下:

Image

那么.out 文件是干的呢?就是 flash loader 工程编译过后的产物。

有兴趣的朋友可以到   路径\arm\src\flashloader 中看看 NXP、Infineon、GD 等 flash loader 的源码。

最后,就是如何在调试界面使用 flash loader,点击 Project->Option->Debugger,选择目标.board 文件,即可加载 flash 相关信息;

Image

点击 Debugger->Setup,选择.mac 文件即可。

Image

3.dmac 和 mac 文件  

有一个容易搞混淆的就是,在安装目录下 Debugger 文件夹里有个 dmac 文件,它不需要我们手动在调试界面加载,自动会在在整个调试过程中它里面的宏也会被调用,我们常用来开关 MPU、操作看门狗等等,如下:

Image

实际上在运行 Flash loader 的时候,dmac 文件里的函数也会被调用,因此我们在设计 mac 文件里的函数时,也需要参考 dmac 里已实现的内容,我们可以打开对应硬件的调试 log 系统,来观察 mac 和 dmac 中的函数调用顺序。

Image

4.小结

到这里,基于 IAR 的 Flash Loader 设计思路就梳理完毕了,剩下的就是开始接收各种调试 bug,就酱!

END

作者:快乐的肌肉
来源:汽车MCU软件设计

推荐阅读:

更多汽车电子干货请关注汽车电子与软件专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。)
推荐阅读
关注数
5726
内容数
469
汽车电子与软件行业的相关技术报道及解读。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息