TI中文支持网
TI专业的中文技术问题搜集分享网站

请教:关于DSP/BIOS初始化问题

TI工程师:

    您好!

环境: 我使用的板子是ezdspc5515, CCS是5.21, DSP/BIOS是5.41.2.

问题: 在使用c5505evm_pg20.gel的时候,程序仿真运行正常,在取消c5505evm_pg20.gel后,仿真找不到main入口。

详述:

c5505evm_pg20.gel在目标板连接CCS时实现了一些初始化函数,主要为MAP映射和PLL设置。

以下为c5505evm_pg20.gel 初始化部分:

      /* The OnTargetConnect() function is executed when the target is connected. */
      OnTargetConnect()
     {
          GEL_Reset();//这个函数我没有找到原型
          C5505_MapInit();//此函数为内存配置
          ProgramPLL_100MHz_clksel0();//设置100M的PLL
          GEL_TextOut("Target Connection Complete.\n");
      }

我对比了一下内存配置部分。DRAM,SRAM,VEC基本是相同,

我程序的时钟初始化如下:

 *(ioport volatile unsigned*)0x0001 = 0x000E;//ENable MPORT
  asm("   idle");
 //CLOCK INIT for 100M HZ
 SYS_PCGCR1 = 0x0;//
    SYS_PCGCR2 = 0x0;// Enable clocks to all peripherals
 *(ioport volatile unsigned *) 0x1c1f = 0x0;     // bypass PLL
 *(ioport volatile unsigned *) 0x1c20 = 0x8be8;
 *(ioport volatile unsigned *) 0x1c21 = 0x8000;
 *(ioport volatile unsigned *) 0x1c22 = 0x0806;
 *(ioport volatile unsigned *) 0x1c23 = 0x0000;
 // Busy wait until TESTLOCKMON is high or timeout
    while ( ((*(ioport volatile unsigned *) 0x1c22) & 8) == 0) ;
 *(ioport volatile unsigned *) 0x1c1f = 0x1; // Switch to PLL clk

程序在进入DEbug的时候,是处于RUN的状态,找不到MAIN函数的开始地址。我手动暂停DEBUG,汇编程序就卡在如下部分循环

940082:   4b08_4b0c                B #0x94008e || B #0x940092
940086:   4b10_4b14                B #0x94009a || B #0x94009e
94008a:   4b18_4b1c                B #0x9400a6 || B #0x9400aa
94008e:   4b20_4b24                B #0x9400b2 || B #0x9400b6
940092:   4b28_4b2c                B #0x9400be || B #0x9400c2
940096:   4b30_4b34                B #0x9400ca || B #0x9400ce
94009a:   4b38_4b3c                B #0x9400d6 || B #0x9400da
94009e:   4b40_4b44                B #0x940062 || B #0x940066
9400a2:   4b48_4b4c                B #0x94006e || B #0x940072
9400a6:   4b50_4b54                B #0x94007a || B #0x94007e
9400aa:   4b58_4b5c                B #0x940086 || B #0x94008a
9400ae:   4b60_4b64                B #0x940092 || B #0x940096
9400b2:   4b68_4b6c                B #0x94009e || B #0x9400a2
9400b6:   4b70_4b74                B #0x9400aa || B #0x9400ae

猜测:

不知道是什么原因会造成不使用GEL文件仿真时,找不到MAIN函数的入口?

程序比繁杂,Release模式下 out文件大小为760K,会不会因为程序太大造成内存分配出错?或者是因为BIOS初始化部分出错?

多谢解惑!

zhihui xuan:

在我之前的旧程序,就是没有BIOS之前的程序,使用同样的初始化代码,脱离GEL也能正常仿真,烧进FLASH也能正常引导。

在加入了DSP/BIOS后,脱离GEL就不能运行了。

 

zhihui xuan:

回复 zhihui xuan:

再补充一下:

当我的程序进入DEBUG的时候,我进行软件复位,可以找到main的入口地址,但是run了几个函数之后,就发生了堆栈溢出。

溢出的汇编程序:

