作者:夏青
随着嵌入式系统开发的复杂度不断提升,开发人员对集成开发环境( IDE )的需求也日益多样化。 Keil MDK 和 IAR EWARM 是市面上最常 见 的两款用于Arm Cortex-M MCU 开发的集成开发环境。目前Keil MDK 主要支持 Arm Cortex-M , 对于 Arm Cortex-A 和 Cortex-R 的开发,则需要借助 Arm Development Studio 的 支持。 而 IAR EWARM 作为一款功能强大的 IDE ,不仅 支持 Arm Cortex-M 系列 MCU ,还扩展了对 Cortex-A 和 Cortex-R 处理器的支持。
随着行业发展和竞争加剧,一方面越来越多的芯片公司已经不满足仅提供竞争异常激烈的 MCU 产品,所以他们开始打造高性能的应用处理器或者 MPU ,或者高实时性的满足功能安全要求的芯片,他们的客户同样也可能在进行着技术升级。所以,越来越多的工程师希望把不同的工程建在同一套 IDE 上,以实现资产的最优管理和实现复用开发。对于需要统一开发环境或涉及多核架构(如 Cortex-A/R )的项目, 越来越多的用户选择从Keil MDK 迁移 到IAR EWARM 。这就 会面临着需要将之前的Keil MDK 工程迁移到 IAR EWARM 的问题。本文 将 介绍如何 高效完成这一 迁移 ,帮助开发者快速适应新环境 。
准备工作
·IAR EWARM 集成开发环境
·对应Arm Cortex-M MCU 的 IAR EWARM 支持包:如果对应 MCU 已经在 IAR EWARM 的官方支持列表内,则对应 MCU 的支持包也会在 IAR EWARM 的安装包内;若未在,则需要联系对应 MCU 厂家提供 IAR EWARM 支持包(绝大多数厂家都会同时提供 Keil MDK 和 IAR EWARM 的支持包)
将Keil MDK 工程迁移到 IAR EWARM
下面介绍将Keil MDK 工程迁移到 IAR EWARM 的 具体步骤:
安装IAR EWARM :安装时参考对应的安装说明进行操作即可。
转换工程: 利用IAR Project Converter 工具将 Keil MDK 工程转换成 IAR EWARM 工程
打开IAR EWARM , Help > Migration > Keil μVision Migration Guide 打开对应的说明文档:
 
Tools > Project Converter 打开 IAR Project Converter ,对应的 Project type 选择 Keil μVision5 for Arm ,本文 以STM32F405 的 GPIO 示例工程为例,点击 Execute:

在弹出的对话框中选择目标工程路径,以GPIO 示例工程下面的 EWARM 为例,点击 OK :

对应Report 会提示转换的 IAR 工程信息,点击 OK :

在对话框中点击Close 完成工程转换:

编译调试 : 在IAR EWARM 中编译调试转换的工程
File > Open Workspace… 打开转换的工程:

选择前面转换好的工程,点击Open:

出现下面的提示对话框,点击Yes:

右击工程选择Options ( 或者Project > Options ) 打开工程选项配置:

在General Options > Target > Device 选择对应的 MCU 型号(以 STM32F405RG 为例):

在General Options > Target > 32-bit 选择对应的 FPU 配置(以 STM32F405RG 包含的 VFPv4 single precision 为例):

在General Options > Linker > Output > Out filename 中将 对应的输出文件名字改 为 $PROJ_FNAME$ ( $PROJ_FNAME$ 代表工程名):

此时如果编译(右击工程选择Make 或者 Project > Make ):

正常情况下汇编启动文件会报错 :

因为Keil MDK 和 IAR EWARM 的汇编启动代码格式不一样,需要将 Keil MDK 中 的汇编启动代码换成IAR EWARM 的汇编启动代码(绝大多数 MCU 厂家 会 同时提供Keil MDK 和 IAR EWARM 的汇编启动代码)。如果没有现成的 IAR EWARM 汇编启动代码,可以参考 IAR EWARM 中 相同Cortex-M MCU 的汇编启动代码,然后将 Keil MDK 汇编启动代码中对应的中断处理函数适配到 IAR EWARM 当中。
修改汇编启动代码之后,重新编译(右击工程选择Rebuild All 或者 Project > Rebuild All ):

