这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 下载专区 » [原创]4510 bootloader的实现与分析 (附源代码)

共35条 2/4 1 2 3 4 跳转至
菜鸟
2004-05-12 05:45:00     打赏
11楼
是的,image.rom已经包含了bootloader,可以直接少写到flash 0x0地址上,上电后就会直接运行了。因为bootloader在合并image.ram的时候对内核进行了压缩,所以需要解压缩。 其实你可以认为image.rom = image.ram + bootloader [align=right][color=#000066][此贴子已经被作者于2004-5-11 21:46:50编辑过][/color][/align]

菜鸟
2004-05-12 06:27:00     打赏
12楼
ha以下是引用ygqing_fen在2004-5-11 22:13:00的发言:
引用:因为kernel[]这个数组是一个全局变量,所以肯定是被放到RW段去了。所以,在remap后,先把RW段拷贝到RW_BASE的位置上去,设置好堆栈指针,就可以调用loadkernel函数了,这个函数会把knerle[]这个数组(其实就是内核image.ram)拷贝到0x8000的位置上去,然后跳转过去就可以启动了。 这就是说kernel[]这个内核是放在RW里面了,那么在flash里面放的就只有RO和RW两部分了,而RO的任务就是完成系统初始化,REMAP,把RW的内容拷贝到SDRAM中,最后跳到loadkernel函数中去, 是这样的吗?谢谢! 过程基本是这样的
[align=right][color=#000066][此贴子已经被作者于2004-5-11 22:27:45编辑过][/color][/align]

菜鸟
2004-05-12 06:31:00     打赏
13楼
以下是引用gaochaor在2004-5-11 21:53:00的发言:
image.rom可以自己重新映射RAM到0X00地址吗?它怎么知道板子的RAM是多大,Flash是多大呢? 是不是需要自己在编译时配置呢? 还有一问:既然image.rom可以直接用,那么用自己写的Bootloader+image.ram的方式是处于什么目的呢? 呵呵手头没有板子,只能多问了 FLASH, SDRAM的大小都是要预先定义好的。 其实自己尝试写一个bootloader也是一个学习过程。 image.rom其实包含了一个bootloader叫bios(专门为4510开发的),这个bootloader是linux_tao大侠写的,功能很强大。

菜鸟
2004-05-12 22:39:00     打赏
14楼
以下是引用ygqing_fen在2004-5-12 14:20:00的发言:
如果是这样的话,那就是把flash中的全部内容拷贝到SDRAM里了,把RW部分拷贝到RW_base开始的地方,而把R0部分拷贝到SDRAM的基地址,因为image.ram是从0x8000处开始运行的,在映射之后,R0部分应该在0x0000到0x8000这段区间内,是这样的吗?谢谢! 是的

菜鸟
2004-05-12 22:42:00     打赏
15楼
以下是引用ygqing_fen在2004-5-12 14:29:00的发言:
因为我现在还没有看程序,所以问的问题可能初级,请大家莫怪。因为在SDRAM的0x0000处应该放中断向量才是,肯定放的不是BOOTLOADER的的R0部分,那么这一部分又放到哪儿去了呢?我用的是sc44b0的开发板,它是不支持remap的,所以要把中断向量放在flash的起始地址,这是不是意味着我在flash的0地址应放一条跳转语句,跳到BOOTLOADER的的R0部分?
系统起来以后在SDRAM的地址0x0处放的应该是中断向量,这是由操作系统完成的,所以在bootloader里不用管它。其实在把image.ram装载到0x8000后,bootloader就没有作用了,所以bootloader RO段占用的地方会被内核覆盖掉了。

菜鸟
2004-05-13 10:08:00     打赏
16楼
以下是引用lisim51在2004-5-12 17:05:00的发言:
问一个不好意思地问题:我看part4部分 ;****************************************************************
;Initalize the memory as followa:
; FLASH @ 0 ~ 2 M
; SDRAM @ 2 ~ 18M
; ;/*************************************************************************/
; /* SYSTEM MEMORY CONTROL REGISTER EQU TABLES */
; /*************************************************************************/ ;***************Init***************
;rEXTDBWTH EQU 0x00003001
;rROMCON0 EQU 0x02000060
;rROMCON1 EQU 0x60
;rROMCON2 EQU 0x60
;rROMCON3 EQU 0x60
;rROMCON4 EQU 0x60
;rROMCON5 EQU 0x60
;rSDRAMCON0 EQU 0x12008380
;rSDRAMCON1 EQU 0x00
;rSDRAMCON2 EQU 0x00
;rSDRAMCON3 EQU 0x00
;rSREFEXTCON EQU 0xCE278360 LDR r1, =rEXTDBWTH ;EXTDBWTH
LDR r2, =rROMCON0 ;ROMCON0 @ 0M ~ 2M
LDR r3, =rROMCON1 ;ROMCON1 @ DISABLED
LDR r4, =rROMCON2 ;ROMCON1 @ DISABLED
LDR r5, =rROMCON3 ;ROMCON1 @ DISABLED
LDR r6, =rROMCON4 ;ROMCON1 @ DISABLED
LDR r7, =rROMCON5 ;ROMCON1 @ DISABLED
LDR r8, =rSDRAMCON0 ;SDRAMCON0 @ 2M ~ 18M
LDR r9, =rSDRAMCON1 ;SDRAMCON1 @ DISABLED
LDR r10,=rSDRAMCON2 ;SDRAMCON2 @ DISABLED
LDR r11,=rSDRAMCON3 ;SDRAMCON3 @ DISABLED
LDR r12,=rSREFEXTCON

LDR r0, =ARM7_EXTDBWTH //最后这两句话怎么理解阿? STMIA r0, {r1-r12} //EXTDBWTH是个寄存器,怎么能把R1-R12写进去 对寄存器ROMCON0写入0x02000060,其中[19:10]该设置值左移16位即为FLASH的起始地质。这一共9位,怎么左移16位?怎么确定REMAP后的地质? 问题比较初级,耽误了您的时间?谢谢! STMIA r0, {r1-r12} STMIA是批量存储指令,通过一条指令可以实现多过存储。

菜鸟
2004-05-13 10:10:00     打赏
17楼
以下是引用lisim51在2004-5-12 17:14:00的发言:
我知道了,EXTDBWTH 和后边的寄存器地置是连着的,08,0C,10,14,,,,,,, 我现在还有点不明白的是 对寄存器ROMCON0写入0x02000060,其中[19:10]该设置值左移16位即为FLASH的起始地质。这一共9位,怎么左移16位?怎么确定REMAP后的地质? 另外,我没找到SREFEXTCON这个寄存器,只有REFEXTCON这个寄存器。 我看得是ARM应用系统开发详解--基于S3C4510的系统设计
不好意思,是我写错了,只有REFEXTCON这个寄存器[em04]

菜鸟
2004-05-13 10:12:00     打赏
18楼
以下是引用ygqing_fen在2004-5-12 22:14:00的发言:
对part7部分,我看了N久,但总是琢磨不透,不知哪位高手可以帮忙解释一下,万分感激!你自己可以用ADS调试跟踪一下

菜鸟
2004-08-12 03:50:00     打赏
19楼
以下是引用tianwen在2004-8-9 10:17:00的发言:
感谢twentyone给我们提供了这么好的资料,使我们少走了很多弯路,在此谢谢了。 不过我对你写的程序还是有两点疑问,如果你有空,还望你解答一下: ;Part 5
;***************************************************************
;Self copy from FLASH to SDRAM LDR r0, =|Image$$RO$$Base|
LDR r1, =|Image$$RO$$Limit|
LDR r2, =|Image$$RW$$Base|
LDR r3, =|Image$$RW$$Limit| SUB r1, r1, r0
SUB r3, r3, r2
ADD r1, r1, r3

LDR r2, =0x200000 ;@2M (ADD R2,R2,R0 ;应该加上这一句。
COPY
LDR r3, [r0], #4
STR r3, [r2], #4
SUBS r1, r1, #4
BNE COPY
第一个问题就是上面这短从FLASH拷贝RO,RW到SDRAM,从你写的程序中可以看到,在FLASH中,你开始搬移的地址是|Image$$RO$$Base| ,结束的地址是 |Image$$RO$$Base| +R1,(这里的R1就是上面算出的RO加RW的容量),但是你搬到SDRAM的起始地址是0x200000 (也就是SDRAM的起始地址0X0),结束地址是0x200000 +R1。很明显|Image$$RO$$Base| 并不总是恒等于OX0的!!!!这跟ARMLINK里的RO设置有关。所以你上面这样写我觉得不是很妥。应该加上如上的一句。 另外一个问题是:我因为没有具体写过BOOTLOADER,不知道中断向量表是怎么处理的。如果我们把RO设为0X0,那岂不是把中断向量表给覆盖了。那又怎么移植?还是OS能自动处理,在BOOTLOAD不用管这一步的?/
你说的第一个问题确实如你所说,如果RO_BASE != 0的情况下拷贝完后会出现问题。
一般情况下,bootloader肯定是运行在地址0x0处的,所以对bootloader来说RO_BASE 必须等于0。不过我个人觉得还是加上一句:ADD R2,R2,R0 ,谢谢提醒! 第二个问题:一般情况下,在bootloader里面是不管中断的,bootloader低第一个动作一般是关中断,所以不用考虑中断向量的问题。

菜鸟
2004-08-12 21:09:00     打赏
20楼
以下是引用CityWander在2004-8-12 11:05:00的发言:
感谢TwentyOne写的这些东西,对我们这些初学者有极大的帮助,谢谢 在此请教一个小小的问题: 对于普通的不需要操作系统的嵌入式软件,就是只有一个main函数的控制环的情况,是不是也需要一个bootloader?我在ADS下试着调试了其附带的例程(目标板是ATMEL的eb55,调试的时候板上有一个程序负责下载程序到RAM,然后从RAM中运行),都能通过且运行正常,但我在他的启动代码中并未发现类似bootloader的代码,请问我们如果要讲程序烧写到flash中运行的话,是否也需要一个bootloader? 望指点,谢谢
其实不一定都需要bootloader。 因为板子上电后,一般来说SDRAM都不可用,无论用什么方法,都需要把SDRAM配置好。这可以通过单独的bootloader来完成,为后面程序的运行准备好运行环境; 你也可以在自己写的程序中包括些简单的代码用来配置FLASH和SDRAM。功能比较全面的bootloader,象bios,个人感觉是在开发和调试的过程应用的比较多,在开发完成以后,可以在自己的代码中添加相应的FLASH&SDRAM的配置代码,把bootloader给抛弃掉,: ) 至于FLASH的烧写,有很多种办法:功能比较全的bootloader可以支持flash烧写,好的仿真器也支持flash烧写,用其他的软件也可以(flash program)。


共35条 2/4 1 2 3 4 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]