![]() |
|
||||||||||||||
| . 网站首页 . 新闻 . 新品 . 方案 . 专访 . 活动 . DSP . EDA . 评测 . 技术文库 . 会员区 . 商城 . 服务导航 . 邮购 . 资源 . | ||
|
||
|
|||||
| 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的一些知识吧。 if (index + step >= BK ) index = index + step - BK;
else index = index + step; 其中BK是circular buffer的长度。
现在来看AR5一开始就超过了结束地址时会发生什么情况,例如AR5的初始值是0x5900时,BK仍然是0x0800。通过前面的计算,我们可以得到这个circular buffer的起始地址为0x5000!这样,如果进行*AR5+%的运算的话,AR5会回到地址 0x5900 + 1 - 0x0800 = 0x5101!这里我存放的是CF的磁盘信息。 |
|||||
| 欢迎点击进入:TI德州中文网 (国内唯一针对TI应用的中文技术网站) 文章录入:admin 责任编辑:admin | |||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | |||||
| 最新热点 | 最新推荐 | 相关文章 | ||
| 关于TMS320VC5509笔记文件 C54X的自适应滤波器(LMS)的汇… 汇编代码:C54x的自适应滤波器… |
| 网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告 | 管理登录 | | |||
|
|