S32K3 工具篇10:如何使用IAR编译器或者IAR工程编译MCAL工程
如何使用IAR编译器或者IAR IDE工程来结合EB tresos MCAL编译NXP S32K MCAL。
S32K3 工具篇10:如何使用IAR编译器或者IAR工程编译MCAL工程
一,文档简介
大家好,我是火山,距离上一篇又过去了很久,俗话说的好,时间就像海绵里的水,挤挤就有了。但是成年人工作的世界里,发现海绵已经快烘干了,怎么挤都挤不出可供兴趣发挥的时间,甚至连想出点文艺范小清新都显的苍白,只有舍弃假期来滋养兴趣,废话不多说,直接上文章。
通过平时的观察,发现还是有不少的客户在使用MCAL+IAR 这样的平台,有用IAR编译器的,也有直接用IAR IDE的。其实在以前做工业MCU的时候,本人也特别喜欢IAR IDE,编译速度快,编译效率高,生成代码还小等等,但是到了auto MCU,发现普及度不是很高,而且也发现有些客户在导入MCAL到IAR中的时候遇到各种各样的问题,所以在此直接出一篇工具篇来讲如何使用IAR编译器或者IAR IDE工程来结合EB tresos MCAL编译NXP S32K MCAL。
本文使用S32K344结合RTD600来讲IAR编译器编译MCAL 工程,以及直接将MCAL导入到IAR IDE 工程中去。
二, IAR 编译器编译S32K3 RTD MCAL 工程
2.1 S32K3 软硬件
SW32K3_S32M27x_RTD_R21-11_6.0.0
S32K3X4-EVB
基于Dio_TS_T40D34M60I0R0
IAR:IAR EW for Arm 9.70.1
EB tresos29.0.0
2.2 使用IAR 编译器编译MCAL工程步骤
2.2.1 拷贝一个RTD MCAL新工程
打开路径:
C:\NXP\SW32K3_S32M27x_RTD_R21-11_6.0.0\eclipse\plugins
拷贝Dio_TS_T40D34M60I0R0 ,重新命名为Dio_TS_T40D34M60I0R0_IAR
2.2.2 编译EB tresos 工程
使用EB tresos工具打开如下路径中的EB tresos工程:
C:\NXP\SW32K3_S32M27x_RTD_R21-11_6.0.0\eclipse\plugins\Dio_TS_T40D34M60I0R0_IAR\examples\EBT\S32K3XX\Dio_Example_S32K344\TresosProject
生成代码:
2.2.3 VScode打开Dio_TS_T40D34M60I0R0_IAR工程
使用VS code打开如下路径的文件夹:
C:\NXP\SW32K3_S32M27x_RTD_R21-11_6.0.0\eclipse\plugins\Dio_TS_T40D34M60I0R0_IAR\examples\EBT\S32K3XX\Dio_Example_S32K344
当然,也可以直接使用命令行打开这个文件夹路径,只要保证和.mk以及makefile的脚本在一层路径即可。
2.2.4 Project_parameters.mk 脚本修改
主要修改如下几个点:
TOOLCHAIN = iar
IAR_DIR = C:/IAR/ewarm-9.70.1
TRESOS_DIR = C:/EB/tresos_29_0_0
PLUGINS_DIR = C:/NXP/SW32K3_S32M27x_RTD_R21-11_6.0.0/eclipse/plugins
IAR的路径一定要和自己使用的IAR软件版本一致,保证能找到对应的IAR编译器。
2.2.5 Check_build_params.mk脚本修改
在check_build_params.mk脚本中添加IAR对应的内容:
else ifeq ($(TOOLCHAIN),iar)
ifeq ("$(wildcard $(IAR_DIR)/arm/bin/iccarm.exe)","")
$(error Invalid path set to the IAR compiler. \
The provided path: from project_parameters.mk IAR_DIR=$(IAR_DIR) is invalid!)
Endif

