将项目从 IAR Embedded Workbench 迁移至 Embedded
来源: | 作者:风标电子工程师 | 发布时间: 2025-02-27 | 9 次浏览 | 🔊 点击朗读正文 ❚❚ | 分享到:

本文深入阐述如何运用 SEGGER Embedded Studio 内置的项目导入器,将 IAR EWARM 项目导入其中。借助该项目导入器,你拥有两种选择:一是在 Embedded Studio 环境中继续沿用 IAR 工具链;二是采用 Embedded Studio 内部集成的 SEGGER 工具链。当你成功将项目迁移至 Embedded Studio 后,能够直接受益于诸多强大功能,例如多线程编译功能,大幅提升编译效率;快速且便捷的项目搜索功能,能让你在繁杂的项目文件中迅速定位所需;精准的索引功能,为开发工作提供更多便利。


值得一提的是,即便你最终决定继续在 Embedded Studio 中使用 IAR 工具链,依然有许多实用功能可供使用。

一、设置

以下导入教程将基于特定的硬件和软件组合展开:

    · SEGGER Embedded Studio 5.32a 64 位版本(项目导入器在 3.10 或更高版本均可正常工作)

    · IAR EWARM 8.50

    · 目标评估板:SEGGER emPower

为方便你进行实践操作,以下文件提供了示例项目:IAR_to_ES_Tutorial.zip

https://kb.segger.com/images/6/6a/IAR_to_ES_Tutorial.zip


二、导入教程

1.打开 Embedded Studio,依次点击 “File -> Import IAR EWARM / Keil MDK Project...”,随后在文件目录中导航至你希望导入的项目文件,并将其选中。

2. 此时,你将面临几种选择:

· 外部工具链:导入项目并将其配置为使用原始的 IAR 工具链进行构建,确保项目在熟悉的工具链环境下运行。

· 内部工具链:导入项目后,为 Embedded Studio 的 SEGGER 工具链进行相关配置,充分发挥 Embedded Studio 的优势。

· 内部和外部工具链:此选项会创建两组构建配置,一组用于使用原始 IAR 工具链构建项目,另一组则用于使用 Embedded Studio 的 SEGGER 工具链构建项目,为你提供最大的灵活性。

· “IAR 安装目录”:如果你在系统中安装了多个不同版本的 IAR EWARM,在这里可以选择使用不同的外部 IAR 编译器,满足多样化的开发需求。

3. 为了更顺利地迁移到 Embedded Studio,强烈建议你选择创建内部和外部工具链的构建配置。这样在后续的开发过程中,你可以根据实际需求,轻松在两种工具链之间进行切换,提升开发效率。

4. 如果整个导入过程顺利无误,将会弹出一个状态窗口,提示成功导入。

5. Embedded Studio 会自动为调试和发布版本创建构建配置,这些配置分别对应内部和外部编译器,且与现有 IAR 项目中已有的配置相匹配。

6. 若要在不同的构建配置之间进行切换,只需使用 “项目资源管理器” 中的下拉菜单即可轻松实现。

7. 若要使用 IAR 编译器调试示例项目,在下拉菜单中选择 “Debug_External”,然后按下 F7 键即可开始构建项目。

8. 对于大多数项目而言,按照上述步骤操作通常能够直接成功运行。然而,如果出现无法直接构建的情况,请参考后续的 “故障排除” 部分,我们将在那里为你提供详细的解决方案。

注意:虽然仅运行调用外部工具链的外部配置是可行的,但我们还是建议你切换到内部 SEGGER 工具链。因为在调试使用外部工具链创建的代码时,某些调试功能可能无法完全发挥作用,而内部 SEGGER 工具链能够提供更全面的功能支持。


三、如何切换到 Embedded Studio 内部编译器

1. 为了充分挖掘 Embedded Studio 的强大潜力,使用基于 Clang 的内部 SEGGER 编译器是必不可少的。

2. 在提供的示例项目中,切换编译器的操作非常简单,只需打开下拉菜单并选择 “Debug_Internal”。

3. 完成上述选择后,当你按下 F7 键时,项目将默认使用内部 SEGGER 编译器进行构建。此外,你还可以在项目选项中启用其他内部编译器,如 gcc/clang,以满足不同的编译需求。

4. 使用内部编译器成功构建项目后,Embedded Studio 会自动对目标设备上的闪存和 RAM 占用情况进行精确计算,并在输出窗口中以直观的方式呈现这些信息,帮助你更好地了解项目的资源使用情况。

注意:此计算并显示闪存和 RAM 占用情况的功能仅在使用内部编译器时才可用。

5. 对于大多数项目来说,切换到内部编译器的过程较为顺利,能够直接运行。但如果遇到无法直接构建的情况,请参考 “故障排除” 部分,我们将帮助你解决问题。

如果你计划使用内部 SEGGER 工具链,我们推荐一种更高效的方法:跳过导入工具,直接使用项目向导创建一个新项目。若有可用的 CPU 支持包,也一并使用。通过这种方式,所有与 Embedded Studio 和目标设备相关的项目设置都将自动配置就绪。此时,你仅需将 IAR 项目中的源文件添加到 Embedded Studio 文件夹中,然后修正 IAR 特定的编译错误,并根据 “故障排除” 部分的说明,最终完成链接脚本和内存映射的设置。通常情况下,这种方法能够节省大量时间,提高项目迁移的效率。


四、故障排除

    一般来说,导入的项目使用外部工具链重新构建时,通常能够直接运行,无需过多调整。然而,对于基于内部 SEGGER 工具链的项目构建配置,可能需要进行一些手动更改。

    在某些情况下,如果源文件是按照与 Clang 兼容的标准创建的,那么你可以在原始工具链和 SEGGER 工具链之间实现无缝切换,无需进行额外的调整。如果原始项目是从软件包或 SDK 创建的,它可能已经包含了与 SEGGER 工具链兼容的源文件,这些文件可以直接替换之前与其他工具链兼容的文件,从而简化项目迁移过程。

    以下详细列出了将项目迁移到 Embedded Studio 时,最常见的需要更改的要点:


1.内部配置

(1)内存链接脚本

    Embedded Studio 项目导入器不会自动导入链接脚本,例如 IAR 的 icf 文件。它仅会为所选目标设备设置基本的内存映射,即将代码放置到内部闪存中,将数据放置到内部 RAM 中。

    对于更为复杂或特殊的配置需求,你需要相应地设置内存映射文件和段放置文件。在 Embedded Studio 中,有以下两种放置内存段的方法可供选择:

· 通过项目选项中的 “Linker -> Memory Segments” 直接进行段的放置操作,这种方式简单直接,适用于一些较为常规的配置。

· 创建一个内存映射.xml 文件,或者对 Embedded Studio 提供的默认文件进行编辑,然后在项目选项中的 “Linker -> Memory Map File” 中进行设置。这种方式更为灵活,能够满足各种复杂的配置需求。    

    例如,一个表示具有两个名为 FLASH 和 RAM 的内存段的设备的内存映射文件,在内存映射编辑器中的示例如下:

<root <="" font="">name="Device1">

  <memorysegment <="" font="">name="FLASH1" start="0x10000000" size="0x10000" />

  <memorysegment <="" font="">name="RAM1"  start="0x20000000" size="0x1000"/>

相应的链接文件会引用内存映射文件中的内存段,并详细列出要放置在这些段中的节。关于 SEGGER 链接器的详细文档可点击此处查看。

若要添加新的段或节,只需对 Embedded Studio 链接的默认文件进行编辑即可。该链接文件可以在项目选项中的 “Linker -> Linker Script File” 中找到,方便你进行个性化的配置。

(2)第三方软件库

第三方软件,尤其是各类库,可能是针对某一特定工具链进行配置的,因此在其他工具链中可能无法直接编译。

在这种情况下,你需要首先检查是否存在适用于 Embedded Studio/SEGGER 工具链的软件移植版本。如果有,直接使用移植版本即可。若没有,则需要对软件进行重新配置,并为 Embedded Studio/SEGGER 工具链重新构建。

需要特别注意的是,尽管为其他工具链构建的库可能可以与 Embedded Studio 进行链接,但在实际使用中,一定要仔细检查与库的接口是否能够按照预期正常工作,避免出现潜在的问题。

(3)汇编代码

不同工具链的汇编代码语法以及汇编文件中的控制命令存在差异。虽然最终生成的汇编指令可能是相同的,但在编写汇编代码时,不同工具链的要求却大不相同。例如,IAR 和 GCC/Clang 对数值常量的声明方式就有所不同。

此外,用于辅助编写汇编代码的控制命令也存在区别。符号、标签、函数定义等的语法需要根据 GNU 汇编器的要求进行调整,以确保代码能够在新的工具链中正常运行。

以下展示了一些常见的汇编指令及其在不同工具链中的对应替代指令:

如需获取完整的指令列表,请参考相应的汇编器参考手册,以便在项目迁移过程中准确地进行指令转换。

(4)预处理器定义

不同的工具链使用各自独特的内置定义,用于识别所使用的编译器,并根据内核、设备、字节序以及其他各种设置进行条件编译。

在项目迁移过程中,必须准确选择正确的定义。同时,为了确保代码的稳定性和可靠性,建议在代码中设置相关机制,当所需定义未被定义时,能够抛出警告或错误提示,以便及时发现和解决问题。

例如,IAR 定义了__ICCARM__和__IAR_SYSTEMS_ICC__用于识别自身工具链,而 Embedded Studio 则定义了__SES_ARM 和__SEGGER_CC__。

