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一直为空的原因是什么?