作为对比,我还写了一个裸机的led程序,这个程序烧进去后(debug状态下)马上就能进入main程序,并停留在main的开头,也可以运行。
但是现在这个带着SYS/BIOS的程序却始终不能进入main,下载完成后,要么是不会出现运行按钮,即使出现了运行按钮,程序也跳不进来。
总之,程序要么是停在boot.c文件中,要么是在XXX_p674.c文件中(XXX是我的应用程序前缀),如图:
要么这样
要么下载完程序后,根本就没有运行按钮,只能按下红色暂停后,才会出现运行按钮,然后发现停留在XXX_p674.c文件里,再按运行,或者单步执行,可能又会
跳到boot.c的exit(1)处
按下红色暂停
再按单步执行可能又要回到下图
看了SYS/BIOS (TI-RTOS Kernel) v6.41 User's Guide,在3.1小节,它讲到main之前的SYS/BIOS Startup Sequence
还有http://rtsc.eclipse.org/docs-tip/Using_xdc.runtime_Startup和http://rtsc.eclipse.org/docs-tip/Using_xdc.runtime_Startup/TI
更是详细讲解了main之前的启动顺序,以及每阶段做了什么。
现在程序进不去main,而且经常卡在boot.c和XXX_p674.c文件里,而boot.c文件里就涉及了初始化B15和B14等操作,我猜会不会是"before main()" startup
sequence的第一步就出现了问题?
下面是boot.c文件
我这个boot.c定位的是在ccsv6\tools\compiler\c6000_7.4.8\lib\src下,难道不应该是在ti.targets.rts6000 package里?
以下附件和CCS的截图均是工程中使用的ccsv6\tools\compiler\c6000_7.4.8\lib\src下的boot.c。
boot.c在CCS的截图
最后贴上我的.cfg文件如下
非常需要得到帮助,请各位大侠看看问题究竟在哪,为什么程序进不到main里面?非常感谢!
Tony Tang:
是自己的板子还是EVM板?
程序是运行在DDR还是片上内存?
有没有用gel文件初始化DDR?
main之前的运行步骤对用户来说一般是不用关心的。
baokun hu:
回复 Tony Tang:
是自己的板子,但是是按照C6748LCDK里面的原理图来画的,所以nand flash和ddr dram都一样,之前试过gel文件好像不行,ddr接口不能设置(但pll0,pll1时钟设置应该是没问题的),我以前用裸机led程序试过,确定可以在ddr里面运行(debug下,看的清楚),而且还可以烧写进nand flash启动起来,我也用你写的那个ddr例子做压力测试过,都没问题。怎么裸机程序led能在ddr里面运行,带着系统就不能在ddr里面了?进不去main程序,老在boot.c里面,会不会是boot.c的或者.cfg文件的问题?我的boot.c是自动调用TI编译器下的,不是ti.target.rst6000的。
Tony Tang:
回复 baokun hu:
baokun hu之前试过gel文件好像不行
为什么不行,gel文件里本来就有DDR配置的,只是根据自己板子上用的DDR型号修改一下参数就可以了。如果DDR不配置,程序怎么能下载到DDR呢?
baokun hu我的boot.c是自动调用TI编译器下的,不是ti.target.rst6000的。
应该是ti.targets.elf.C674吧。不是rst6000
baokun hu:
回复 Tony Tang:
你说的对,我上面的错误可能就是在debug时target configuration没有加入gel文件,加入gel文件后,之前的问题没了,然后就是会报DDR2 Seting的错误,这就回到
熟悉的问题上了。
不过我有一点不能理解的就是,同样不设置DDR2,为何我之前的led程序(裸机)可以在debug时进入DDR2运行,而这个带操作系统的就不行呢
(gel文件中,DEVICE_DDRConfig(DDR2, 150)这句话被我用//屏蔽了,但后面提示还是DDR2?data verify 啥的过不去,反正应该还是跟DDR2没设置有关)?
还有一个问题,如果我的硬件电路板DDR2设计的有问题,无论怎样修改一下参数,DDR2肯定是通不过的,现在我可以在DDR2中跑led裸机程序,并且可以通过
DDR2的EDMA压力测试,那么我这种情况,是电路设计的问题,还是寄存器参数设置的问题,哪个可能大一些?
Tony Tang:
回复 baokun hu:
baokun hu然后就是会报DDR2 Seting的错误
这是什么样的错误?
baokun hu但后面提示还是DDR2?data verify 啥的过不去,反正应该还是跟DDR2没设置有关)
这是在从CCS下载程序时报的错吧。
baokun hu现在我可以在DDR2中跑led裸机程序,
你确定你的LCD程序是跑在DDR上吗?
baokun hu并且可以通过DDR2的EDMA压力测试,
不加gel初始化DDR也能通过DDR压力测试?不可能吧。
baokun hu:
回复 Tony Tang:
当然DDR2中可以跑led裸机程序,不是通过加载gel文件看出来的,gel文件是如何都通过不了的(裸机led程序也一样,不行),这个是通过.ini在命令行生成的,然
后发现程序可以在DDR2里面跑。
而DDR的压力测试确实通过了,我试了三次都成功了,当然没有使用gel文件初始化CPU,只设置了PLL0,先使CPU时钟低,然后调高cpu时钟,
不设置DDR2接口,默认的,然后让数据来回在DDR2里面读写,比较核对都没有差错,共三次。
Tony Tang:
回复 baokun hu:
晕,谁知道你是通过这个UART host Boot下载程序运行的啊。你在ini里配置了DDR了而不知道吧。
从前面你定位程序跑的位置来看,你应该是可以连接仿真器来加载程序的啊,为什么不这么做呢?
你说的gel文件是如何都通过不了的到底是什么意思?运行gel出错?那是出了什么错?
你用的gel文件是哪个呢?
baokun hu:
回复 Tony Tang:
回1:这是什么样的错误?
这是加入gel文件后的,很明显这是DDR2没设置好的问题,具体点儿就是 DDR2的参数设置完成后,在进行状态转变时发生错误,证据如下(gel文件):
回2:这是在从CCS下载程序时报的错吧。
为了避免配置DDR2产生错误,所以就注释掉配置DDR2的函数(//DEVICE_DDRConfig(DDR2, 150);),试试能不能行得通。结果如下:
回3:你确定你的LCD程序是跑在DDR上吗?
我确定led程序是跑在DDR上面的。这个是通过串口烧进DDR2运行的,利用OMAP-L138_generic_secure_ddr2.ini和led.out生成了led_ddr2.bin(加密芯片)。
这里的DDR2地址为DDR2 o = 0xC0000000 l = 0x04000000 /* 64MB DDR2 Data */
我猜是OMAP-L138_generic_secure_ddr2.ini没有设置DDR2,即使是设置,也没有去重启DDR的状态,所以它可能就成功了,记得有一次就是,在ini中设置完
DDR2参数后,通过串口也不能烧写了,所以.ini也不能设置DDR2,只要设置并重启改变DDR的状态,就不能通过串口烧写进DDR2。
回4:不加gel初始化DDR也能通过DDR压力测试?不可能吧。
这个我就没使用gel文件,也没安装DDR2接口,只是改变了PLL来调节CPU主频,debug下校验了64M空间三次,没有一字节有问题。
总结一下:就是不能设置DDR2接口并改变其状态,如果不设置DDR,起码裸机程序通过.ini生成.bin还能烧写进去DDR,否则根本不行,我现在想确定的是我这种
情况算是硬件设计的问题,还是相关寄存器没设置好?我的NAND FLASH和 DDR SDRAM跟官方的c6748 LCDK用的型号都一样,难道get文件的寄存器设置还要
改变(其实我按手册的试着改了改,感觉跟默认值也没多大改变),不知道这是哪的问题?get文件在文件
夹CCS6.0_APP\ccsv6\ccs_base\emulation\boards\evmc6748\gel\C6748.gel下
baokun hu:
回复 Tony Tang:
Tony Tang
晕,谁知道你是通过这个UART host Boot下载程序运行的啊。你在ini里配置了DDR了而不知道吧。
从前面你定位程序跑的位置来看,你应该是可以连接仿真器来加载程序的啊,为什么不这么做呢?
你说的gel文件是如何都通过不了的到底是什么意思?运行gel出错?那是出了什么错?
你用的gel文件是哪个呢?
baokun hu:
回复 baokun hu:
Tony Tang
收回上面的回答
现在.ini里面PSC配置为LPSCCFG = 0x01060003,不知道是不是已经配置使能了DDR?
还是将LPSCCFG = 0x01060001,设置成SyncReset state,不过这种试过了,结果失败,
如果LPSCCFG = 0x01060003是使能DDR配置的话,那么看来我的.ini参数就是对的,明天可以试试用这个参数来改gel文件。