数据指针递减功能简化了重叠内存缓冲区的复制操作

描述

利用Maxim高速微控制器系列中的数据指针递减功能,可以简化存储器管理。本应用笔记探讨了该系列微控制器在DS80C400、DS5250、DS89C430和其他产品中使用MOVX操作。示例代码在执行内存传输操作时突出显示 DPTR。

概述

任何微控制器的基本操作之一是能够存储和检索数据到内存/从内存检索数据。MOVX 操作为在 8051 架构上执行此操作提供了一个工具。应用通常需要微控制器在其MOVX地址空间内复制和移动数据存储器块。当源地址和目标地址范围不重叠时,此内存传输操作非常简单,即迭代读/写循环。但是,当范围重叠时,该过程需要一些智能来避免在传输原始数据之前覆盖(损坏)原始数据。本应用笔记将提供两种在源缓冲区和目标缓冲区之间传输数据(重叠)的可能解决方案,并解释Dallas的数据指针递减功能如何简化解决方案。

重叠内存问题

大多数通用内存复制例程不能确定源复制范围和目标复制范围是否重叠。如果在执行复制例程之前不进行此评估,复制到与原始源范围重叠的预期目标范围的字节可能会覆盖和损坏原始数据。图 1 给出了如何发生这种情况的简单说明。可以看出,目标地址范围从地址 = 0104h 开始,这也恰好是原始源字节数组范围内的地址。如前所述,在这种情况下,标准 memcpy() 例程不会生成所需的目标数据数组。当必须为此类传输维护数据完整性时,通常使用 memmove() 操作来确保在复制到目标时不会覆盖源数组中的字节。

Maxim

图1.问题:内存副本重叠。

可能的解决方案

通过一些观察,可以看到源数组(在复制之前)发生的覆盖可以通过几种方式避免:1) 确定重叠并首先传输源缓冲区中与所需目标缓冲区重叠的字节,或 2) 确定重叠并以相反的顺序将字节从源缓冲区传输到目标缓冲区。这两种解决方案如图 2 和图 3 所示。请注意,相反方向的重叠(将源数组复制到内存中较低的目标)对于按地址升序传输数据的标准复制循环没有问题。

给定下面的两个视觉对象(图 2 和图 3),人们还应该能够看到解决方案 #1 在为多个复制操作计算、存储和传递不同的源、目标和长度变量时遭受了额外的开销,而第二个解决方案只能执行此操作一次。

Maxim

图2.重叠内存复制解决方案 #1。

Maxim

图3.重叠内存复制解决方案 #2。

达拉斯硬件简化解决方案 #2

许多达拉斯微控制器产品(附录 A 中提供的列表)为每个可用数据指针实现一个递增/递减 (IDx) 位,以指定“INC DPTR”指令是递增还是递减活动数据指针。使用数据指针递减功能,解决方案 #2 特别容易在 Dallas 产品上实现,允许线性传输并最大限度地减少执行时间。

为了利用数据指针递减功能,应用程序代码首先必须确定源和目标范围是否以及如何重叠,即使数据指针递减功能不可用,也会执行该任务。当检测到有潜在问题的源/目标缓冲区重叠时,数据指针将放置在相应源/目标副本范围的末尾,并将 IDx 位配置为启用数据指针递减模式。下面提供了解决方案 #2 的示例代码。请注意,DPTR 切换(“INC DPS”)和递增/递减(“INC DPTR”)功能包含在代码中,仅用于理解,如果设置了相应的自动切换和/或自动递增/递减位,则可以将其删除。

审核编辑:郭婷

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分