2.2.6 makefile脚本修改
Makefile脚本需要修改的一共有5大点:
(1)Compilier change
ifeq (${TOOLCHAIN},iar)
CC := $(IAR_DIR)/arm/bin/iccarm.exe
LD := $(IAR_DIR)/arm/bin/ilinkarm.exe
AS := $(IAR_DIR)/arm/bin/iasmarm.exe
# Intel Hexadecimal Flash image tool
GENHEX := $(IAR_DIR)/arm/bin/ielftool.exe
HEX_OPTS := --ihex
OUT_OPTS := -o
endif

(2) SRC_DIRS 添加TOOLCHAIN
SRC_DIRS += $(foreach mod,$(MCAL_MODULE_LIST),$(PLUGINS_DIR)/$(mod)_$(AR_PKG_NAME)/src) \
$(foreach mod,$(MCAL_MODULE_LIST_ADDON),$(PLUGINS_DIR_ADDON)/$(mod)_$(AR_PKG_NAME_ADDON)/src) \
$(PLUGINS_DIR)/Platform_$(AR_PKG_NAME)/startup/src \
$(PLUGINS_DIR)/Platform_$(AR_PKG_NAME)/startup/src/m7 \
$(PLUGINS_DIR)/Platform_$(AR_PKG_NAME)/startup/src/m7/$(TOOLCHAIN)

(3) Linker file 修改
ifeq ($(LOAD_TO),flash)
ifeq (${TOOLCHAIN},iar)
LINKER_DEF:= $(PLUGINS_DIR)/Platform_$(AR_PKG_NAME)/build_files/${TOOLCHAIN}/linker_flash_$(DERIVATIVE_LOWER).icf
else
LINKER_DEF:= $(PLUGINS_DIR)/Platform_$(AR_PKG_NAME)/build_files/$(TOOLCHAIN)/linker_flash_$(DERIVATIVE_LOWER).ld
endif
else
ifeq (${TOOLCHAIN},iar)
LINKER_DEF:= $(PLUGINS_DIR)/Platform_$(AR_PKG_NAME)/build_files/$(TOOLCHAIN)/linker_ram_$(DERIVATIVE_LOWER).icf
else
LINKER_DEF:= $(PLUGINS_DIR)/Platform_$(AR_PKG_NAME)/build_files/$(TOOLCHAIN)/linker_ram_$(DERIVATIVE_LOWER).ld
endif
endif

(4) Complier options change
ifeq (${TOOLCHAIN},iar)
################################################################################
# iar Compiler options
################################################################################
clib := $(IAR_DIR)/arm/lib
CCOPT += --cpu=Cortex-M7 \
-DAUTOSAR_OS_NOT_USED \
-DUSE_MCAL_DRIVERS \
--fpu=FPv5-SP \
--cpu_mode=thumb \
--endian=little \
-e \
-Ohz \
--debug \
--no_clustering \
--no_mem_idioms \
--do_explicit_zero_opt_in_named_sections \
--require_prototypes \
--no_wrap_diagnostics \
--diag_suppress=Pa050 \
$(MISRA) \
-D$(PLATFORM) \
-D$(DERIVATIVE) \
-DIAR \
-DUSE_SW_VECTOR_MODE \
-DENABLE_FPU \
-DD_CACHE_ENABLE \
-DI_CACHE_ENABLE
LDOPT := --entry _start \
--enable_stack_usage \
--skip_dynamic_initialization \
--no_wrap_diagnostics \
--cpu=Cortex-M7 \
--fpu=FPv5-SP
ASOPT := $(ASOPT) \
--cpu Cortex-M7 \
--cpu_mode thumb \
-g \
-r \
-DMULTIPLE_CORE
endif


