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

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

3天内不再提示

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

星星科技指导员 来源:ADI 作者:ADI 2023-02-20 09:27 次阅读

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

概述

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

重叠内存问题

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

pYYBAGPyzJeAYCPfAAAv0b2KhgU996.gif?imgver=1

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

可能的解决方案

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

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

pYYBAGPyzJqAa12aAAAzdK8MWKs171.gif?imgver=1

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

pYYBAGPyzJ2AMXODAAAs1AkUu4E644.gif?imgver=1

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

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

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

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

审核编辑:郭婷

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

    关注

    48

    文章

    6813

    浏览量

    147673
  • Maxim
    +关注

    关注

    8

    文章

    859

    浏览量

    86650
  • 存储器
    +关注

    关注

    38

    文章

    7154

    浏览量

    162023
收藏 人收藏

    评论

    相关推荐

    缓冲区的解释

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

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

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

    杰杰带你解读【机智云】环形缓冲区源码

    的函数,就是初始化了环形缓冲区的头尾指针,这个函数的通用性很强,因为很多时候不只创建一个缓冲区。每个缓冲区的首地址都保存在了rbBuff,这
    发表于 07-17 14:58

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

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

    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

    怎么把数据从SFR缓冲区复制到RAM?

    假设我想把数据从SFR缓冲区复制到RAM,我能说服MeMCPY做正确吗?例如,如预期的那样,将垃圾复制到临时文件中,同时从SFR中复制。为了
    发表于 09-17 08:08

    如何把I2C数据复制缓冲区的中断中去?

    ascb_i2c_sstat_wr_cmplt状态指示来处理消息。这是可行的。然而,当我登记的定制中断处理程序和过程thescb_intr_slave_i2c_write_stop中断源,有接收缓冲区中没有数据。有没有办法把数据
    发表于 10-15 10:47

    环形缓冲区的设计分享!

    数据在读取和写入的时候都可以在这个缓冲区里循环进行,程序员可以根据自己需要的数据大小来决定自己使用的缓冲区大小。 环形缓冲区,顾名思义这个
    发表于 10-28 23:29

    可变大小缓冲区内存分配技术

    我有一个FIFO类,我已经在几个项目中使用。我一直定义了一个结构,它具有固定大小的缓冲区和头和尾的指针。我希望能够通过在不同的结构中分配不同大小的缓冲区来提高这个类的通用性。例如,用于Telnet
    发表于 04-09 18:00

    环形缓冲区简介

    STM32串口数据接收 --环形缓冲区环形缓冲区简介  在单片机中串口通信是我们使用最频繁的,使用串口通信就会用到串口的数据接收与发送,环形缓冲区
    发表于 08-17 06:56

    缓冲区溢出的危害及避免缓冲区溢出的三种方法

    1. 蠕虫病毒简介2. 缓冲区溢出3. 缓冲区溢出举例4. 缓冲区溢出的危害5. 内存在计算机中的排布方式6. 计算机中越界访问的后果7. 避免缓冲
    发表于 03-02 07:55

    缓冲区溢出的危害及避免缓冲区溢出的三种方法

    1. 蠕虫病毒简介2. 缓冲区溢出3. 缓冲区溢出举例4. 缓冲区溢出的危害5. 内存在计算机中的排布方式6. 计算机中越界访问的后果7. 避免缓冲
    发表于 03-30 14:01

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

    利用Maxim高速微控制器系列中的数据指针递减功能,可以简化存储器管理。本应用笔记探讨了该系列微控制器在DS80C400、DS5250、DS
    的头像 发表于 06-13 16:33 290次阅读
    <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>