为了获得更好的MCU性能,有时可以将堆栈从SRAM重新定位到DTCM。操作步骤如下:
第一步:默认DTCM和堆栈内存区域定义如下。
int_dtcm : ORIGIN = 0x20000000, LENGTH = 0x00020000 /* 64K */
int_sram_stack_c0 : ORIGIN = 0x2042E000, LENGTH = 0x00001000 /* 4KB */
我们需要从DTCM重新定义新的堆栈区域
int_dtcm : ORIGIN = 0x20000000, LENGTH = 0x00020000 - 0x1000 /* 64K - 0x1000*/
int_stack_dtcm : ORIGIN = 0x20020000-0x1000, LENGTH = 0x1000/*Set last 4KB DTCM as stack*/
第二步:将默认SRAM地址的符号更改为DTCM地址。__Stack_start_c0将在启动代码中分配给MSP。
Old:
__Stack_end_c0 = ORIGIN(int_sram_stack_c0); __Stack_start_c0 = ORIGIN(int_sram_stack_c0) + LENGTH(int_sram_stack_c0);
New:
__Stack_end_c0 = ORIGIN(int_stack_dtcm); __Stack_start_c0 = ORIGIN(int_stack_dtcm) + LENGTH(int_stack_dtcm);
第三步:最后,我们需要更新用于ECC初始化的DTCM结束地址__INT_DTCM_END的边界。
Old:
__INT_DTCM_START = ORIGIN(int_dtcm); __INT_DTCM_END = ORIGIN(int_dtcm) + LENGTH(int_dtcm);
New:
__INT_DTCM_START = ORIGIN(int_dtcm); __INT_DTCM_END = ORIGIN(int_dtcm) + LENGTH(int_dtcm) + LENGTH(int_stack_dtcm);
现在我们可以从映射文件中看到,堆栈的起始地址就是DTCM的结束地址。
0x2001f000 __Stack_end_c0 = ORIGIN (int_stack_dtcm)
0x20020000 __Stack_start_c0 = (ORIGIN (int_stack_dtcm) + LENGTH (int_stack_dtcm))