那么这些IAR的编译选项是怎么来的呢?可以通过参考RTD600的release note,里面有对应的描述:
(5) Elf related change
ifeq (${TOOLCHAIN},iar)
%.elf: %.o $(LINKER_DEF)
@echo "Linking $@"
@$(LD) $(ODIR)/*.o $(LDOPT) --config $(LINKER_DEF) --map $(ODIR)/ -o $(ODIR)/$@
@$(GENHEX) $(HEX_OPTS) "$(ODIR)/$(ELFNAME).elf" "$(ODIR)/$(ELFNAME).hex"
else
%.elf: %.o $(LINKER_DEF)
@echo "Linking $@"
@$(LD) -Wl,-Map,"$(MAPFILE)" $(LDOPT) -T $(LINKER_DEF) $(ODIR)/*.o -o $(ODIR)/$@
@$(GENHEX) $(HEX_OPTS) "$(ODIR)/$(ELFNAME).elf" $(OUT_OPTS) "$(ODIR)/$(ELFNAME).hex"
endif

2.2.7 编译生成elf下载测试
通过命令:
make clean
make build
生成elf文件:
生成之后的elf,可以烧录到S32K344 EVB板子上测试,测试结果可以看到板载红灯闪烁,说明IAR编译器命令行方式可以工作。
三,导入RTD MCAL 到IAR IDE工程
本章讲解,如果新建一个IAR IDE工程,然后导入MCAL的驱动实现S32K3 MCAL 结合EB tresos的方式的运行。
3.1 MCAL IAR IDE工程的两种方式
两种方式和怎么导入MCAL的驱动区分:
(1) 直接拷贝RTD MCAL驱动到IAR IDE工程目录下
(2) 连接IAR IDE工程驱动到原始RTD的驱动路径下
3.2 MCAL IAR IDE工程的导入步骤
3.2.1 新建 RTD MCAL IAR IDE 工程文件夹
新建一个文件夹,命名为:S32K344_DIO_MCAL_RTD600_IAR
3.2.2 给工程文件夹新建对应子文件夹
Generate:EB tresos project code
Include:app related include file
Mcal: mcal driver copy from RTD
src: project main file
Tresos_Project:EB tresos project

3.2.3 新建EB tresos 工程
(1)在如下路径新建一个EB tresos 工程: S32K344_DIO_MCAL_RTD600_IAR\Tresos_Project\Mcal_Dio_S32K344_RTD600_IAR
(2)添加modules: BaseNXP, Dem, Dio, EcuC, Mcu, Platform, Port, Resource
(3)拷贝RTD如下路径的xdm:
C:\NXP\SW32K3_S32M27x_RTD_R21-11_6.0.0\eclipse\plugins\Dio_TS_T40D34M60I0R0\examples\EBT\S32K3XX\Dio_Example_S32K344\TresosProject\Dio_Example_S32K344\config
到: S32K344_DIO_MCAL_RTD600_IAR\Tresos_Project\Mcal_Dio_S32K344_RTD600_IAR\config
(4)EB tresos Generate project
EB tresos的代码将会生成到:
S32K344_DIO_MCAL_RTD600_IAR\Generate
3.2.4 拷贝RTD相关驱动到IAR工程文件夹
(1) BaseNXP: header, include, src
(2)Det: include, src
(3)Dio: include, src
(4)Mcu: include, src
(5)Platform: build_files, include, src, startup
(6)Port: include, src
(7)Rte: include, src
拷贝RTD文件夹到IAR工程是方法之一,如果不拷贝,也可以后续直接在IAR的工程中链接驱动文件到原始RTD驱动文件夹。
3.2.5 IAR IDE新建IAR工程
(1) Project->Create new project
(2) 在工程中,添加group
工程文件加结构如图18,包含:
Generate: Include and src->EB tresos project generate code
Mcal: Base, Det, Dio, Mcu, Platform, Port, Rte->Mcal driver
Src: Main.c->project main code
(3) 添加 RTD mcal 相关驱动文件到IAR 工程中
RTD mcal相关驱动文件可以直接从RTD安装路径,或者从已经拷贝到IAR工程的文件夹中来,两种方法是一样的结果。
(4)IAR工程的platform文件夹添加结果如下:
(5)main代码添加
Main.c从路径:
C:\NXP\SW32K3_S32M27x_RTD_R21-11_6.0.0\eclipse\plugins\Dio_TS_T40D34M60I0R0\examples\EBT\S32K3XX\Dio_Example_S32K344\src
拷贝到:
S32K344_DIO_MCAL_RTD600_IAR\src
屏蔽代码:
//#include "check_example.h"
// Exit_Example(TRUE);
3.2.6 IAR 工程options配置
(1) General options->Target->Device->NXP S32K344
(2) C/C++ Complier->Preprocessor
Addional include directories:
使用IAR工程路径下拷贝过来的RTD驱动路径配置:
$PROJ_DIR$\Generate\include
$PROJ_DIR$\mcal\BaseNXP_TS_T40D34M60I0R0\header
$PROJ_DIR$\mcal\BaseNXP_TS_T40D34M60I0R0\include
$PROJ_DIR$\mcal\Mcu_TS_T40D34M60I0R0\include
$PROJ_DIR$\mcal\Platform_TS_T40D34M60I0R0\include
$PROJ_DIR$\mcal\Rte_TS_T40D34M60I0R0\include
$PROJ_DIR$\mcal\Platform_TS_T40D34M60I0R0\startup\include
$PROJ_DIR$\mcal\Det_TS_T40D34M60I0R0\include
$PROJ_DIR$\mcal\Dio_TS_T40D34M60I0R0\include
$PROJ_DIR$\mcal\Port_TS_T40D34M60I0R0\include
$PROJ_DIR$\include
使用RTD安装路径下的链接配置:
$PROJ_DIR$\Generate\include
C:\NXP\SW32K3_S32M27x_RTD_R21-11_6.0.0\eclipse\plugins\BaseNXP_TS_T40D34M60I0R0\header
C:\NXP\SW32K3_S32M27x_RTD_R21-11_6.0.0\eclipse\plugins\BaseNXP_TS_T40D34M60I0R0\include
C:\NXP\SW32K3_S32M27x_RTD_R21-11_6.0.0\eclipse\plugins\Mcu_TS_T40D34M60I0R0\include
C:\NXP\SW32K3_S32M27x_RTD_R21-11_6.0.0\eclipse\plugins\Platform_TS_T40D34M60I0R0\include
C:\NXP\SW32K3_S32M27x_RTD_R21-11_6.0.0\eclipse\plugins\Rte_TS_T40D34M60I0R0\include
C:\NXP\SW32K3_S32M27x_RTD_R21-11_6.0.0\eclipse\plugins\Platform_TS_T40D34M60I0R0\startup\include
C:\NXP\SW32K3_S32M27x_RTD_R21-11_6.0.0\eclipse\plugins\Dio_TS_T40D34M60I0R0\include
C:\NXP\SW32K3_S32M27x_RTD_R21-11_6.0.0\eclipse\plugins\Port_TS_T40D34M60I0R0\include
C:\NXP\SW32K3_S32M27x_RTD_R21-11_6.0.0\eclipse\plugins\Det_TS_T40D34M60I0R0\include
$PROJ_DIR$\include
Defined symbols:
S32K3XX
S32K344
IAR
USE_SW_VECTOR_MODE
D_CACHE_ENABLE
I_CACHE_ENABLE
ENABLE_FPU
Extra options:
--no_clustering
--no_mem_idioms
--do_explicit_zero_opt_in_named_sections
--require_prototypes
--no_wrap_diagnostics
Languate 1:
Check Require prototypes
Diagnostics
Suppress these disgnostics:
Pa050
(3) Linker:
两个点:
P R O J D I R PROJ_DIR PROJDIR\mcal\Platform_TS_T40D34M60I0R0\build_files\iar\linker_flash_s32k344.icf
Library->Entry symbols: _start
(4)Debugger
Setup: PE micro, run to main
Extra Options:
Use command line options:
–drv_vector_table_base=__ENTRY_VTABLE
3.2.7 编译IAR工程
Project->Rebuild All
3.2.8 测试结果
Download and debug result:

下载之后运行,可以看到板子红灯闪烁,说明IAR IDE MCAL导入方式工程已经成功运行。
需要工程代码,请移步官方论坛:
https://community.nxp.com/t5/S32K-Knowledge-Base/S32K3-tool-part-How-to-use-IAR-compiler-or-IAR-project-to/ta-p/2179793
更多推荐



所有评论(0)