在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2598|回复: 5

[求助] 急求前辈指点bootloader的问题

[复制链接]
发表于 2012-7-20 23:03:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 longxigen 于 2012-7-23 21:11 编辑

小弟近日用XPS在Virtex 5上搭建了一个ppc440系统,硬件模块都已经连接完成,包括bram、flash,通过基本的测试可以保证硬件连接没有问题。
现在正在做一个bootloader,bootloader程序跟硬件配置的.bit流文件一起存放在配置芯片PROM中,板子上电后,FPGA通过主串模式从PROM读取硬件配置信息,然后bootloader程序也被读入bram中开始执行。bootloader首先把flash中的应用程序拷贝到bram中,这一步已经验证过没有问题。拷贝完成后,接下来应该从bootloader跳转到应用程序入口处执行,请问各位大神,这一步跳转应该如何实现?

另外,bootloader跳转到应用程序,是相当于函数调用吗?也就是说应用程序执行完后会返回bootloader程序吗?

请各位大神指教!小弟先谢过了!
发表于 2012-7-23 14:38:17 | 显示全部楼层
不清楚你用的处理器,但是应该都是相通的。如果是ARM的话,是通过进入中断来调应用程序。如果你的设计中没有用到中断,那就在bootloader的复位程序里面调应用程序,完成相应操作就行。其实就是在bootloader里面合适地方函数调用而已。。
 楼主| 发表于 2012-7-23 16:02:49 | 显示全部楼层
本帖最后由 longxigen 于 2012-7-23 16:04 编辑

回复 2# windflood


To windflood:您好,感谢您的回复。
我以前没有接触过bootloader,这几天一直在网上查资料,看见一种方法是用函数指针实现地址跳转,如下图所示:
1.png

上面是一个单独的地址跳转代码,但不知道能不能成功。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)();
}
 楼主| 发表于 2012-7-23 21:09:30 | 显示全部楼层
回复 2# windflood


   To windflood:您好!
我检查了一下我的设计,发现一点问题。我建立一个应用程序后,产生的可执行文件是.elf格式的,然后直接把它烧写到Flash芯片中,并且把.elf从Flash拷贝到BRAM后,让bootloader跳转到.elf在BRAM中的起始。但我突然想起来,.elf的起始处并不是汇编指令,而是有一堆别的信息。对.elf文件结构我不是太清楚,不知道汇编指令从哪个位置开始。
Flash芯片中应该烧写什么格式的文件啊?bin格式?又该怎么把elf转换成bin呢?
发表于 2012-7-24 11:36:16 | 显示全部楼层
烧flash有很多种软件,不同软件使用的文件格式不一样。不用担心烧进去的文件包含文件头信息,那些东东是不会写进flash的。至于地址跳转,外部定义一个函数,在main里面调用不就完了吗。如果你是想跳到一个固定地址,那就结合处理器在C里面用汇编咯,把地址赋值给处理器的pc指针寄存器就行啦。多查查资料吧。。
发表于 2012-8-24 10:21:37 | 显示全部楼层
像uboot这类loader有串口命令行,通过命令跳转
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

X

小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-6-8 11:42 , Processed in 0.035797 second(s), 11 queries , Gzip On, MemCached On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表