正常 情况下 工程编译成功(Build 窗口显示 Total number of errors: 0, Build succeeded 说明编译成功):

编译成功之后就可以进行下载调试了,右击工程选择Options ( 或者Project > Options ) 打开工程选项配置,Debugger > Setup > Driver 选择对应的硬件仿真器(以 I-jet 为例):

点击Download and Debug 按钮或者 Project > Download and Debug 开始下载调试:
 
正常情况下应用程序会下载到目标系统,然后停在main 函数入口:

至此将Keil MDK 工程成功迁移到 IAR EWARM 并 进行 编译 、 下载调试。
注意事项
上 文 以一个简单的GPIO 示例工程介绍了如何将 Keil MDK 工程成功迁移到 IAR EWARM 并 进行 编译 、 下载调试。实际项目比GPIO 示例工程要复杂得多,迁移过程可能会遇到其他一些问题,下面列举了一些注意事项:
printf 函数重定向
Keil MDK 里面 printf 函数通过 fputc 函数进行重定向,而新版本的 IAR EWARM 里面 printf 函数通过 __write 函数进行重定向。
汇编代码
Keil MDK 和 IAR EWARM 的汇编代码格式不一样,虽然目前 Cortex-M MCU 的大部分代码是 C/C++ ,但是如果代码 中 使用了相关的汇编代码,在迁移过程中需要进行转换(前面提到的启动代码就是一个示例)。更多关于Keil MDK 和 IAR EWARM 的汇编代码格式,需要参考对应工具的汇编代码使用文档。
intrinsic 函数
intrinsic 函数是编译器提供的内部函数,通常来说不同编译器提供的 intrinsic 函数名字不一样。 Arm Cortex-M MCU 开发大部分会采用满足 CMSIS 标准的函数,如果使用了编译器的 intrinsic 函数,在迁移过程中需要适配(比如 Keil MDK 对应 NOP 指令的 intrinsic 函数是 __nop ,而 IAR EWARM 对应 NOP 指令的 intrinsic 函数是 __no_operation )。更多关于 intrinsic 函数的信息,需要参考对应编译器的使用文档。
#pragma 命令
#pragma 命令用于控制编译器的特定行为,通常来说不同的编译器支持的 #pragma 命令不同,如果代码里面使用了 #pragma 命令,在迁移过程中需要适配。更多关于 #pragma 命令的信息,需要参考对应编译器的使用文档。
链接脚本文件
Keil MDK 里面的链接脚本文件采用的是分散加载文件( scatter-loading file, .sct )。 IAR EWARM 的链接脚本文件采用的是链接器配置文件( ilinker configuration file, .icf )。绝大多数 MCU 厂家会同时提供 Keil MDK 和 IAR EWARM 的链接脚本文件。但是如果有一些定制化的需求,那么需要用户修改对应的链接脚本文件。更多关于链接脚本文件的信息,需要参考对应编译器的使用文档。
工程目录
目前Keil MDK 只支持一级目录,之前转换过来的 IAR 过程显示如下:

IAR EWARM 支持多级目录,可以将上面的一级目录工程转换成下面多级目录工程:

总结
本文详细介绍了如何将Keil MDK 工程迁移到 IAR EWARM , 帮助用户快速 实现 迁移,借助IAR Project Converter 工具可以很方便地将 Keil MDK 工程转换成 IAR EWARM 工程,同时列举了在迁移过程中的一些注意事项。 尽管过程中可能需手动调整部分配置,但 IAR 的多核支持与灵活性能为后续开发带来显著便利。若遇到问题,建议参考官方文档或社区论坛获取进一步支持。
|