急求前辈指点bootloader的问题
时间:10-02
整理:3721RD
点击:
小弟近日用XPS在Virtex 5上搭建了一个ppc440系统,硬件模块都已经连接完成,包括bram、flash,通过基本的测试可以保证硬件连接没有问题。
现在正在做一个bootloader,bootloader程序跟硬件配置的.bit流文件一起存放在配置芯片PROM中,板子上电后,FPGA通过主串模式从PROM读取硬件配置信息,然后bootloader程序也被读入bram中开始执行。bootloader首先把flash中的应用程序拷贝到bram中,这一步已经验证过没有问题。拷贝完成后,接下来应该从bootloader跳转到应用程序入口处执行,请问各位大神,这一步跳转应该如何实现?
另外,bootloader跳转到应用程序,是相当于函数调用吗?也就是说应用程序执行完后会返回bootloader程序吗?
请各位大神指教!小弟先谢过了!
不清楚你用的处理器,但是应该都是相通的。如果是ARM的话,是通过进入中断来调应用程序。如果你的设计中没有用到中断,那就在bootloader的复位程序里面调应用程序,完成相应操作就行。其实就是在bootloader里面合适地方函数调用而已。
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)();
}
To windflood:您好!
我检查了一下我的设计,发现一点问题。我建立一个应用程序后,产生的可执行文件是.elf格式的,然后直接把它烧写到Flash芯片中,并且把.elf从Flash拷贝到BRAM后,让bootloader跳转到.elf在BRAM中的起始。但我突然想起来,.elf的起始处并不是汇编指令,而是有一堆别的信息。对.elf文件结构我不是太清楚,不知道汇编指令从哪个位置开始。
Flash芯片中应该烧写什么格式的文件啊?bin格式?又该怎么把elf转换成bin呢?
烧flash有很多种软件,不同软件使用的文件格式不一样。不用担心烧进去的文件包含文件头信息,那些东东是不会写进flash的。至于地址跳转,外部定义一个函数,在main里面调用不就完了吗。如果你是想跳到一个固定地址,那就结合处理器在C里面用汇编咯,把地址赋值给处理器的pc指针寄存器就行啦。多查查资料吧。
像uboot这类loader有串口命令行,通过命令跳转
