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.

TMS320C5535 eZdsp USB Kit 运行spiflash_writer出错:File Size mismatch

Other Parts Discussed in Thread: TMS320C5535

我在ti下了CSL_USB_IsoFullSpeedExample_Out的例程,在TMS320C5535 eZdsp USB Kit上在线仿真没有问题了,现在想把例程固化到开发板自带的flash中使开发板上电后从flash启动。

我从spectrumdigital的网站上下了eZdsp5535 SPI Boot相关的文件,根据里面的说明,把CSL_USB_IsoFullSpeedExample_Out工程生成的.out文件转成了.bin文件,同时用ccs编译spiflash_writer这个工程成功,开始运行。根据提示,输入之前生成的.bin文件的路径之后(把之前的.bin文件改名为1.bin并复制到工程的Debug文件夹下),程序运行出错,如下图:

在程序中定位到错误如下:

应该是读入到ram中的文件大小跟文件的实际大小不一致,为了更直观的发现问题,我在程序中加了一个标识符以便更好的观察这两个值得大小,修改如下:

文件大小fileSize和读入到ram中的文件大小fileSizeFlag具体的值如下:

很明显读入到ram中的数据远小于文件的大小,请教一下这是什么原因导致的??

是不是ramPtr的定义的大小有问题?

  • 这要看fread()的函数实现,当buffer长度小于lenght时是怎么处理的。直接将buffer ramptr改大试试。目前ramptr是多大?

  • 打开工程研究了一下,   

    ramPtr = (Uint16*)  bootImage;

    Uint8 bootImage[60000]; 这部分是放在.bss段的。

    而实际长度89612是0x15E0C,远远超过了bootImage长度,那么在读入文件里必然会改写后面超出部分的内容,从map文件看,不仅会修改bss里的其它内容,还会影响到.text段。

    其实这里好的办法是用动态分配的方式获取buffer。上面这种固定大小的不是很保险。

  • Hi Tony,

    谢谢你的回复!

    按照你的提示我尝试修改了一下程序,动态分配bootImage的内存,如下图所示:

    如你所说,bootImage占用的内存为0x15E0C,我看了一下工程默认设置(.cmd文件中),-heap段的大小为0x2000,应该不能满足需求,在这种情况下运行程序,在按照提示输入.bin文件名称后,程序会一直卡在open file这一步,如下图:

    我尝试着在.cmd文件里把heap改大(改为0x20000),运行结果如下

    请教一下,这是因为什么原因导致的?是我这种修改heap的方法不对还是修改的值过大超过了一定的范围(也尝试改小过,但结果都跟heap为0x2000时一样,程序会开在open file那一步)??

    另外,还想请教一下,除了这种方法是否还有其他方法往flash里烧录程序?

    再次感谢!

    eric

  • #1. 你前面没改heap时,malloc返回肯定是NULL啊,后面还按这个NULL(0)赋给ramPtr,那再往下执行不就修改0地址的内容了吗。调用malloc肯定要检查返回值看是否成功啊。后面程序都跑飞了(因为被改写),当然只显示Opening file...就没有了。

    #2.  源代码在手上,单步跟踪一下不就知道问题出在哪一步退出(exit)了吗

    #3. 你要愿意,那就一边读文件,一边写flash,而不是读完整个文件到RAM,这样大小就好控制了。(自己实现)

  • Hi Tony,

    关于修改heap,请教一下,我那种修改.cmd的方法对吗?

    另外,我查了一下,heap的大小可以在工程的 properties中设置,如下图:

    这两种方法都对吗?

  • 两种都可以。效果是一样的。

  • Hi Tony,

    在Properties中将heap大小设置为0x24000后,如下图:

    重新编译工程,没有error和warning,单步运行,程序最终停在fileSizeFlag = fread(ramPtr, 1, fileSize, fPtr)处,见下图:

    错误提示如下:

    这种情况会是什么原因导致的?

  • 上面提示没有任何问题,还在调用RTS库的memcpy函数进行内存拷贝,应该是这个文件比较长,所以read文件要花的时间长一些,你把断点打在这个fread之后,等一段时间,看能否跳出来。

    只要前面malloc返回是个正常的地址,这个fread 文件IO操作不应该会有问题的。这就是个标准C的文件操作函数。

  • Hi Tony,

    按照你说的,我在fread函数后打了一个断点,等了一段时间(超过30min),程序扔然没有运行到断点出,暂停后出现如下提示:

  • 可是这个提示还是不能说明跑出问题了。

    你可以暂停下来看buffer里的内容修改到哪了,通过buffer里的内容的变化看是不是还一直有递增的读进来。如果还在读,则说明就是读的慢。fread就是CCS通过仿真器读PC上的文件,这本身确实比较慢,而且跟所用的仿真器的速度也相关。如果你用的是XDS100,那就更慢了。

  • Hi Tony,

    刚开始学习,对ccs的编译环境还不是很熟悉,怎么查看buffer里面的内容呢?

    我将ramPtr选为Add Watch Expression,结果如下:

  • 在CCS的memory browser里输入地址查看。

  • Hi Tony,

    还有一个问题想请教!

    在工程里有两个cmd文件——C5535.cmd和lnkx.cmd,这两个有什么区别?我在debug时应该使用哪个呢?

    现在使用lnkx.cmd这个时,工程可以正常编译,使用c5535.cmd时,编译出错

    这个提示,我理解是.sysmem的大小需要0x24000,而我现在分配的内存不够,但是我现在实际分配的内存是比0x24000大:

    我这样分配内存的方法对吗?这个问题应该从哪方面解决呢?

  • Hi Tony,

    按照你说的方法,我尝试着在Memory Browser中查看ramPtr的数据变化,关于ramPtr的地址,我是这样确定的,在ramPtr = (Uint16*)  bootImage;后加一个断点,此时观察ramPtr的值,如下:

    此时我认为ramPtr的起始值为0x002962@Data,于是在Memory Browser中输入这个地址值,而后让程序继续运行,得到结果如下:

    这个值似乎是不对的,此时0x002962内存值是filename的值(是程序要读取的文件的文件名的存放地址),而不是我期望的ramPtr的值。

    难道我得到的ramPtr的值不对吗??