对于目标设备,当为 Cortex - M4 编译时,IAR 定义了__ARM7M__和__CORE__=ARM7M,而 Embedded Studio 则使用__ARM_ARCH_7M__来代替,这些细节在迁移过程中需要特别留意。

(5)工具链内建函数

一些特定于编译器的函数,如__disable_interrupt () 或__no_operation (),在 Embedded Studio 中可能并不存在。针对这种情况,你需要编写相应的替代函数,以满足项目的功能需求。如果可能的话,也可以在代码中避免使用这些在新工具链中不可用的函数。

例如,对于 SEGGER 编译器,__no_operation () 的替代函数可以定义如下:

#define NO_OPERATION() __asm volatile ("nop")

为了实现与 IAR 的向后兼容性,可以将这样的重新定义嵌套在预处理器定义中。对于 IAR EWARM,使用__ICCARM__;对于 Embedded Studio,使用__SEGGER_CC__,从而确保代码在不同工具链下都能正确运行。

(6)项目设置

在大多数情况下,项目导入器会自动为外部和内部构建配置设置好大部分项目设置。然而,在一些较为复杂的项目中,某些项目设置可能需要手动添加。

例如,默认情况下,内部构建配置不会排除任何文件。这就意味着,如果存在与编译器不兼容的文件,编译器在编译过程中会尝试对其进行编译,从而导致错误的出现,比如遇到与 GCC/Clang 不兼容的汇编文件。

若要解决此类问题,你可以在项目资源管理器中右键单击项目,然后选择 “编辑选项”。关于各个设置的详细信息,可以在 Embedded Studio 用户手册中找到,以便你进行更深入的了解和配置。

(7)用户包含目录

许多复杂项目的源文件通常分布在多个不同路径的文件夹中。在项目迁移过程中,务必确保在构建配置的 “Preprocessor -> User Include Directories” 中包含了所有需要的文件夹,以保证编译器能够正确找到并处理这些源文件,避免因文件路径问题导致的编译错误。

(8)构建前 / 后命令

Embedded Studio 提供了类似于 IAR EWARM 中的构建前 / 后命令功能。然而,由于 IAR 和 Embedded Studio 之间的语法存在差异,项目导入器不会自动导入这些命令。

如果你在 IAR 中使用了构建前 / 后命令,那么在迁移到 Embedded Studio 后,需要在内部和外部构建配置中相应地模拟这些命令。为了实现这一目的,你可以使用批处理脚本,以便一次执行多个命令。

例如,若要启用链接后批处理脚本,你需要进入预期构建配置的项目选项,找到 “用户构建步骤”,然后编辑 “链接后命令” 条目。在该条目中,输入 bat 文件的相对或绝对路径以及可选参数,格式如下:路径 / 示例.bat 参数 1 参数 2...,从而确保构建前 / 后命令在新的环境中能够正常执行。


2.外部配置

由于 Embedded Studio 是通过命令行来调用 IAR 工具链的,因此要使外部构建能够正常工作,关键在于确保调用方式与 IAR EWARM 中的调用方式一致。项目导入工具会尝试从 IAR 项目设置中尽可能多地检测项目设置,但由于 IAR IDE 可能会随着每次更新而发生变化,某些选项可能无法被正确检测到。

为了解决这一问题,最简单的方法是从 IAR 中导出构建命令行,并将其与 Embedded Studio 中的设置进行匹配,具体操作步骤如下:

1. 在 IAR EWARM 中打开你的项目。

2. 在 “构建” 窗口中右键单击,选择 “过滤级别:全部”,以便获取完整的构建信息。

3. 重新构建项目,将构建过程中的所有信息记录下来。

4. 将构建日志复制到文本编辑器中,方便后续查看和对比。

5. 关闭 IAR EWARM,打开 Embedded Studio。

6. 在 Embedded Studio 的项目资源管理器中右键单击项目,选择 “导出构建”,获取当前项目的构建设置。

7. 仔细对比 IAR EWARM 和 Embedded Studio 的构建命令行。如果发现 Embedded Studio 端缺少某些选项,按照以下说明通过 Embedded Studio 项目选项进行修正。

(1)修正构建配置

要修正 IAR 构建命令行和 Embedded Studio 构建命令行之间的差异,你需要在 Embedded Studio 中打开项目选项。在大多数情况下,需要纠正的命令行调用主要涉及编译器(iccarm)、汇编器(iasmarm)和链接器(ilinkarm)。

你可以通过两种方式进行修正:一是手动设置相应的项目选项,这些选项会自动构建出正确的命令行;二是直接进入项目选项中的 “外部构建选项”,在其中直接编辑命令行。

完成上述步骤后,如果你成功地匹配了 IAR EWARM 和 Embedded Studio 的构建命令,那么你的应用程序应该能够像在原生 IAR 设置中一样,顺利进行构建,不会出现错误。