0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

星星科技指导员 来源:ADI 作者:ADI 2023-06-13 16:33 次阅读

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

概述

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

重叠内存问题

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

wKgZomSIKeiAb0EBAAAsOUagSpY621.gif

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

可能的解决方案

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

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

wKgZomSIMdKASOf3AABcysiuIug055.png

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

wKgaomSIKeuAc2bgAAApC56uu3E450.gif

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

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

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

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

审核编辑:郭婷

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

    关注

    48

    文章

    7528

    浏览量

    151216
  • 存储器
    +关注

    关注

    38

    文章

    7468

    浏览量

    163698
  • 内存
    +关注

    关注

    8

    文章

    3009

    浏览量

    73957
收藏 人收藏

    评论

    相关推荐

    缓冲区的解释

    (FIFO,First In First Out)的,NI的数据采集卡应该是都有板载的缓冲区,区别在于缓冲区的大小而已。然后当板载缓冲区中的数据
    发表于 04-07 15:56

    STM32进阶之串口环形缓冲区实现

    两个指针,一个指向列队头,一个指向列队尾。指向列队头的指针(Head)是缓冲区可读的数据,指向列队尾的指针(Tail)是
    发表于 06-08 14:03

    STM32串口环形缓冲区的实现

    一个数组,只不过有两个指针,一个指向列队头,一个指向列队尾。指向列队头的指针(Head)是缓冲区可读的数据,指向列队尾的指针(Tail)是
    发表于 10-16 11:40

    什么是缓冲区功能

    嗨,大家好:我是FPGA设计的新手。什么是缓冲区功能。如果我没有在应该使用它们的地方使用缓冲区,我可能面临什么样的问题。以上来自于谷歌翻译以下为原文hi guys: I'm a new
    发表于 01-24 09:44

    基于ARM和FPGA的环形缓冲区接口设计方案

    来设计的。在本方案中,FPGA存储器空间包括两个部分:寄存器空间和数据缓冲区空间。寄存器空间用于设置各种读写的参数,包括缓冲区读写指针缓冲区
    发表于 05-30 05:00

    CPU与GPU维护数据结构来保证环形缓冲区的正确工作

    CPU 和 GPU 将各自维护一些数据结构来保证环形缓冲区的正确工作。这些 数据结构有缓冲区的基地址,缓冲区大小,写
    的头像 发表于 03-30 15:01 6444次阅读
    CPU与GPU维护<b class='flag-5'>数据</b>结构来保证环形<b class='flag-5'>缓冲区</b>的正确工作

    环形缓冲区的实现原理

    在通信程序中,经常使用环形缓冲区作为数据结构来存放通信中发送和接收的数据。环形缓冲区是一个先进先出的循环缓冲区,可以向通信程序提供对
    的头像 发表于 03-22 10:03 7518次阅读
    环形<b class='flag-5'>缓冲区</b>的实现原理

    缓冲区是啥意思 STM32串口数据接收之环形缓冲区

    完成。 缺点: ①缓冲数据组数一定,且有多变量,代码结构不太清晰。 ②接收数据长度可能大于数组大小,也可能小于数组大小。不灵活,需要接收数据很长时容易出错,且
    的头像 发表于 07-22 15:33 1.1w次阅读

    STM32串口数据接收 --环形缓冲区

    STM32串口数据接收 --环形缓冲区环形缓冲区简介  在单片机中串口通信是我们使用最频繁的,使用串口通信就会用到串口的数据接收与发送,环形缓冲区
    发表于 12-28 19:24 30次下载
    STM32串口<b class='flag-5'>数据</b>接收 --环形<b class='flag-5'>缓冲区</b>

    消除IoT上的缓冲区溢出漏洞

    黑客可以使用堆栈缓冲区溢出将可执行文件替换为恶意代码,从而允许他们利用堆内存或调用堆栈本身等系统资源。例如,控制流劫持利用堆栈缓冲区溢出将代码执行重定向到正常操作中使用的位置以外的位置
    的头像 发表于 10-12 15:25 909次阅读
    消除IoT上的<b class='flag-5'>缓冲区</b>溢出漏洞

    消除物联网上的缓冲区溢出漏洞

      黑客可以使用堆栈缓冲区溢出将可执行文件替换为恶意代码,从而使他们能够利用堆内存或调用堆栈本身等系统资源。例如,控制流劫持利用堆栈缓冲区溢出将代码执行重定向到正常操作中使用的位置以外
    的头像 发表于 12-02 11:57 1006次阅读

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

    利用Maxim高速微控制器系列中的数据指针递减功能,可以简化存储器管理。本应用笔记探讨了该系列微控制器在DS80C400、DS5250、DS
    的头像 发表于 02-20 09:27 472次阅读
    <b class='flag-5'>数据</b><b class='flag-5'>指针</b><b class='flag-5'>递减</b><b class='flag-5'>功能</b><b class='flag-5'>简化了</b><b class='flag-5'>重叠</b><b class='flag-5'>内存</b><b class='flag-5'>缓冲区</b>的<b class='flag-5'>复制</b><b class='flag-5'>操作</b>

    C++环形缓冲区设计与实现

    Buffer) 环形缓冲区(Circular Buffer),也被称为循环缓冲区(Cyclic Buffer)或者环形队列(Ring Buffer),是一种数据结构类型,它在内存中形
    的头像 发表于 11-09 11:21 1943次阅读
    C++环形<b class='flag-5'>缓冲区</b>设计与实现

    操作系统不同的缓冲区概念

    就来区分一下不同的缓冲区概念(主要针对类unix平台)。 用户进程和操作系统的关系,首先我用一张图来解释“用户进程和操作系统的关系: 这是一个计算机系统运行时的简化模型,我们把所有运行
    的头像 发表于 11-10 10:38 1245次阅读
    <b class='flag-5'>操作</b>系统不同的<b class='flag-5'>缓冲区</b>概念

    内存缓冲区内存的关系

    内存缓冲区内存之间的关系是计算机体系结构中一个至关重要的方面,它们共同协作以提高数据处理的效率和系统的整体性能。
    的头像 发表于 09-10 14:38 505次阅读