如何在 IAR Embedded Workbench 中合并两个版本的代码

Posted

技术标签:

【中文标题】如何在 IAR Embedded Workbench 中合并两个版本的代码【英文标题】:How can I compile two version of my code in IAR Embbedded Workbench 【发布时间】:2018-03-07 16:50:50 【问题描述】:

我有两个版本的代码,我需要切换它们,因为工作需要编译每个版本,同时在 IAR 项目中保留两个版本。我发现类似“编译开关”的东西,但我不知道它是怎么做的。有人告诉我可以搜索的关键字或建议吗?

【问题讨论】:

项目中可以有多个配置workspace中可以有多个项目。 为什么不能使用版本控制系统来做到这一点? SVN有这样的特性,还是建议选择哪个版本编译?我实际上需要类似预处理器命令的东西。 另外,我的意思是代码版本具有不同的功能,而不是每个版本的修订版。 【参考方案1】:

您可以使用 C 预处理器 #define 功能在代码版本之间切换,并使用 IAR EWARM 项目的 Defined Symbols 功能 来启用特定头文件中的 #define 列表(例如:defines.h ) 将包含在所有 C 文件中。

defines.h

#if defined(PROD_VERSION)

    #define SOFTWARE_VERSION_PRODUCT ("1.0-release")
    //...whetever specific #defines meant for the release version, for example...
    //#define ENABLE_RF_STUB
    #define USE_SERIAL_CTS_RTS

#elif defined(TEST_VERSION)

    #define SOFTWARE_VERSION_PRODUCT ("1.0-test")
    //...whetever specific #defines meant for the test version, for example...
    #define ENABLE_RF_STUB
    #define USE_SERIAL_CTS_RTS

#elif defined(DEBUG_VERSION)

    #define SOFTWARE_VERSION_PRODUCT ("1.0-debug")
    //...whetever specific #defines meant for the debug version, for example...
    #define ENABLE_RF_STUB
    //#define USE_SERIAL_CTS_RTS

#endif

rf.c

#include "defines.h"

void rfInit(void)

#ifndef ENABLE_RF_STUB
    //init RF here
#endif

serial.c

#include "defines.h"

CPU_BOOLEAN isCtsRts()

#ifdef USE_SERIAL_CTS_RTS
    return HAL_SERIAL.isCtsRts();
#else
    return DEF_TRUE; //bypass CtsRts check
#endif

您的项目选项 > C/C++ 编译器 > 预处理器 > 定义符号:如果您想要发布版本,请添加 PROD_VERSION,或者添加 TEST_VERSION 如果你想要测试版本,或者添加 DEBUG_VERSION 如果你想要调试版本。

以上三种配置只能选择一种,因为IAR通过工程编译只会编译一个版本。除非您可以创建批处理构建脚本以允许在使用三种不同项目设置创建的不同输出文件下构建所有三个版本。

【讨论】:

【参考方案2】:

IAR 在工具栏中有一个配置 Project > Edit_Configuration 它使您可以通过设置这些工具设置版本“开关”,并且可以为每个设置设置预处理器命令。

【讨论】:

以上是关于如何在 IAR Embedded Workbench 中合并两个版本的代码的主要内容,如果未能解决你的问题,请参考以下文章

IAR Embedded Workbench:为什么我会收到链接器错误[Li005]?

IAR Embedded Workbench for ARM 8.22.1 基础使用教程

在IAR(EWARM)中移植STM32固件库

有人为 MSP430 的 IAR Embedded Workbench 实现了 __getzone() 吗?

性能测评DSP库,MDK5的AC5,AC6,IAR和Embedded Studio的三角函数性能

BSP视频教程STM32H7视频教程第1期:初识STM32H7准备工作,了解Cortex-M7内核及MDK,IAR,Embedded Studio,STM32CubeIDE和VS Code简单比较