各位大神:
我有个关于UBL启动自己裸机程序的困扰.请各位大神帮忙.我自己做的板子,CPU是OMAPL138,自己先做了个简单的测试程序,LED灯闪烁(代码运行在DDR2里).我先没有使用UBL.只是将这个测试程序用AISGEN封装了下,再用NANDWriter下载到NAND,然后选择Nand启动,上电后,没有任何异常,LED灯正常闪烁.UART2打印进入程序如下:
.但是我现在需要加UBL启动自己的裸机程序问题就来了.我首先使用的是官方的UBL,UBL的.out的程序由AISGEN封装,由于在AISGEN做了所需要的所有初始化(包括NAND,DDR2,UART,GPIO等等),我屏蔽了UBL源程序的DEVICE_init()函数,只保留了UART2的初始化程序,DEVICE_NANDInit程序.并且在此处增加了测试DDR2读写的代码,即写入128个数,再读出来,不相等就打印出来并且whle(1);卡在那里.然后我把这个封装好的UBL.BIN用NANDWriter下载到了目标板上.再把那个测试程序的也用NANDWriter下载到了目标板上.选择Nand启动,上电后打印如下:
就是进入不了正常的测试程序.我查看了测试程序的MAP.
这个测试程序的入口也是正确的地址.与UBL打印的地址也是一样的,为什么没有启动呢?请各位大神指点迷津啊,小弟不胜感激啊!
Shine:
请问您用的UBL是starterware里的bootloader吗? 一定要用UBL么?AISgen工具里可以完成基本的初始化。
boss BAO:
回复 Shine:
你好,我用的是DaVinci-PSP-SDK-03.20.00.14那个文件boot-strap里面的UBL,我想在我的应用程序之前进行一些特殊的操作,所以想用UBL程序.
boss BAO:
回复 Shine:
你好,我还有个问题,就是我的应用程序在不调用标准system_config.lib的情况下,我加入了init,asm 等文件.我在.CMD文件中 写.text:Entry>0xC1080000的时候,我的.Map文件中,Entry分配的地址不是0xC1080000.但是如果我调用了标准的system_config.lib,并且使用 .init: {system_config.lib<init.obj> (.text)} load > 0xC1080000这句话,我的.Map文件中,Entry分配的地址就是0xC1080000.我不明白是为什么?
Tony Tang:
回复 boss BAO:
你的应用程序binary是什么格式的?从UBL是按它是不带格式的binary,一整块搬过去的。
boss BAO:
回复 Tony Tang:
找到问题了,我的应用程序有问题,谢谢
boss BAO:
回复 Tony Tang:
你好!我还有个问题,就是我的应用程序在不调用标准system_config.lib的情况下,我加入了init,asm 等文件.我在.CMD文件中 写.text:Entry > 0xC1080000的时候,我的.Map文件中,Entry分配的地址不是0xC1080000.但是如果我调用了标准的system_config.lib,并且使用 .init : {system_config.lib<init.obj> (.text)} load > 0xC1080000这句话,我的.Map文件中,Entry分配的地址就是0xC1080000.我不明白是为什么?这个问题还是没解决,就是CMD文件中使入口函数指定在确定位置的.text:Entry > 0xC1080000这样写就不行.
Tony Tang:
回复 boss BAO:
boss BAO.text:Entry > 0xC1080000
这里有Entry是个符号,或者说是函数名吧,需要你在代码里实现这个函数。我估计你的代码里没有吧,默认的入口函数是_c_int00,来源于rts library.
boss BAO但是如果我调用了标准的system_config.lib,并且使用 .init : {system_config.lib<init.obj> (.text)} load > 0xC1080000
system_config.lib里的C:\ti\OMAPL138_StarterWare_1_10_04_01\system_config\armv5\cgt\init.asm里实现的Entry:
boss BAO:
回复 Tony Tang:
感谢您的答复,我现在把他的system_config.lib去掉,将init.asm文件加入工程,在CMD文件将.init : {system_config.lib<init.obj> (.text)} load 这句话改为.text:Entry > 0xC1080000,但是MAP分配的地址就是随机的,
map如下:
cmd文件如下:
init.asm
不知道是不是由于.text:Entry > 0xC1080000这样写有什么不妥?其实我就是不想用标准lib,我想自己在init,asm文件里做些操作.但是我又没办法将Entry指定到固定地址.
Tony Tang:
回复 boss BAO:
简单按这样改一下就可以了:
在init.asm里:
MODE_USR .set 0x10MODE_FIQ .set 0x11MODE_IRQ .set 0x12MODE_SVC .set 0x13MODE_ABT .set 0x17MODE_UND .set 0x1BMODE_SYS .set 0x1F
I_F_BIT .set 0xC0
;**************************** Code Seection *********************************** .sect text1
;; This code is assembled for ARM instructions; .state32
cmd里:
SECTIONS{ text1 : load > 0xC1080000