定义函数到指定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。

posted @ 2022-06-02 11:05  妖岭  阅读(355)  评论(0)    收藏  举报