这边需要写一个IAP,于是在ld文件里面把项目的FLASH起始地址往后挪了0x4000
MEMORY
{
BOOTFLASH (rx) :ORIGIN=0x00000000, LENGTH=16K
FLASH (rx) :ORIGIN=0x00004000, LENGTH=176K
RAM (xrw) :ORIGIN=0x20000000, LENGTH=128K
}
SECTIONS
{
.bootapp:
{
_sbootappinit=.;
.=ALIGN(4);
KEEP(*(SORT_NONE(.bootapp)))
.=ALIGN(4);
_ebootappinit=.;
} >BOOTFLASHAT>BOOTFLASH
.init:
{
_sinit=.;
.=ALIGN(4);
KEEP(*(SORT_NONE(.init)))
.=ALIGN(4);
_einit=.;
} >FLASHAT>FLASH
为了方便调试,在前面塞了个bootFLASH段,写了个新的s文件.在BOOTFLASH段,里面只有一个j指令,跳到原本的地址:
.section .bootapp,"ax",@progbits
.global _boot
.align 1
_boot:
j _start
.word0x00000013
.word0x00000013
.word0x00000013
.word0x00000013
.word0x00000013
.word0x00000013
.word0x00000013
.word0x00000013
.word0x00000013
.word0x00000013
.word0x00000013
.word0x00000013
.word0x00100073
但是实际调试发现,这个跳转根本不起作用,单步调试发现跳到了莫名其妙的地方去了.
改成
lia6,0x4000
jra6
也一样的效果