例程中的跳转地址是0x00005000,在ld文件中,IAP的起始地址是0x08000000,APP的起始地址是0x08005000,实现跳转的函数在中断SW_Handler()中如下:
void SW_Handler(void) {
__asm("li a6, 0x5000");
__asm("jr a6");
while(1);
}
这应该是个汇编语言,将0x5000写入一个寄存器,然后执行jr跳转指令。
例程能够正常运行,并跳转到0x8005000执行APP程序,现在因为工程需求,IAP程序的大小可能会比较大,0x5000也就是20k的空间可能不足,所以我想增加其空间大小,所以修改APP起始地址为0x08010000,对应的APP的ld文件我也进行了修改如下:
MEMORY
{
FLASH (rx) : ORIGIN = 0x00010000, LENGTH = 44K
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 20K
}
IAP内的修改如下:
MEMORY
{
/* CH32V20x_D6 - CH32V203F6-CH32V203G6-CH32V203K6-CH32V203C6 */
/*
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 64K //32k
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 10K
*/
中断
void SW_Handler(void) {
__asm("li a6, 0x10000");
__asm("jr a6");
while(1);
}
修改编译后,程序只能运行到IAP程序,无法实现跳转到APP程序所在的地址。目前不知道问题出在哪里,还请吧友们指教。
ps:ld文件内的LENGTH应该只是一个后续大小的值,我直接按64k写了,64k和例程的20k都试过,好像对跳转到0x08010000这个地址来说没啥区别。。