当前位置: 首页 > news >正文

STM32软硬件CRC测速对比

硬件CRC配置 以及软硬件CRC速度对比

image-20231223161925821

使用CUBEMX配置默认使用的是CRC32,从库中可以看出这一点

image-20231223162013619

image-20231223162053295

HAL库提供了以下两个计算函数

image-20231223162239058

  • HAL_CRC_Accumulate(CRC_HandleTypeDef *hcrc, uint32_t pBuffer[], uint32_t BufferLength);

    这个函数用于在已有的CRC校验结果的基础上累积(accumulate)新的数据块。如果你需要分多次处理数据,比如将数据分成几个块,然后分别进行CRC计算,最后将这些计算结果合并,就可以使用这个函数。

  • HAL_CRC_Calculate(CRC_HandleTypeDef *hcrc, uint32_t pBuffer[], uint32_t BufferLength);

    这个函数用于对给定的数据块进行一次完整的CRC计算。如果你有整个数据块,并且想要一次性计算CRC,那么可以使用这个函数。

CRC16配置参考:
LINK

软件CRC32

#define CRC32_POLYNOMIAL 0xEDB88320u
//传入参数:                   数据首地址     数据大小
static uint32_t calculate_crc32(const void *data, size_t size) {const uint8_t *byteData = (const uint8_t *)data;uint32_t crc = 0xFFFFFFFFu;for (size_t i = 0; i < size; ++i) {crc ^= byteData[i];for (int j = 0; j < 8; ++j) {crc = (crc >> 1) ^ ((crc & 1) ? CRC32_POLYNOMIAL : 0);}}return ~crc;
}

软硬件测速对比:

平台使用STM32H7,内存使用外扩的SDRAM

对比方法

  • 使用同一块内存区域校验软硬件CRC32,校验前后IO电平翻转,示波器捕获,该方法比较精确

    static int crc32(int argc, char **argv) {if (argc != 3) {fprintf(stderr, "Usage: crc32 <start_address> <size_in_bytes>\r\n");return 1;  // 返回错误码}// 从命令行参数中获取起始地址和大小uint32_t dataStartAddress;size_t dataSizeInBytes;if (sscanf(argv[1], "%x", &dataStartAddress) != 1) {fprintf(stderr, "Invalid start address\r\n");return 1;}if (sscanf(argv[2], "%zu", &dataSizeInBytes) != 1) {fprintf(stderr, "Invalid size\r\n");return 1;}HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET);// 硬件 CRC32size_t hard_crc32Result = HAL_CRC_Calculate(&hcrc,( void *)dataStartAddress,dataSizeInBytes);hard_crc32Result ^= 0xffffffffU;HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);HAL_Delay(10);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET);// 软件 CRC32size_t soft_crc32Result = calculate_crc32((const void *)dataStartAddress, dataSizeInBytes);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);// 输出计算得到的 CRC32 值printf("hard_crc32Result: 0x%x\r\n", hard_crc32Result);printf("soft_crc32Result: 0x%x\r\n", soft_crc32Result);return 0;  // 返回成功码
    }
    

    主要部分

    image-20231223163424233

    128K数据测试结果:

    image-20231223165128463

    image-20231223164425382

    • 硬件测速在6ms左右
    • 软件测速在25ms左右

2M数据测试结构

image-20231223165224031

image-20231223170238833

  • 硬件在100ms左右
  • 软件在410ms左右

总结:

  • 对比结果硬件CRC32比软件CRC32快4倍左右

相关文章:

  • Django之按钮(actions)
  • Linux服务器 部署飞书信息发送服务
  • 信息系统定级与等级测评的具体过程
  • 测试C#使用AForge从摄像头获取图片
  • 轮廓平滑方法
  • 怎么使用5118站长工具API接口处理采集数据
  • 设计模式之-命令模式,快速掌握命令模式,通俗易懂的讲解命令模式以及它的使用场景
  • 每次maven刷新jdk都要重新设置
  • 2023年12月【考试战报】|ORACLE OCP 19C考试通过
  • 关于测试技能和职业规划,ChatGPT这样说
  • Vue3组合式-依赖注入provideinject
  • 前端 JS 安全对抗原理与实践
  • 全方位掌握卷积神经网络:理解原理 优化实践应用
  • 使用 ElementUI 组件构建无边框 Window 桌面应用(WinForm/WPF)
  • (1)(1.11) SiK Radio v2(一)
  • ➹使用webpack配置多页面应用(MPA)
  • AWS实战 - 利用IAM对S3做访问控制
  • HTTP 简介
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • js中的正则表达式入门
  • Vue ES6 Jade Scss Webpack Gulp
  • 当SetTimeout遇到了字符串
  • 基于webpack 的 vue 多页架构
  • 利用DataURL技术在网页上显示图片
  • 使用agvtool更改app version/build
  • 新书推荐|Windows黑客编程技术详解
  • 用Canvas画一棵二叉树
  • 用Python写一份独特的元宵节祝福
  • ​MySQL主从复制一致性检测
  • ​ubuntu下安装kvm虚拟机
  • ​香农与信息论三大定律
  • #NOIP 2014# day.1 T2 联合权值
  • #宝哥教你#查看jquery绑定的事件函数
  • $.proxy和$.extend
  • %check_box% in rails :coditions={:has_many , :through}
  • (TOJ2804)Even? Odd?
  • (多级缓存)缓存同步
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (力扣题库)跳跃游戏II(c++)
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (四)图像的%2线性拉伸
  • (算法)Game
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .gitignore文件_Git:.gitignore
  • .net core 连接数据库,通过数据库生成Modell
  • .Net7 环境安装配置
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .net反混淆脱壳工具de4dot的使用
  • .NET分布式缓存Memcached从入门到实战
  • .NET与 java通用的3DES加密解密方法
  • ;号自动换行
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...
  • [ vulhub漏洞复现篇 ] JBOSS AS 4.x以下反序列化远程代码执行漏洞CVE-2017-7504
  • [20170713] 无法访问SQL Server