嵌入式平台memcpy实验总结

2023-11-07

1 概述:

最近项目中性能比较吃紧,经过跟踪发现,memcpy操作的性能存在一定问题;于是,做了一些尝试去验证一些想法,记录一下;

环境: MDK530,Cortex M0芯片,主频80MHz左右,

2 优化手段:

在优化之前,我们要先确定基本的性能,于是写了一个简单的测试程序:

void my_memcpy(u8 *dest, u8* src, u16 len) {
    u16      j;
    for(j=0; j<len; j++) {
        dest[j] = src[j];
    }
}

main()
{
    -------省略-------
    for(i=0; i<10; i++)
    {
        non_os_enter_critical();
        led2_times(1);                      //开始计时
        my_memcpy(dst_buffer, src_buffer, 255);
        led2_times(2);                      //结束计时
        non_os_exit_critical();
        osDelay(1);
    }
    -------省略-------
}

验证执行时间的方法,调用led2_times(1)在led2 IO上输出一个方波,led2_times(2)输出2个方波,通过逻辑分析仪或者示波器就可以测量这2个波形的间隔得出时间;就上述代码,测得时间为:

大约花了159us;

2.1 将代码执行放到RAM中

1, 将my_memcpy 便于到指定段中 "RAM_CODE"中,可以使用#pragma arm section code 的方式,也可以使用

在KEIL中可以通过__attribute__((at(address)))的方式将变量放到指定的位置。
通过__attribute__((section(“name ”)))的方式将变量或者函数放到指定的位置。

#pragma arm section code="RAM_CODE"
void my_memcpy(u8 *dest, u8* src, u16 len) 
{
    u16      j;
    
    for(j=0; j<len; j++)
    {
        dest[j] = src[j];
    }
}
#pragma arm section

2 在SCT文件中设置“RAM_CODE“段放到RAM的执行区域中;参考修改:

    RW_IRAM1 0x20000200 0x00003F00  {  ; RW data
        *.o (RAM_CODE)
        .ANY (+RW +ZI)
    }

最后重新编译,测量执行时间缩减为63.9us, 效果比较明显,RAM的执行速度明显高于Flash中执行速度;

2.2 关于标准库memcpy

如下测试代码1,src_buffer,dst_buffer均采用4字节对齐;

main()
{

    u8      src_buffer[0x104];
    u8      dst_buffer[0x104];
    -------省略-------
    for(i=0; i<10; i++)
    {
        non_os_enter_critical();
        led2_times(1);                      //开始计时
        memcpy(dst_buffer, src_buffer, 255);
        led2_times(2);                      //结束计时
        non_os_exit_critical();
        osDelay(1);
    }
    -------省略-------
}

测试结果为:

 只需要46.74us

稍微修改一下测试代码2,不让dst_buffer进行4字节对齐

memcpy(dst_buffer+1, src_buffer, 255);

测试结果:

 需要187.08us, 性能约等于单个字节逐个拷贝的情况;

因此得出结论:

使用库memcpy 情况下,

          如果目标地址和源地址均采用4字节对齐,性能会有明显提升;

          如果目标地址和源地址均不是4字节对齐,性能较差;                             

