工具/软件:
尊敬的团队:
我正在研究 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 工具链兼容。
非常感谢任何帮助。 谢谢!
