This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

DSP C6748的SYS/BIOS程序无法进入main函数

Other Parts Discussed in Thread: OMAP-L138

作为对比,我还写了一个裸机的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

还有rtsc.eclipse.org/.../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里面?非常感谢!

  • 是自己的板子还是EVM板?

    程序是运行在DDR还是片上内存?

    有没有用gel文件初始化DDR?

    main之前的运行步骤对用户来说一般是不用关心的。

  • 是自己的板子,但是是按照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的。

  • baokun hu 说:
    之前试过gel文件好像不行

    为什么不行,gel文件里本来就有DDR配置的,只是根据自己板子上用的DDR型号修改一下参数就可以了。如果DDR不配置,程序怎么能下载到DDR呢?

    baokun hu 说:
    我的boot.c是自动调用TI编译器下的,不是ti.target.rst6000的。

    应该是ti.targets.elf.C674吧。不是rst6000

  • 你说的对,我上面的错误可能就是在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压力测试,那么我这种情况,是电路设计的问题,还是寄存器参数设置的问题,哪个可能大一些?

  • baokun hu 说:
    然后就是会报DDR2 Seting的错误

    这是什么样的错误?

    baokun hu 说:
    但后面提示还是DDR2?data verify 啥的过不去,反正应该还是跟DDR2没设置有关)

    这是在从CCS下载程序时报的错吧。

    baokun hu 说:
    现在我可以在DDR2中跑led裸机程序,

    你确定你的LCD程序是跑在DDR上吗?

    baokun hu 说:
    并且可以通过DDR2的EDMA压力测试,

    不加gel初始化DDR也能通过DDR压力测试?不可能吧。

  • 当然DDR2中可以跑led裸机程序,不是通过加载gel文件看出来的,gel文件是如何都通过不了的(裸机led程序也一样,不行),这个是通过.ini在命令行生成的,然

    后发现程序可以在DDR2里面跑。

    而DDR的压力测试确实通过了,我试了三次都成功了,当然没有使用gel文件初始化CPU,只设置了PLL0,先使CPU时钟低,然后调高cpu时钟,

    不设置DDR2接口,默认的,然后让数据来回在DDR2里面读写,比较核对都没有差错,共三次。

  • 晕,谁知道你是通过这个UART host Boot下载程序运行的啊。你在ini里配置了DDR了而不知道吧。

    从前面你定位程序跑的位置来看,你应该是可以连接仿真器来加载程序的啊,为什么不这么做呢?

    你说的gel文件是如何都通过不了的到底是什么意思?运行gel出错?那是出了什么错?

    你用的gel文件是哪个呢?

  • 回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下

  • Tony Tang 说:

    晕,谁知道你是通过这个UART host Boot下载程序运行的啊。你在ini里配置了DDR了而不知道吧。

    从前面你定位程序跑的位置来看,你应该是可以连接仿真器来加载程序的啊,为什么不这么做呢?

    你说的gel文件是如何都通过不了的到底是什么意思?运行gel出错?那是出了什么错?

    你用的gel文件是哪个呢?

    确定ini里没有配置DDR,否则即使通过串口烧写DDR,也不能成功。

  • Tony Tang 说:

    收回上面的回答

    现在.ini里面PSC配置为LPSCCFG = 0x01060003,不知道是不是已经配置使能了DDR?

    还是将LPSCCFG = 0x01060001,设置成SyncReset  state,不过这种试过了,结果失败,

    如果LPSCCFG = 0x01060003是使能DDR配置的话,那么看来我的.ini参数就是对的,明天可以试试用这个参数来改gel文件。

  • 这是PSC使能DDR的配置:

    你现在是用的加密版本。可能会涉及多方面的问题,比如bootExitType = NONSECURE还是SECUREWITHSK等。在SECUREWITHSK模式下默认是不能访问外设寄存器的。

    如果有进一步问题,最好把你的ini也发上来看一下。

  • Tony Tang 说:

    这是PSC使能DDR的配置:

    你现在是用的加密版本。可能会涉及多方面的问题,比如bootExitType = NONSECURE还是SECUREWITHSK等。在SECUREWITHSK模式下默认是不能访问外设寄存器的。

    如果有进一步问题,最好把你的ini也发上来看一下。

    这是我的.ini文件

    用这个生成.bin文件,可以烧进DDR2运行。

    还有一个问题就是gel文件的PSC1_LPSC_SyncReset(PD0, LPSC_DDR);这句话用不用加,只要加上去这句话,gel就通不过!

    下面是完整的gel文件

  • GEL文件不能初始化的问题,我可能猜到原因了,这是我的另一个帖子https://e2e.ti.com/support/dsp/tms320c6000_high_performance_dsps/f/112/p/576244/2115316#2115316

    至于为何不能进入Main函数,我会再考虑的。

  • 不一定吧,为什么非加密芯片能反复的调用gel配置DDR呢?

  • 你说这个,我也不知道原因是啥,得好好看C6748的芯片手册研究一下,还有CCS软件的复位,仿真器加载gel文件的原理等等。我手上没有非加密的芯片,如果能在非加密芯片的应用程序里面,试一试设置DDR的参数,看看程序还会不会跑就好了,这个应该可以说明一些问题。

  • 我的问题就是没有加密版芯片的板子~~~

  • 好吧。对了,gel文件是怎么加载的,我每次都是先解锁JTAG,然后debug程序,才能选择Tools-》GEL FILE-》LOAD GEL-》  然后到Run下面找到Disconnect Target,然后再Connect Target,最后gel文件自动运行,我这个步骤对不对(对加密芯片来说),非加密芯片加载gel文件又是怎样操作的?

  • Tony Tang

    你不是有非加密的芯片么,如果你有时间的话,能不能试一试运行一个led类的小程序,在程序的开头写一个设置DDR的函数,看看非加密芯片还会不会继续跑led。我猜它会在设置完DDR后挂掉。

  • 在非加密芯片上没有这个问题啊。

  • 你说的没问题是用gel文件设置DDR没问题还是什么没问题?在非加密芯片的应用程序上也可以设置DDR?DEVICE_LPSCTransition(PSCNUM1, LPSC_EMIFB, PD0, PSC_SYNCRESET)这句话也能出现在应用程序上?

  • baokun hu 说:
    在非加密芯片的应用程序上也可以设置DDR?DEVICE_LPSCTransition(PSCNUM1, LPSC_EMIFB, PD0, PSC_SYNCRESET)这句话也能出现在应用程序上?

    是的。经常有人做了这么个没必要的动作,但不会有什么问题,当然前条件是代码不是跑在DDR上。

  • 对,我认为初始化DDR的操作,应该在DSP内部的RAM进行。这样的话,可能通过设置UBL,将UBL代码复制到DSP内部RAM,利用UBL来初始化DDR,再从FLASH读取剩下的代码到DDR里运行,也许还有可能。

    我记得当代码在DDR里面跑时,即使是试图改变PLL1的频率,程序都会出错,而代码跑在内部的SHRAM时就不会出现这种问题,我是用C6748 E试的,这个是年前试验的,好像是这样,当时我想可能是因为DDR正在使用PLL1,所以不能改变PLL1。