0110ab:   01005f                   RPTCC #95, AC0 == #00110ae:   1c0005                   XOR #0,T1,AC00110b1:   b800                     POP dbl(*SP(#00h))//在次数堆栈操作后,很多数据会出错。0110b3:   eb3108014676             MOV AC0,dbl(*(#014676h))

 

zhihui xuan:

回复 zhihui xuan:

继续补充:

今天又仔细看了下TCF配置文件,发现BIOS在运行main前就已经做了初始化部分,我的使用的平台是   utils.loadPlatform("ti.platforms.evm5505");

时钟为100M , 全局设置如下图:

我把程序开头部分的初始化程序去除掉,然后重新编译仿真,结果第一次运行成功了。

但是,我之后又重新仿真了几次,却又失败了。

不知道问题是出在上面地方,非常不解。

 

 

zhihui xuan:

回复 zhihui xuan:

今天在网络找到关于GEL的介绍,发现GEL_RESET被我忽略掉了。

(2)OnTargetConnect()函数

推荐:

绝对最小的系统初始化处理,保证CCS在目标处理器上处于一种可信赖的状态。例如:禁止看门狗时钟、DSP复位结束。

每一次和目标处理器建立连接时都调用OnTargetConnect()函数。

OnTargetConnect()

{

//placecriticaltargetinitializationstepshere

GEL_Reset();

init_emif();

}

对某些平台,必须调用GEL_Reset()函数使得CCS处于一种“Good”状态,可以通过测试来确定是否需要调用GEL_Reset()函数。应该尽可能的降低GEL startup functions复杂度——包括减少GEL_Reset()的调用。

没有找到GEL_reset的具体代码,不知道是不是这个原因造成 的影响。

zhihui xuan:

回复 zhihui xuan:

继续来补充:

问题的现象发生了改变,在仿真寻找main入口已经没有问题了。

我在程序初始化部分又添加了外设复位的程序,初始化程序如下:

 *(ioport volatile unsigned*)0x0001 = 0x000E;//ENable MPORT  asm("   idle");  *(volatile ioport Uint16*)(0x1c02) = 0x0;//  *(volatile ioport Uint16*)(0x1c03) = 0x0;// Enable clocks to all peripherals *(ioport volatile unsigned *) 0x1c1f = 0x0;     // bypass PLL *(ioport volatile unsigned *) 0x1c20 = 0x8be8; *(ioport volatile unsigned *) 0x1c21 = 0x8000; *(ioport volatile unsigned *) 0x1c22 = 0x0806; *(ioport volatile unsigned *) 0x1c23 = 0x0000; // Busy wait until TESTLOCKMON is high or timeout  while ( ((*(ioport volatile unsigned *) 0x1c22) & 8) == 0) ;  *(ioport volatile unsigned *) 0x1c1f = 0x1; // Switch to PLL clk

  *(ioport volatile unsigned *)0x1C04 = 0x02;  *(ioport volatile unsigned *)0x1C05 = 0x00fb;  for (a=0; a<500; a++);

仿真是没有问题出现,但是固化到flash中还是不能正常运行,通过跟踪,找到了程序卡死的位置:

在读SD卡部分,

 mmcStatus = CSL_MMCSD_BUSY_STATE; do {    status = hMmcsd->mmcRegs->MMCST1;//读取MMC状态寄存器    mmcStatus |= status & CSL_MMCSD_FIFO_EMPTY;

    if((status & CSL_MMCSD_BUSY_STATE) == 0)    {     mmcStatus &= ~CSL_MMCSD_BUSY_STATE;    } } while(((mmcStatus & CSL_MMCSD_FIFO_EMPTY) != CSL_MMCSD_FIFO_EMPTY) ||              ((mmcStatus & CSL_MMCSD_BUSY_STATE) == CSL_MMCSD_BUSY_STATE));//判断FIFO是否为空或者是否BUSY

读到状态寄存器,FIFO和BUSY都为零,一直死循环在这里。

在程序运行中FIFO 一直为空,仿真非固化的程序时候(未使用GEL),FIFO是一直不为空的状态。

不知道FIFO一直为空的原因是什么?

赞(0)
未经允许不得转载:TI中文支持网 » 请教:关于DSP/BIOS初始化问题
分享到: 更多 (0)