这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » FPGA » CCS优化编译引起的问题

共1条 1/1 1 跳转至

CCS优化编译引起的问题

工程师
2015-01-03 20:36:17     打赏
  今天编写了一段程序验证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,小系统部分验证完成,下一步调试图像采集部分:)

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]