This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] LP-AM261:将 AM261x SBL 从 TI Clang 迁移到 IAR:二进制文件大小意外增加

Guru**** 2529560 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1564409/lp-am261-migrating-am261x-sbl-from-ti-clang-to-iar-unexpected-binary-size-increase

器件型号:LP-AM261


工具/软件:

尊敬的团队:

我正在研究 AM261x-LP、具有使用 CMake 构建系统的 IAR 工具链。 由于 IAR (9.5) 不支持 AM261x、我将 IAR 升级到了 9.7、现在便支持 IAR。

最初我使用了 TIClang 4.0.1 和 CMakebuild 系统。 通过启用 XIP 模式、我能够构建并刷写次级引导加载程序和示例闪烁应用程序。

在 TIClang 中、我没有遇到任何问题、但我想使用 IAR 工具链。 为此、我从次级引导加载程序 (SBL_OSPI) 开始、可以编译 SBL、但生成的二进制文件大小过大。 以下是两个工具链的大小差异:
a) TI 编译器:out image size -> 983KB、postbuild bin size 为 218KB、能够使用 mcu_rom_image_gen.py 签名以生成 sbl_ospi.tiimage。
b) IAR 编译器:out 映像大小-> 1.6MB、编译后分段大小为 1.75Gb。

因为它是 bootloader、mcu_rom_image_gen.py 要求 bin 文件大小小于 985KB。


对 IAR CMake 构建所做的更改:

1) 将裸机内核文件更改为与 IAR 兼容,因为现有的汇编文件仅支持 TIClang。
来自 MCU_PLUS_SDK_am261x_10_02_00_15 的文件:
boot_armv7r_asm.S
CacheP_armv7r_asm.S
CPUID_armv7r_asm.S
HwiP_armv7r_asm.S
HwiP_armv7r_handlers_nortos_asm.S
HwiP_armv7r_vectors_nortos_asm.S
mpuP_armv7r_asm.S
ammuP_armv7r_asm.S

CacheP_armv7r_asm 汇编代码示例:
之前:
/*函数 DEF:void CacheP_enableL1d (void)*/
.global CacheP_enableL1d
.type CacheP_enableL1d、%function
.section “.text.cache","ax",%progbits</s>“ ““
.arm
.align 2.
CacheP_enableL1d:
MRC P15、#0、r0、C1、c0、 #0 //读取 SCR 寄存器
ORR r0、r0、#0x0004 //将 C 位(位 2)设置为 1
DSB
MCR P15、#0、R1、C15、C5、 #0 //使整个数据缓存无效
MCR P15、#0、r0、C1、c0、 #0 //启用 L1D 缓存
BX LR

之后:
/*函数 DEF:void CacheP_enableL1d (void)*/
公共 CacheP_enableL1d
section .text_cache: code:NOROOT(2);将函数保留在.text 中、对齐 2 个字节
ARM
CacheP_enableL1d:
MRC P15、#0、r0、C1、c0、 #0 //读取 SCR 寄存器
ORR r0、r0、#0x0004 //将 C 位(位 2)设置为 1
DSB
MCR P15、#0、R1、C15、C5、 #0 //使整个数据缓存无效
MCR P15、#0、r0、C1、c0、 #0 //启用 L1D 缓存
BX LR

2) CMake 中的 IAR 编译器标志:
#编译器
设置 (CMAKE_C_Compiler “${toolchain_bin}/iccarm.exe“)
设置 (CMAKE_CXX_Compiler “${toolchain_bin}/iccarm.exe“)
设置 (CMAKE_ASM_Compiler “${toolchain_bin}/iasm.exe“)
设置 (CMAKE_AR “${toolchain_bin}/iarchive.exe“)
设置 (CMAKE_linker “${toolchain_bin}/ilinkarm.exe“)
设置 (CMAKE_objcopy “${toolchl_bin}/ielftool.exe“)

a) C-CPP 标志:设置 (TARGET_MCU_FLAGS
“--cpu=cortex-r5"</s>“
“--fpu=vfpv3"</s>“
“--endian=little"</s>“
“--拇指“
)

b) Common-Flags:set (Compiler_flags
“-e"</s>“
“--diag_suppress=Pa050"</s>“
“--no_path_in_file_macros"</s>“
“-NO_CSE"</s>“
“--no_unroll"</s>“
“--no_inline"</s>“
“--no_code_motion"</s>“
“--no_tbaa"</s>“
“--no_clustering"</s>“
“--no_scheduling"</s>“
“--MFC"</s>“
)
c) CMAKE_ASM_FLAGS:set (CMAKE_ASM_FLAGS
${TARGET_MCU_FLAGS}
“-s+"</s>“
“-w+"</s>“
#“-r"</s>“
“-M<>"</s>“
)
D) 调试和释放标志:
set (CMAKE_C_FLAGS_debug “-on --debug“)
设置 (CMAKE_C_FLAGS_RELEASE “-os -guard_calls“)

e) 链接器标志:
设置 (CMAKE_EXE_LINK_FLAGS)
“--map +“
“--inline"</s>“
“--no_exceptions"</s>“
“--VFE"</s>“
“--merge _复制_节“
“--redirect _printf=_PrintfLargeNoMb“
“--redirect _scanf=_ScanfFullNoMb“
“--no_remove"</s>“
)

3) 更改链接器脚本 (.icf) 以与定义的段保持一致:

