网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 61IC中国电子在线 >> DSP >> C5000文章 >> C54X系列 >> 文章正文
  C54x的Circular Addressing Mode           ★★★ 【字体:
C54x的Circular Addressing Mode
作者:Free    文章来源:本站原创    点击数:    更新时间:2008-2-29    

今天发现正在开发中的一个Mp3播放器在播放到某个特定的文件的特定的地方时,出现CF卡读取错误。经过调试,发现在CF卡读取发生错误时,储存CF的磁盘信息的内存区域遭到破坏。这看起来像是缓冲区溢出错误,冲掉了储存CF信息的内存。通过设置Break on Data Write断点,我找到了冲掉CF信息的罪魁祸首:Mp3解码汇编程序中的一段。奇怪的是,这段程序所要存取的内存地址大约是0x5800 - 0x5a00之间,而CF信息保存在0x5100处,如何会出现这种跳跃式的存取的呢?经过跟踪这段汇编程序,终于让我确定了Bug的根源:Circular Addressing Mode。

出错误的汇编语句是:

mvdd    *AR3+,*AR5+0%

寄存器AR5指向地址0x5800之后的某段内存。这里因为要使用AR0做为AR5的单步增量,而在使用Dual Data Memory Operands时,只能通过*AR5+0%来使用AR0,%表示circular modify. 其实这段程序是不用circular modify的,因此寄存器BK应该设置为0。然而,上面程序运行时,BK的值为0x0800。为什么BK的值为0x0800会出现BUG呢?为了搞清楚这个问题,还是先来复习一下Circular Addressing Mode的一些知识吧。

为了快速地循环使用某段内存,C54x提供了这种存取模式。在这种模式下,当指针超过了circular buffer的结束地址时,硬件会自动地把指针调回到buffer的起始位置。用C语言来说就是:

if (index + step >= BK ) index = index + step - BK;
else index = index + step;

其中BK是circular buffer的长度。

在硬件实现上,是这样决定circular buffer的起始和结束地址的。

  1. 将BK中从高位起第一个不为0的bit位之上的位都设置为1,其余为都设置为0,我们称这个数为mask。例如0x0800的mask就是0xf000。
  2. 将这个mask与存取circular buffer的寄存器位与运算的结果就是circular buffer的起始地址。例如如果AR5的值为0x5123的话, 0x5123 & 0xf000 = 0x5000, 所以起始地址是0x5000。
  3. 将起始地址与BK进行位或运算,得到结束地址(circular buffer不包括结束地址),在这个例子中结束地址为:0x5000 | 0x0800 = 0x5800。

现在来看AR5一开始就超过了结束地址时会发生什么情况,例如AR5的初始值是0x5900时,BK仍然是0x0800。通过前面的计算,我们可以得到这个circular buffer的起始地址为0x5000!这样,如果进行*AR5+%的运算的话,AR5会回到地址 0x5900 + 1 - 0x0800 = 0x5101!这里我存放的是CF的磁盘信息。

之所以会出现这样的错误,是因为我武断地认为如果AR5的初始值是0x5900, BK为0x0800的话,那么circular buffer的地址范围是0x5800 - 0x6000(不包括0x6000)。如果真是这样,就不会出现上述的缓冲器溢出问题了。但是硬件的实现和我的想象是完全不一样的,所以要好好阅读文档资料,不能自己想当然。

               欢迎点击进入:TI德州中文网   (国内唯一针对TI应用的中文技术网站)    文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章: 没有了
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    关于TMS320VC5509笔记文件
    C54X的自适应滤波器(LMS)的汇…
    汇编代码:C54x的自适应滤波器…
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    站长:61IC 湘ICP备05002478号