22楼
刚看完你的文章和源码,很受启发,非常感谢!
现在有个问题想请教.在你的文章上说UCLINUX 编译完后会生成image.rom的内核映像文件其中包括了一个bootloader,那么是不是在uclinux的内核文件中已经包括了一个bootloader(也就是你说的一个bios程序),它有在内核的那一部分呢?
还有对于s3c451b的所有系统资源内核是通过什么来得到它们的地址的,是在内核的文件中已经有定义了吗?那么在设计板子的时候是不是要按照这些设置打尖外围设备!
初学者,见笑!
求助!求助!求助!求助!求助!求助!
各位DX:
下面是我的S3C4510B板子启动运行后的状态:
------------------------------------------------------------------------------------------------
Compex BIOS for SAMSUNG S3C4510B v1.20-lt74
Press Enter for Menu, Esc for Safe Mode
Initializing system .... Done
Found W29C040P at 0x00000000
Found SST39VF160 at 0x00080000
Password: ***
Main Menu
1 - BIOS Setup
2 - Run Fdisk
3 - Load Image
4 - Update Image
5 - Reboot
Please Select
-----------------------------------------------------------------------------------------------------
这是我找的BOOTLOADER,有修改,选取: 4 - Update Image 进行TFTP 下载IMAGE.ROM,发现总是超时,但后来下一个不到250个字节的文件就可以下载成功,不知是什么原因,还请各位DX指点一二,我已被这个问题搞“江郎才尽”了。。。。。。。
Press Enter for Menu, Esc for Safe Mode
Initializing system .... Done
Found W29C040P at 0x00000000
Found SST39VF160 at 0x00080000
Password: ***
Main Menu
1 - BIOS Setup
2 - Run Fdisk
3 - Load Image
4 - Update Image
5 - Reboot
Please Select
-----------------------------------------------------------------------------------------------------
这是我找的BOOTLOADER,有修改,选取: 4 - Update Image 进行TFTP 下载IMAGE.ROM,发现总是超时,但后来下一个不到250个字节的文件就可以下载成功,不知是什么原因,还请各位DX指点一二,我已被这个问题搞“江郎才尽”了。。。。。。。
感谢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 ;应该加上这一句。 LDR
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不用管这一步的?/
;***************************************************************
;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 ;应该加上这一句。 LDR
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不用管这一步的?/
以下是引用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低第一个动作一般是关中断,所以不用考虑中断向量的问题。
感谢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低第一个动作一般是关中断,所以不用考虑中断向量的问题。
以下是引用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)。
感谢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)。
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |