我正在将代码从闪存复制到 RAM、在复制代码后、我希望重置堆栈指针。
从能够了解 cmd 文件中设置的地址的正在运行的程序中执行此操作的首选方法是什么?
我看到过类似这样的东西、但我不知道如何在 cmd 文件中指定地址集。
_asm ("MOV SP、#_stack;");
要分支到新位置、是否会使用函数指针、分支还是 PC 寄存器加载?
我按如下方式设置 cmd 文件:
SECTIONS { codestart : > BEGIN kernel_section : //>> FLASH5 | FLASH6 | FLASH7 | FLASH8 | FLASH9 | FLASH11 | FLASH12 { flash_kernel_c28x_dual_ex1_boot_cpu1.obj(.text) flash_kernel_c28x_dual_ex1_erase_cpu1.obj(.text) flash_kernel_c28x_dual_ex1_sci_boot_cpu1.obj(.text) flash_kernel_c28x_dual_ex1_sci_flash_kernel_cpu1.obj(.text) flash_kernel_c28x_dual_ex1_sci_get_function_cpu1.obj(.text) flash_kernel_c28x_dual_ex1_verify_cpu1.obj(.text) } LOAD >> FLASH5,// | FLASH6 | FLASH7 | FLASH8 | FLASH9 | FLASH11 | FLASH12, RUN >> RAMLS0 | RAMLS1 | RAMLS2 |RAMLS3, LOAD_START(RamfuncsLoadStart), LOAD_SIZE(RamfuncsLoadSize), LOAD_END(RamfuncsLoadEnd), RUN_START(RamfuncsRunStart), RUN_SIZE(RamfuncsRunSize), RUN_END(RamfuncsRunEnd), ALIGN(4) .text : >>RAMGS1 | RAMGS2 | RAMGS3 | RAMGS4 .cinit : > RAMM0 .switch : > RAMM0 .reset : > RESET, TYPE = DSECT /* not used, */ .stack : > RAMM1 #if defined(__TI_EABI__) .bss : > RAMGS5 .data : > RAMGS5 .const : > RAMGS5 .init_arry : > RAMM0 .sysmem : > RAMGS5 #else .pinit : > RAMM0 .ebss : > RAMGS5 .econst : > RAMGS5 .esysmem : > RAMGS5 #endif Filter_RegsFile : > RAMGS5 #ifdef __TI_COMPILER_VERSION__ #if __TI_COMPILER_VERSION__ >= 15009000 .TI.ramfunc : > RAMGS5 #else ramfuncs : > RAMGS5 #endif #endif MSGRAM_CPU1_TO_CPU2 > CPU1TOCPU2RAM_0, type=NOINIT MSGRAM_CPU1_TO_CPU2_COPY_TO_M1_RAM > CPU1TOCPU2RAM_1, type=NOINIT MSGRAM_CPU2_TO_CPU1 > CPU2TOCPU1RAM, type=NOINIT MSGRAM_CPU_TO_CM > CPUTOCMRAM, type=NOINIT MSGRAM_CM_TO_CPU > CMTOCPURAM, type=NOINIT /* The following section definition are for SDFM examples */ Filter1_RegsFile : > RAMGS10, fill=0x1111 Filter2_RegsFile : > RAMGS11, fill=0x2222 Filter3_RegsFile : > RAMGS12, fill=0x3333 Filter4_RegsFile : > RAMGS13, fill=0x4444 Difference_RegsFile : >RAMGS14, fill=0x3333 }
谢谢、
John