/*栈和堆大小*/
定义符号__ICFEDIT_SIZE_CSTACK__= 0x2000;/* 8KB */
定义符号__IFEDIT_SIZE_HEAP__= 0x8000;/* 32768 */

/* R5 模式专用堆栈*/
定义符号_IRQ_STACK_SIZE = 0x1000;/* 4096 */
定义符号__FIQ_STACK_SIZE = 0x0100;/* 256 */
定义符号_SVC_STACK_SIZE = 0x1000;/* 4096 */
定义符号__ABORT_STACK_SIZE = 0x0100;/* 256 */
define symbol _Undefined_stack_size = 0x0100;/* 256 */

/*------------------------------------------------------------------------------------ */
/*存储器区域*/
/*------------------------------------------------------------------------------------ */
定义大小= 4G 的存储器存储器;

define REGION R5F_VECS = mem:[从 0x00000000 到 0x000000FF];
define REGION R5F_TCMA = mem:[从 0x00000100 到 0x00007FFF];
define 区域 R5F_TCMB0 = mem:[从 0x00080000 到 0x00087FFF];
define region MSRAM_VECS = mem:[从 0x70002000 到 0x700020FF];
define 区域 MSRAM_0 = mem:[从 0x70002100 到 0x70031FFF];
define REGION MSRAM_HSMRT = mem:[从 0x70032000 到 0x70071FFF];
define 区域 MAILBOX_HSM = mem:[0x44000000 到 0x440003CD];
define REGION PARAMBOL_R5F = mem:[从 0x44000400 到 0x440007CD];

/*------------------------------------------------------------------------------------ */
/*栈的块+堆*/
/*------------------------------------------------------------------------------------ */
使用 alignment = 8 定义块 CSTACK、SIZE =_ICMEDIT_SIZE_CSTACK__{RW section CSTACK};
使用 alignment = 8 定义块堆、size =__ICFEDIT_SIZE_HEAP__{};
使用 alignment = 8 定义块 IRQ_STACK、SIZE =_IRQ_STACK_SIZE{RW section IRQ_STACK};
使用 alignment = 8 定义块 FIQ_STACK、SIZE =_FIQ_STACK_SIZE{RW section FIQ_STACK};
使用 alignment = 8 定义块 SVC_stack、size =_SVC_STACK_SIZE{RW section SVC_stack};
使用 alignment = 8 定义块 ABT_STACK、size =_ABORT_STACK_SIZE{RW section ABT_STACK};
使用 alignment = 8 定义块 und_stack、size =_Undefined_stack_size{RW section und_stack};

放置在 MSSRAM_0 中{
readwrite 段.bss、
readwrite 段.sysmem、
readwrite 段.stack、

块 CSTACK、
块堆,
IRQ_STACK 块、
阻止 FIQ_STACK、
块 SVC_STACK、
阻止 ABT_STACK、
Block und_stack
};

/*------------------------------------------------------------------------------------ */
/*放置*/
/*------------------------------------------------------------------------------------ */
放置在地址 mem:0x00000000 {只读段.intvec };

放置在 MSSRAM_VECS 中{
只读段.sbl_init_code、
只读段.vectors
};

放置在 MSSRAM_0 中

/* ro */
只读段.text、
只读段.text_hwi、
只读段.text_PMU、
只读段.text_cache、
只读段.text_boot、
只读段.rodata、
只读段.rodata_cfg、
只读部分.iar.init_table、
只读段.data.PMU_init、

/*数据/RW */
readwrite 段.data、
readwrite 段.data.PMU、
};

放置在 MSSRAM_HSMRT{
只读段.rodata.hsmrt
};

放置在 Mailbox_HSM{中
readwrite 段.bss.SIPC_HSM_QUEUE_mem
};

放置在 Mailbox_R5F 中{
readwrite 段.bss.sipc_secure_host_queue_mem
};

/*标记为空载*/
不初始化{段.bss.SIPC_HSM_QUEUE_mem };
不初始化{段.bss.SIPC_SECURE_HOST_QUEUE_mem };




应用程序代码没有变化、我对两个工具链使用相同的代码。
但在我的应用程序代码中、我使用的是“__attribute “、如下所示、我是否需要使用#pragma 而不是_attribute? 或者其他任何可能使其正常工作的东西。

#define RODATA_CFG_SECTION __ATTRIBUTLE__((section(“.rodata_cfg")“)))
/*----- Cachep----- */
const CacheP_Config gCacheConfig RODATA_CFG_SECTION ={
.enable = 1、
.enableForceWrThru = 0、
};


我需要使 AM261x 与 IAR 工具链兼容。
非常感谢任何帮助。 谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Dileep

    [报价 userid=“670362" url="“ url="~“~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1564409/lp-am261-migrating-am261x-sbl-from-ti-clang-to-iar-unexpected-binary-size-increase

    b) IAR 编译器:out 映像大小-> 1.6MB、编译后分段大小为 1.75Gb。

    [/报价]

    这似乎是一个配置问题、您是否查看过编译标志。

    编译后大小也异常。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您是否可以共享 IAR SBL 工程、以便我更好地了解配置?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Dileep:

    用于将 sbl.out 转换为 sbl.tiiimage 的脚本位于以下位置:

    MCU_PLUS_SDK/source/security/security_common/tools/boot/signing/rom_image_gen.py

    请正确给定编译后脚本参数、我在上面的代码片段中看不到编译后脚本命令。