|  | 
 
 楼主|
发表于 2012-7-23 16:02:49
|
显示全部楼层 
| 本帖最后由 longxigen 于 2012-7-23 16:04 编辑 
 回复 2# windflood
 
 
 To windflood:您好,感谢您的回复。
 我以前没有接触过bootloader,这几天一直在网上查资料,看见一种方法是用函数指针实现地址跳转,如下图所示:
 
   
 上面是一个单独的地址跳转代码,但不知道能不能成功。bootloader就是一段拷贝应用程序的代码再加上地址跳转的代码,但我试过几次都没有成功。。。下面是我现在的bootloader代码,暂时还没有成功,调试的时候没有看到PC跳转到想要去的地址。
 //=====================================================================
 #include "xparameters.h"
 #include "stdio.h"
 #include "xutil.h"
 
 #define APP_FLASH_LOC
 XPAR_FLASH_CNTLR_0_MEM0_BASEADDR
 #define APP_BRAM_LOC
 XPAR_XPS_BRAM_IF_CNTLR_1_BASEADDR
 #define APP_LENGTH
 0x4E84
 //=====================================================================
 void main (void)
 {
 
 u32
 flash_ptr;
 
 u32
 bram_ptr;
 
 
 
 u16
 data_flash;
 
 u16
 data_bram;
 
 u16
 i;
 
 
 
 void (* bootloader)();
 
 
 
 printf("Copy beginning\r\n");
 
 flash_ptr = APP_FLASH_LOC;
 
 bram_ptr = APP_BRAM_LOC;
 
 for(i=0;i<=APP_LENGTH-1;i++)
 
 {
 
 data_flash = XIo_In16(flash_ptr);
 
 XIo_Out16(bram_ptr,data_flash);
 
 data_bram = XIo_In16(bram_ptr);
 
 if(data_bram != data_flash)
 
 printf("i = %d, error ocurs.\r\n",i);
 
 flash_ptr = flash_ptr + 0x0002;
 
 bram_ptr = bram_ptr + 0x0002;
 
 }
 
 printf("Copy finished\r\n");
 
 
 
 bootloader = (void(*)())(APP_BRAM_LOC);
 
 (* bootloader)();
 }
 | 
 |