|
载入中...
黑夜里, |
|
CCS优化编译引起的问题 作者 张进东 日期 2007-5-23 22:14:00
今天编写了一段程序验证FLASH读写,编译后下到DSP板上执行,发现写FLASH没有成功。下面是一段写FLASH的函数:
void DM642_FLASH_write(Uint32 src, Uint32 dst, Uint32 length) { Uint8 *psrc, *pdst; Uint32 i; /* Establish source and destination */ psrc = (Uint8 *)src; pdst = (Uint8 *)dst; for (i = 0; i < length; i++) { /*Program one 8-bit word*/ *((Uint8 *)EVMDM642_FLASH_CTLAAA) = 0xaa; //A句 *((Uint8 *)EVMDM642_FLASH_CTL555) = 0x55; //B句 *((Uint8 *)EVMDM642_FLASH_CTLAAA) = 0xa0; //C句 *pdst = *psrc; //D句 /* Wait for operation to complete*/ while(1) if (*pdst == *psrc) break; pdst++; psrc++; } *((Uint16 *)EVMDM642_FLASH_BASE) = 0xf0; } 主程序中调用函数如下: DM642_FLASH_write(0x80000000, 0x90000100, 0xffff); 该段代码将SDRAM中开始的64K数据写入FLASH中。看程序没有问题,而板上的CPLD是经过仿真验证的。为定位问题,测量FLASH的WE脚和一根数据线。 代码前3句(A、B、C)三句是FLASH写“解锁”(29LV320:BYTE模式)。每个循环应当是四次写操作,而在示波器上只有三个低电平。然后单步执行,在B、C、D句执行后都能看到WE脚上的低电平。而一次循环结束后不是返回执行A句而是返回到B句,A句根本就没有执行。看编译后的代码,A句没有对应的代码。于是认为应当是CCS编译器的问题。突然想到A句、C句目的地址相同,也许是编译过程中自动优化把A句省掉了。于是在CCS编译器中寻找编译优化的相关配置,之后在project->Build Options的Compiler栏里找到了对应项--“Opt Level”,默认优化等级为3级(-o3),将此项改为“None”。重新编译程序,将程序下载到DM642单板,运行即看到A句能够执行,FLASH写读均正常。 将问题记录到日志,一方面如果以后再遇到此问题可以找回解决方法,另一方面也会对一些和我一样对DSP编程不熟悉的朋友有一些帮助(也可以通过命令对单句进行禁止编译优化来解决该问题)。 至今天中午,由偶单独开发的DM642硬件系统32MB SDRAM(133M)、GPIO、FLASH均验证OK,小系统部分验证完成,下一步调试图像采集部分:)
这是嵌入式系统常有问题,所有编译器的优化问题. |
载入中...
About Me载入中...
Category载入中...
newlog载入中...
Recent Comments载入中...
Recent Message载入中...
login载入中...
Search载入中...
Statistics载入中... |
|
个人网页,不含转载内容 |