2.3 使用汇编实现memcpy

    不叙述具体过程,直接说结果,效果比较好!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入式平台memcpy实验总结 的相关文章

  • ARM 中只有两个操作数的 ADD 或 SUB

    我正在学习ARM汇编语言 我读过 ADD 应该有 3 个操作数 然而 我见过很多案例 现实中只有两种 例如 STR R1 SP 0x20 var 1C LDR R1 a lua 0x1DE4E6 MOVS R0 R4 haystack AD
  • 可以使用Visual Studio 2012构建ARM桌面程序吗?

    我正在使用 Visual Studio 2012 beta 我的桌面 win32 程序在 ARM 架构中编译得很好 升级到 Visual Studio 2012 RC 后 编译器无法工作并出现以下错误 不支持为 ARM 平台编译桌面应用程序
  • 有没有办法在 Xcode 4 中为 ARM 而不是 Thumb 进行编译?

    如果有很多浮点运算正在进行 Apple 建议针对 ARM 进行编译 而不是针对拇指进行编译 我的整个应用程序几乎是一个大型浮点运算 iOS 应用程序开发工作流程指南中是这样说的 iOS 设备支持两种指令集 ARM 和 Thumb Xcode
  • 分析 Cortex-M7 (stm32f7) 上的 memcpy 性能

    简洁版本 从 GNU ARM 工具链中提取的 memcpy 的性能指标在 ARM Cortex M7 上对于不同的副本大小似乎差异很大 即使复制数据的代码始终保持不变 这可能是什么原因造成的 长版 我是使用 GNU Arm 工具链 11 2
  • 如何使用 Neon SIMD 将无符号字符转换为有符号整数

    如何转换变量的数据类型uint8 t to int32 t使用霓虹灯 我找不到执行此操作的任何内在因素 假设您想要将 16 x 8 位整数的向量转换为 4 个 4 x 32 位整数的向量 您可以通过首先解压缩为 16 位 然后再次解压缩为
  • 当复制联合对象时,是否会创建成员子对象?

    当访问联合体的另一个成员时 C 标准过去对发生的情况保持沉默 但这一点已被修复 以解释允许对联合对象的成员访问是为了分配给该尚不存在的对象 这会神奇地通过分配给对象或其成员之一来创建对象 本质上 成员访问运算符返回未来对象的承诺 您必须将其
  • 在linux x86平台上学习ARM所需的工具[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个 x86 linux 机器 在阅读一些关于 ARM 的各种信息时 我很好奇 现在我想花一些时间学
  • 在 Intel 机器上构建 Apple Silicon 二进制文件

    如何在 macOS 11 Intel 上编译 C 项目以在 Silicon 上运行 我当前的构建脚本很简单 configure make sudo make install 我尝试过使用 host and target标志与aarch64
  • 如何模拟ARM处理器运行环境并加载Linux内核模块?

    我尝试加载我的vmlinux into gdb并使用 ARM 内核模拟器 但我不明白为什么我会得到Undefined target command sim 这是外壳输出 arm eabi gdb vmlinux GNU gdb GDB 7
  • 交叉编译armv5,但它创建v7二进制文件

    我设法为arm926ej s创建了一个目标文件我在 qemu 上使用 Debian Arm arm linux gnueabi gcc 4 4 static O c mcpu arm926ej s hello c o hello root
  • 英特尔的最后分支记录功能是英特尔处理器独有的吗?

    最后分支记录是指存储与最近执行的分支相关的源地址和目标地址的寄存器对 MSR 的集合 它们受英特尔酷睿 2 英特尔至强和英特尔凌动处理器系列的支持 http css csail mit edu 6 858 2012 readings ia3
  • ARM NEON 矢量化失败

    我想在 ARM cortex a9 上启用 NEON 矢量化 但在编译时得到以下输出 未矢量化 不支持相关 stmt D 14140 82 D 14143 77 D 14141 81 这是我的循环 void my mul float32 t
  • 需要一些建议来开始在 ARM(使用 Linux)平台上编程

    我 也许 很快就会在托管 Linux 发行版的 ARM 平台上工作 我不知道哪个发行版 我知道该项目涉及视频流 但我无法告诉你更多信息 其实我只收到通知 还没见到任何人 我从来没有在这样的平台上工作过 所以我的想法是在项目开始之前进行测试
  • 让 TensorFlow 在 ARM Mac 上使用 GPU

    我已经安装了TensorFlow在 M1 上 ARM Mac 根据这些说明 https github com apple tensorflow macos issues 153 一切正常 然而 模型训练正在进行CPU 如何将培训切换到GPU
  • 错误:-march= 开关的值错误

    我写了一个Makefile 但无法让它工作 我有一个选项应该选择编译到哪个处理器 然而 当我跑步时make从命令行它说 tandex tandex P 6860FX emulators nintendo sdks 3DS SDK HomeB
  • C 中的 CUDA:如何使用 cudaMemcpyAsync 修复错误 11

    我目前正在尝试使用 CUDA 运行一个简单的多 GPU 程序 它的基本作用是将一个包含一些虚拟数据的大型数组复制到 GPU GPU 进行一些数学计算 然后将结果数组复制回来 我在 VS2017 的输出中没有收到任何错误 但我设置的一些错误消
  • 出现段错误后 Memcpy 完成

    我有一个连接到主机的 PCIe 端点设备 ep 端点 的 512MB BAR 已进行 mmapped 并使用 memcpy 来传输数据 Memcpy 相当慢 2 5s 当我没有映射所有 BAR 100 字节 而是运行 memcpy 获取完整
  • C6387 用于 memcpy、strcpy 和 strcpy_s

    看来我无法摆脱C6387的警告 typedef struct HashBind char cKeyIdentifier void vValue HashBind HashBind strNewBind malloc sizeof HashB
  • 使用arm-linux-gnueabi-gcc为Android交叉编译静态C hello world

    我想使用 arm linux gnueabi gcc 从 C 构建静态 hello world 而不是使用 NDK 独立工具链或 Codesourcery 在Ubuntu中 我做了以下事情 sudo apt get install gcc
  • 2022年Android CPU架构分布(armeabi-v7a vs arm64-v8a)

    有没有关于 2022 年 Android 设备上的架构使用情况的官方信息 我有一个支持armeabi v7a 和arm64 v8a 的应用程序 我想要放弃对armeabi v7a的支持并且仅支持 64 位设备 arm64 v8a 但我找不到

随机推荐

  • jdk和java什么关系_Java中JDK和JRE的区别是什么?它们的作用分别是什么?

    JDK和JRE是Java开发和运行工具 其中JDK包含了JRE 但是JRE是可以独立安装的 它们在Java开发和运行的时候起到不同的作用 1 JDK JDK是Java Development Kit的缩写 是Java的开发工具包 主要包含了
  • http的get请求如何传递一个对象

    原文链接 https www longkui site program frontend httpget 4366 0 前言 以前前台往后台对象时 后台都用POST请求 前台有时候通过拼接参数传参 会显得比较长 所以考虑前台GET请求能否直
  • Linux (Centos)下pip命令出现错误bash: pip: 命令未找到..解决方案

    今天在服务器上跑程序 提示没有XX模块 我就用pip install XX 安装了一下 结果竟然提示pip命令找不到了 pip3能安装 但是pip3 list一看 里面都没有torch包 之前应该都是用pip安装的才对 去网上找了一通 发现
  • 【算法】分支定界

    一 基本描述 类似于回溯法 也是一种在问题的解空间树T上搜索问题解的算法 但在一般情况下 分支限界法与回溯法的求解目标不同 回溯法的求解目标是找出T中满足约束条件的所有解 而分支限界法的求解目标则是找出满足约束条件的一个解 或是在满足约束条
  • React组件的生命周期

    1 组件生命周期概述 什么是组件的生命周期 组件从被创建到挂载到页面中运行 再到组件不用时卸载的过程 这个过程就叫做组件的生命周期 react在组件的生命周期中提供了一系统的钩子函数 可以让开发者在函数中注入代码 这些代码会在适当的时候运行
  • java ip解析_java域名解析

    DNS原理 http amon org dns introduction html 根域 就是所谓的 根域服务器只是具有13个IP地址 但机器数量却不是13台 因为这些IP地址借助了 域的划分 根域下来就是顶级域或者叫一级域 每个域都会有域
  • [element-ui] el-dropdown下拉菜单禁用项没有鼠标悬浮禁用样式

    鼠标移入出现禁用样式 如下图 就是我们想要的效果
  • Blender3.5 - 快捷键

    图形移动 框选 gt 刷选 gt 套索选择 W 游标 相当于形状的中心点 shitf 空格 空格 游标回到世界中心 shift C 移动 移动 G 随意移动 选中图形 G 沿 X 轴移动 选中图形 G X 沿 Y 轴移动 选中图形 G Y
  • 动态内存(智能指针与new)

    文章目录 一 引言 二 动态内存管理 1 使用动态内存的原因 2 智能指针 2 1 shared ptr 2 1 1 shared ptr定义与初始化 2 1 2 shared ptr操作 2 1 3 make shared操作 2 1 4
  • 【剑指 Offer】(四种解法)数组中重复的数字

    剑指 Offer 03 数组中重复的数字 题目描述 在一个长度为 n 的数组 nums 里的所有数字都在 0 n 1 的范围内 数组中某些数字是重复的 但不知道有几个数字重复了 也不知道每个数字重复了几次 请找出数组中任意一个重复的数字 示
  • 微信公众号与企业号的TOKEN验证与使用

    上图是 微信客户端与微信服务端与公众号 企业号的服务器的原理架构 首先 我们如果使用应用服务器 则需要告诉微信服务器 它在哪里 所以TOKEN就是一个标识的作用 TOKEN是一个参数 是一个自定义的值 负责标识微信服务器和应用服务是不是一一
  • unity狼模型、山谷模型

    unity狼模型 山谷模型 模型如下图 下载链接在文末 点我下载资源 https download csdn net download weixin 43474701 60362226
  • 如何使用文件作为参数,调用接口并获取返回数据?

    String path picture 20220420 1 doc 指定文件的路径 或相对路径 File file new File path System out println 文件名 file getName 文件绝对路径 file
  • 百度AI攻略:增值税发票识别

    1 功能描述 在日常工作中经常要用到增值税发票 在使用的时候需要对增值税发表进行检查 验真 录入等很多工作 使用增值税发票识别技术 实现对增值税普票或专票各字段信息的识别和录入 可应用于企业税务核算及内部报销等场景 能够有效减少人工核算工作
  • Tensorflow与Python、CUDA、cuDNN的版本对应表

    1 官方配置 官网只有英文版的才更新到了TensorFlow 2 12 0 中文版只更新到了2 6 0 所以要想看到下面的内容需要进入官网之后将语言更改为英文 经过测试的构建配置 Linux CPU Version Python versi
  • Spring Cloud简介:构建分布式微服务架构的利器

    标题 Spring Cloud简介 构建分布式微服务架构的利器 摘要 本文介绍了Spring Cloud作为构建分布式微服务架构的利器 我们将深入探讨Spring Cloud的重要组件和功能 并通过代码示例展示Spring Cloud的强大
  • 非线性控制1——经典控制和现代控制的区别

    经典控制和现代控制的区别
  • 三次登录验证和验证码功能实现

    三次登录验证和验证码功能实现 最近手头上的事忙的差不多了 就想着自己写写小demo玩一下 结果突然看到我们旧系统的登录好像有点拉胯 然后就自己写了个小demo 指不定哪天就用上了呢 一 pom文件 首先当然是pom文件啦 这里写的比较简单
  • chatgpt赋能python:Python中的三角函数:了解sin、cos和tan

    Python中的三角函数 了解sin cos和tan Python是一种强大的编程语言 可以应用于处理各种数据类型和数学计算 包括三角函数 在这篇文章中 我们将深入了解Python中的三角函数 包括sin cos和tan 什么是三角函数 在
  • 嵌入式平台memcpy实验总结

    1 概述 最近项目中性能比较吃紧 经过跟踪发现 memcpy操作的性能存在一定问题 于是 做了一些尝试去验证一些想法 记录一下 环境 MDK530 Cortex M0芯片 主频80MHz左右 2 优化手段 在优化之前 我们要先确定基本的性能