定义函数到指定RAM区域
1. 定义需要转移的section(.ld)
_sifun = LOADADDR(.fundata);
.fundata : { . = ALIGN(4); _sfun = .; /* create a global symbol at data start */ *(.fundata) /* .data sections */ *(.fundata*) /* .data* sections */ . = ALIGN(4); _efun = .; /* define a global symbol at data end */ } >ITCMRAM AT> FLASH
_sifun = LOADADDR(.fundata); /*被载入函数段的位置赋值给变量_sifun*/ 启动文件转移数据使用
>ITCMRAM AT> FLASH 表示code存在于flash 运行前载入ITCMRAM(0x00000000-0x00008000)
_sfun记录fundata开始地址 启动文件转移数据使用
_efun记录有效区域的结束地址 启动文件转移数据使用
2.汇编写搬运code
startup_stm32h7b0abixq.s文件开头
/* start address for the initialization values of the .fundata section. defined in linker script */ .word _sifun /* start address for the .fundata section. defined in linker script */ .word _sfun /* end address for the .fundata section. defined in linker script */ .word _efun
汇编按顺序执行
ldr r0, =_sfun /* _sfun赋给r0 */ ldr r1, =_efun /* _efun赋给r1 */ ldr r2, =_sifun /* _sifun赋给r2 */ movs r3, #0 /* 0赋给r3 */ b LoopCopyFunInit /* 直接跳转到LoopCopyFunInit 开始执行 */ CopyFunInit: ldr r4, [r2, r3] /* r2+r3赋给r4 */ str r4, [r0, r3] /* r4赋给r0+r3 */ adds r3, r3, #4 /* r3+4赋给r3 */ LoopCopyFunInit: adds r4, r0, r3 cmp r4, r1 /* r4-r1 */ bcc CopyFunInit /* bcc根据cmp比较结果无借位跳转到 CopyFunInit 开始执行 */
3.定义宏 #define TORAM_ITCM __attribute__((section(".fundata")))
4.使用例子
TORAM_ITCM void function(void)
{
.......
}
5.使用ITCMRAM(0x00000000-0x000010000)时,避免字节对齐问题需从0x00000008使用,否则会发生未对齐访问进入Hardfault。

浙公网安备 33010602011771号