编程, 调试

使用IAR工具链进行CMake构建

  • IAR
  • 11分钟阅读
<span id="hs_cos_wrapper_name" class="hs_cos_wrapper hs_cos_wrapper_meta_field hs_cos_wrapper_type_text" style="" data-hs-cos-general-type="meta_field" data-hs-cos-type="text" >使用IAR工具链进行CMake构建</span>

CMake是一款强大的开源跨平台软件构建系统,支持多种目标构建系统,广泛应用于嵌入式软件开发。

本文主要介绍如何使用IAR工具链进行CMake构建。

准备工作

  • 下载,安装和激活IAR工具链
  • 下载,安装CMake

使用IAR工具链进行CMake构建

使用IAR工具链进行CMake构建主要需要配置两个文件

  • CMakeLists.txt 文件
  • CMake工具链文件:包含对应工具链的信息,通常为.cmake文件

下面是IAR EWARM v9.70.4对应的CMake工具链文件 (对应ninja.exe位于安装目录common/bin下面):

set(CMAKE_ASM_COMPILER "C:/iar/ewarm-9.70.4/arm/bin/iasmarm.exe")
set(CMAKE_C_COMPILER "C:/iar/ewarm-9.70.4/arm/bin/iccarm.exe")
set(CMAKE_CXX_COMPILER "C:/iar/ewarm-9.70.4/arm/bin/iccarm.exe")

if(CMAKE_GENERATOR MATCHES "^Ninja.*$")
find_program(CMAKE_MAKE_PROGRAM
  NAMES ninja.exe
  PATHS $ENV{PATH}
      "C:/iar/ewarm-9.70.4/common/bin"
  REQUIRED)
endif()

下面主要介绍IAR工具链的CMakeLists.txt文件 (注意:CMakeLists.txt 文件本身功能非常强大,这里只介绍跟IAR工具链相关的部分)。

设置使能IAR编译器语言扩展(对应编译器选项-e):

set(CMAKE_C_EXTENSIONS ON) 
set(CMAKE_CXX_EXTENSIONS ON)

设置IAR编译器和汇编器选项

target_compile_options(BareMetal PRIVATE
$<$<COMPILE_LANGUAGE:C>:
--cpu=Cortex-M4
--fpu=VFPv4_sp
--dlib_config=normal
--require_prototypes
-Ol
>
$<$<COMPILE_LANGUAGE:ASM>:
--cpu Cortex-M4
--fpu VFPv4_sp
-s+
-M[]
-w+
>)

设置IAR链接器选项 (注意:如果有重复的参数,需要使用SHELL:)

target_link_options(BareMetal PRIVATE
--map .
--config ../stm32f405xG.icf
--semihosting
--entry Reset_Handler
--place_holder __checksum,4,.checksum,4
#CMake requires the SHELL: prefix for repeated parameters
SHELL:--define_symbol=__checksum_begin=0x8000000
SHELL:--define_symbol=__checksum_end=0x800FFFB
--redirect __iar_sh_stdout=__iar_sh_stdout_swo
--vfe
--text_out locale
--cpu=Cortex-M4
--fpu=VFPv4_sp)

使用ielftool生成checksum:

add_custom_command(TARGET BareMetal
POST_BUILD
COMMAND ${CMAKE_IAR_ELFTOOL}
--verbose
--fill="0xFF\;0x8000000-0x800FFFB"
--checksum="__checksum:4,crc32:Li,0xFFFFFFFF\;0x8000000-0x800FFFB"
$<TARGET_FILE:BareMetal>
$<TARGET_FILE:BareMetal>)

使用ielftool生成hex文件:

add_custom_command(TARGET BareMetal
POST_BUILD
COMMAND ${CMAKE_IAR_ELFTOOL}
--ihex
--verbose
$<TARGET_FILE:BareMetal>
$<TARGET_FILE_DIR:BareMetal>/BareMetal.hex)

使用ielftool生成bin文件:

add_custom_command(TARGET BareMetal
POST_BUILD
COMMAND ${CMAKE_IAR_ELFTOOL}
--bin
--verbose
$<TARGET_FILE:BareMetal>
$<TARGET_FILE_DIR:BareMetal>/BareMetal.bin)

在命令行中输入cmake -G "Ninja Multi-Config" -B build --toolchain ewarm.cmake命令生成对应的Ninja构建

china-learn-CMake-with-IAR-toolchain-1

在命令行中输入cmake --build build --config Debug命令进行Debug构建:

china-learn-CMake-with-IAR-toolchain-2

在EWARM中新建工程调试对应CMake构建的elf文件,选择工程类型为Externally built executable:

china-learn-CMake-with-IAR-toolchain-3

按照readme_external_binary.txt里面的步骤配置对应的调试工程:

  • 添加对应的elf文件
  • 配置对应的芯片(Options > General Options > Target > Device)
  • 配置对应的调试器选项(Options > Debugger > Setup > Driver)

然后就可以进行下载调试了:

china-learn-CMake-with-IAR-toolchain-4

另外IAR EWARM v9.60.2开始支持导入CMakeLists.txt 文件,基于CMake进行构建。

在EWARM中新建CMake工程,选择工程类型为Import CMakeLists.txt:

china-learn-CMake-with-IAR-toolchain-5

选择对应的CMakeLists.txt文件之后,CMake/CMSIS-Toobox窗口会输出生成的CMake构建信息:

china-learn-CMake-with-IAR-toolchain-6

右击工程,选择Make进行构建,对应Build窗口会输出对应CMake构建信息:

china-learn-CMake-with-IAR-toolchain-7

配置调试选项:

  • 配置对应的芯片(Options > General Options > Target > Device)

  • 配置对应的调试器选项(Options > Debugger > Setup > Driver)

然后就可以进行下载调试了:

china-learn-CMake-with-IAR-toolchain-8

注意事项

IAR IDE中构建linker会按照模块名字的字母顺序进行链接,而CMake中构建linker会按照target_sources()中指定的模块顺序进行链接,如果想让IAR IDE工程和CMake工程的输出一致,需要配置CMake的target_sources()按照模块名字的字母顺序进行排列,这样IAR IDE工程和CMake工程链接的时候都会按照模块名字的字母顺序进行链接,从而保证输出一致。

总结

本文主要以IAR EWARM v9.70.4为例介绍如何使用IAR工具链进行CMake构建,对应方法同样适用于IAR Build Tools,更多信息可以参考https://github.com/iarsystems/cmake-tutorial 或者联系IAR中国。

 

参考文献:

  1. https://cmake.org/
  2. https://github.com/iarsystems/cmake-tutorial