STM32学习之硬件FPU(原理篇)
📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨
📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】
📢:文章若有幸对你有帮助,可点赞 👍 收藏 ⭐不迷路🙉
📢:内容若有错误,敬请留言 📝指正!原创文,转载注明出处
文章目录
- FPU介绍
- 启用FPU的优势
- 配置步骤
- 开启和关闭FPU的区别
- 1. 指令集差异
- 2. 代码大小差异
- 3. 寄存器使用差异
FPU介绍
在Keil中,“floatingpoint hardware”指的是浮点运算硬件,也就是硬件浮点运算单元(FPU,Floating - Point Unit)。
硬件浮点运算单元是集成在处理器芯片内的专门用于处理浮点运算的硬件电路。与通过软件模拟实现浮点运算不同,硬件FPU能够以更高的速度和效率执行,诸如加法、减法、乘法、除法等浮点运算操作。
启用FPU的优势
- 项目配置选项
在Keil的项目配置中,通常会有关于“floatingpoint hardware”的相关设置选项。例如,当你使用支持硬件FPU的ARM Cortex - M系列处理器(如Cortex - M4、Cortex - M7等)时,在Keil的工程选项中可以选择是否启用硬件FPU。
● 启用硬件FPU:选择启用后,编译器会生成能够充分利用硬件FPU的代码,从而提高浮点运算的性能。例如,在进行大量浮点数据处理的应用中,启用硬件FPU可以显著缩短运算时间。
● 不启用硬件FPU:若不启用,编译器会采用软件模拟的方式来实现浮点运算,这会导致运算速度变慢,但适用于一些对性能要求不高或者硬件不支持FPU的场景。 - 代码生成与优化
● 当在Keil中启用“floatingpoint hardware”时,编译器会针对硬件FPU进行代码优化。它会生成专门的指令来调用硬件FPU执行浮点运算,这些指令能够充分发挥硬件FPU的并行处理能力和高速运算特性。
● 相反,如果未启用硬件FPU,编译器会使用一系列的整数运算指令来模拟浮点运算,这不仅会增加代码的执行时间,还可能会占用更多的内存空间。
配置步骤
以下是在Keil中针对支持硬件FPU的ARM Cortex - M处理器启用硬件FPU的一般步骤:
- 打开Keil项目,右键点击项目名称,选择“Options for Target”。
- 在弹出的对话框中,选择“C/C++”选项卡。
- 在“Target”区域中,找到“Floating point hardware”选项,选择相应的硬件FPU类型(如“Use Floating point hardware”)。
- 点击“OK”保存配置。
通过以上设置,Keil编译器会根据所选的硬件FPU类型生成相应的代码,从而充分利用硬件FPU的性能优势。
开启和关闭FPU的区别
在Keil中开启和未开启FPU(浮点运算单元)硬件,生成的反汇编文件会存在显著区别,下面从指令集、代码大小、性能相关指令等方面为你详细分析:
1. 指令集差异
开启FPU硬件
当在Keil中开启FPU硬件支持时,编译器会生成使用硬件FPU指令集的代码。这些指令专门用于处理浮点运算,具有较高的执行效率。例如,Cortex - M4和Cortex - M7内核支持单精度(VFPv4 - SP)或双精度(VFPv4 - DP)浮点运算指令,常见的硬件FPU指令包括:
● VMOV:用于在浮点寄存器和通用寄存器之间移动数据。
● VADD.F32:执行单精度浮点加法运算。
● VMUL.F32:执行单精度浮点乘法运算。
以下是一个简单的C代码示例及其开启FPU硬件后可能对应的反汇编代码:
float add_floats(float a, float b) {return a + b;
}
开启FPU硬件后,反汇编代码可能包含类似如下的FPU指令:
VMOV S0, R0 ; 将参数a从通用寄存器R0移动到浮点寄存器S0
VMOV S1, R1 ; 将参数b从通用寄存器R1移动到浮点寄存器S1
VADD.F32 S0, S0, S1 ; 执行单精度浮点加法运算
VMOV R0, S0 ; 将结果从浮点寄存器S0移动到通用寄存器R0
BX LR ; 返回
未开启FPU硬件
若未开启FPU硬件,编译器会使用软件模拟的方式来实现浮点运算。此时,反汇编代码中不会出现硬件FPU指令,而是使用一系列的整数运算指令来模拟浮点运算。这些整数运算指令通常需要更多的步骤和周期来完成相同的浮点运算任务,执行效率较低。例如,可能会使用乘法、除法、移位等整数运算来模拟浮点运算的指数和尾数操作。
2. 代码大小差异
开启FPU硬件
由于使用了专门的硬件FPU指令,代码可以更简洁地实现浮点运算,因此生成的反汇编代码通常会相对较小。硬件FPU指令能够直接完成复杂的浮点运算操作,无需使用大量的整数运算指令来模拟。
未开启FPU硬件
软件模拟浮点运算需要使用大量的整数运算指令来实现浮点运算的各个步骤,如指数计算、尾数调整等。这会导致生成的反汇编代码规模增大,占用更多的程序存储空间。
3. 寄存器使用差异
开启FPU硬件
会使用专门的浮点寄存器(如Cortex - M系列中的S0 - S31)来存储和处理浮点数据。反汇编代码中会频繁出现对这些浮点寄存器的操作指令。
未开启FPU硬件
主要使用通用寄存器(如R0 - R15)来模拟浮点运算,通过整数运算指令在通用寄存器之间进行数据处理。
相关文章:
STM32学习之硬件FPU(原理篇)
📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…...
QEMU源码全解析 —— 块设备虚拟化(15)
接前一篇文章:QEMU源码全解析 —— 块设备虚拟化(14) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM源码解析与应用》 —— 李强,机械工业出版社 特此致谢! QEMU初始化阶段的块设备虚拟化 本回解析virtio_blk_device_realize函数中的virtio_a…...
Web3(阶段一:入门)——哈希算法
一、简述 哈希算法(Hash Algorithm)是一种将任意长度的输入数据转换为固定长度输出(哈希值)的数学函数。其核心作用是通过不可逆的计算生成唯一标识数据的 “数字指纹”,广泛应用于数据完整性验证、密码学、区块链等领…...
高频面试题(含笔试高频算法整理)基本总结回顾63
干货分享,感谢您的阅读! (暂存篇---后续会删除,完整版和持续更新见高频面试题基本总结回顾(含笔试高频算法整理)) 备注:引用请标注出处,同时存在的问题请在相关博客留言…...
如何深入理解C#中的备忘录模式(Memento Pattern)设计模式
在软件开发中,设计模式是一种解决特定问题的通用方法,而备忘录模式(Memento Pattern)是其中一种用于保存对象状态的结构型设计模式。它允许你在不暴露对象内部结构的情况下,保存和恢复对象的状态。本文将深入探讨C#中的…...
存储引擎 / 事务 / 索引
1. 存储引擎 MySQL 中特有的术语。 (Oracle 有,但不叫这个名字) 是一种表存储 / 组织数据的方式 不同的存储引擎,表存储数据的方式不同 1.1 查看存储引擎 命令: show engines \g(或大写:G…...
药店管理系统
https://download.csdn.net/download/weixin_57836618/90572873 软件架构 Java SpringBoot Mybatis/Mybatis-plus Mysql 项目功能说明 促销管理:零售出库、零售退货采购管理:采购订单、采购入库、采购退货销售管理:销售订单、物流信息、…...
Kafka 的发展历程
Kafka 作为一个高性能的分布式消息流平台,从诞生到现在已经有了长足的发展,经历了多个版本的迭代。下面是 Kafka 的 发展历史、版本迭代 以及 新特性 的概述。 1. Kafka 的诞生与早期发展 2010年:Kafka 由 LinkedIn 的工程师 Jay Kreps、Ne…...
PowerBI 之DAX 3:文本、信息、财务、时间智能函数
文章目录 一、文本函数1.1 FORMAT函数1.1.1 数字格式1.1.2 日期/时间格式1.1.3 自定义格式 1.2 CONCATENATE与CONCATENATEX1.2.1 返回多个类别名称1.2.2 返回多个类别的名称和数据,并排序 1.3 使用SEARCH进行模糊查找 二、信息函数2.1 ISINSCOPE 三、财务函数3.1 PV…...
GESP C++三级 知识点讲解
C编程三级标准 (一)知识点详述 (1)了解二进制数据编码:原码、反码、补码。 (2)掌握数据的进制转换:二进制、八进制、十进制、十六进制。 (3)掌握位运算:与(&)、或(|)、非(~)、异或(^)、左移(<<)、右移(>>)的基本使用方法及原理。 (4)了解算法的概念与描述&…...
如何访问和使用Sora:OpenAI视频生成模型的完整指南
OpenAI的Sora作为革命性的视频生成模型,能够根据文本提示创建长达60秒的高质量视频内容。本教程将详细介绍目前Sora的使用方法和访问途径。 一、Sora当前访问状态(2024年3月更新) 目前Sora仍处于有限访问阶段,OpenAI采取了分阶段…...
MyBatis 分页插件使用教程
MyBatis 分页插件使用教程 MyBatis 是一款优秀的持久层框架,但原生的 MyBatis 并不支持分页查询。为了简化分页操作,MyBatis 官方和第三方提供了多种分页插件,最常用的就是 MyBatis-Plus 的分页插件。本文详细介绍 MyBatis-Plus 分页插件的使…...
OpenDriveVLA:通过大型视觉-语言-动作模型实现端到端自动驾驶
25年3月来自慕尼黑工大和慕尼黑大学的论文“OpenDriveVLA: Towards End-to-end Autonomous Driving with Large Vision Language Action Model”。 OpenDriveVLA,一种专为端到端自动驾驶而设计的视觉-语言-动作 (VLA) 模型。OpenDriveVLA 以开源预训练大型视觉-语言…...
深入探究C++ 运算符重载:以日期类为例
目录 前言 一、运算符重载基础 1.1 运算符重载原理 1.2 示例代码 二、赋值运算符重载 2.1 赋值运算符重载格式 2.2 代码实现 2.3 注意事项 三、前置和后置重载 3.1 前置重载 3.2 后置重载 四、日期类的完整实现 4.1 获取某月天数 4.2 完整类定义 五、总结 前言 …...
2024第十五届蓝桥杯大赛软件赛省赛Java大学B组 报数游戏 类斐波那契循环数 分布式队列 食堂 最优分组 星际旅行 LITS游戏 拼十字
目录 A 报数游戏 B 类斐波那契循环数 C 分布式队列 D 食堂 E 最优分组 F 星际旅行 G LITS 游戏 H 拼十字 今天心血来潮把去年的题目又做了一遍... 本人去年大一 拿的是全省第五进的国赛 而如今的已经是一名 codeforces 1500 分的入门级别的算竞选手了 下周又是蓝桥杯…...
4月6日随笔
一觉起来十点多 其实六点和九点分别醒过一次。 起来之后点了个侍卫草推荐的猪排饭,真的巨好吃,猪排很脆,溏心蛋也很香 但是因为酒店十二点半要退房,就匆匆吃完了猪排和一半米饭就走了 今天下午在科技楼写了一会作业,…...
[GN] sigrokdecode 模块学习指南 --- 准备阶段
系列文章目录 文章目录 系列文章目录前言指南libsigrokdecode 学习一、构建环境安装libsigrokdecode安装 sigrok-cli(命令行工具)安装 PulseView(图形界面)关联 libsigrokdecode完整验证参数解释 二、BUG解决1. 确保编译时启用了 …...
【力扣hot100题】(056)电话号码的字母组合
依旧是很经典的回溯。 记得当初做这题想了半天电话号码怎么存储,用哈希表就可以解决。 class Solution { public:vector<string> result;string digits;int loc0;unordered_map<char,string> dictionary{{2,"abc"},{3,"def"},{4,…...
kotlin,数字滚动选择
用国内的通义灵码和codegeex都没有弄出来,最后只得用墙外的chatgpt才弄出一个满意的。kotlin真的有点难,好在有AI,让学习没这难了。 package com.example.mynumsetimport android.os.Bundle import androidx.activity.ComponentActivity imp…...
Flask学习笔记 - 数据库
Flask 数据库操作 Flask 提供了多种方式来与数据库进行交互,包括直接使用 SQL 和利用 ORM(对象关系映射)工具,如 SQLAlchemy。 使用SQLAlchemy创建和管理数据库:使用 db.create_all() 创建表。CRUD 操作:…...
学透Spring Boot — 015. 自废武功——关闭自动配置
这是我的《学透Spring Boot》专栏的第15篇文章,了解更多请移步我的专栏:CSDN Postnull的专栏《学透Spring Boot》 目录 遇到的问题 分析日志 自动配置的过程 解决报错 方法1:添加数据库配置 方法2:关闭JPA自动配置 总结 遇…...
DeepSeek本地部署(Ollama)
1. Ollama 安装 Ollama 官网地址: https://ollama.com/安装包网盘地址: https://pan.baidu.com 2. Deepseek 部署 根据自己电脑配置和应用需求选择不同模型,配置不足会导致运行时候卡顿。 版本安装指令模型大小硬盘(存储)显卡…...
Python如何将已经安装的包导出为 .whl 文件以便离线使用
1、确认已安装的依赖包 pip list --formatfreeze > requirements.txt2、下载但不安装依赖包 # 单个包使用 pip download 依赖包名称 -d ./offline_packages# 多个包使用 pip download -r requirements.txt -d ./offline_packages使用离线包的时候,还需要确保在与…...
TypeScript学习第十六篇 - interface和type的区别?
在 TypeScript 中,interface 和 type 都用于定义自定义类型,但它们有一些关键区别: 1. 主要区别 1.1. 语法差异 interface 使用 interface 关键字。 interface Person {name: string;age: number; } type 使用 type 关键字。 type Pers…...
vue-axios跨域问题
vue-axios跨域问题 跨域原因现象前端解决方案 跨域原因 跨域:浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域。 在前后端分离的模式下,前后端的域名是不一致的,此时就会发生跨域…...
PyCharm中虚拟环境.venv搭建详解
PyCharm中创建、配置和管理虚拟环境,可以确保每个项目都有独立的依赖项,从而提高开发效率和项目的可移植性。接下来介绍一下pycharm虚拟环境的目录介绍以及搭建和管理办法。 虚拟环境目录是PyCharm中用于存储虚拟环境相关文件和配置的文件夹。PyCharm虚…...
小刚说C语言刷题——第16讲 switch语句
在日常生活中,我们经常会遇到多分支的情况。当分支较多时,我们可以用嵌套的if-else语句。但是这样会让结构显得混乱。这个时候我们可以考虑用switch语句。 1.语法格式 switch (表达式) { case 常量表达式1: 语句1; break; case 常量表达式…...
关联容器-模板类pair数对
关联容器 关联容器和顺序容器有着根本的不同:关联容器中的元素是按关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的。 关联容器支持高效的关键字查找和访问。 两个主要的关联容器(associative-container),set和map。 set 中每个元素只包…...
Linux:基础IO---inode
文章目录 1. inode1.1 未被打开的文件1.2 认识硬件1.3 对磁盘进行逻辑抽象(解构)1.4 文件系统 序:在上一个章节缓冲区中,我通过将几个实例进行对比,引出了C语言级别即用户级别的缓冲区的概念,将用户级缓冲与…...
蓝桥杯_LITS游戏 俄罗斯方块 模拟 暴力 搜索 DFS 剪纸 枚举
从格子图的第一个格子开始,依次尝试放置 L、I、T、S 形状。在放置每个形状时,检查当前位置是否合法(是否在格子图范围内且没有被其他形状占据)。如果合法,我们就标记当前位置为已占据,并递归地尝试放置下一…...
蓝桥杯基础算法-字符串与集合
对集合的考察集中在集合的特性和功能。 set-唯一性 list-有序性 集合元素的个数 思路分析:set的唯一性,取出重复的子串 eg: 下标0截取的范围:【0,最大下标】 下标1截取的范围:【1,最大下标…...
ChatGPT 4:解锁AI文案、绘画与视频创作新纪元
文章目录 一、ChatGPT 4的技术革新二、AI文案创作:精准生成与个性化定制三、AI绘画艺术:从文字到图像的神奇转化四、AI视频制作:自动化剪辑与创意实现五、知识库与ChatGPT 4的深度融合六、全新的变革和机遇《ChatGPT 4 应用详解:A…...
【C++】多态详解
文章目录 一、多态的概念二、多态的效果及实现1.多态的效果2.实现多态有两个必须条件3.虚函数4.虚函数的重写/覆盖5.多态场景下两个很坑的选择题6.重载/重写/隐藏的对比 三、虚函数重写的一些其他知识1.协变(了解)2.析构函数的重写3.检测是否重写&#x…...
Python与CATIA集成实现拓扑面颜色映射——图像驱动自动化设计实战
一、技术背景与需求场景 在汽车/航空等高端制造领域,常需将二维图像的颜色特征映射到三维模型的拓扑表面。传统手动操作耗时且易出错,本文通过Python-CATIA集成技术实现像素级颜色自动映射,可应用于: 涂装方案可视化验证材料纹理…...
Qt中的多种输出方式,信号与槽的基本使用
完成Hello World可以通过很多控件实现 如采用编辑框来完成hello world 编辑框分为单行编辑框----QLineEdit 和多行编辑框---QTextEdit 采用单行编辑框,创建项目后,展开forms文件夹,双击ui文件进入 qt designer设计页面 找到line edit 拖到页…...
C语言查漏补缺:基础篇
1.原理 C语言是一门编译型计算机语言,要编写C代码,C源代码文本文件本身无法直接执行,必须通过编译器翻译和链接器的链接,生成二进制的可执行文件,然后才能执行。这里的二进制的可执行文件就是我们最终要形成的可执行程…...
【ElasticSearch】
目录 1. 基本知识1.1 restful语法1.2 内部基于_version乐观锁控制1.3 restful 批量(bulk)增删改 2. 分布式及容错机制2.1 ElasticSearch分布式基础1 ES分布式机制2 rebalance3 master节点4 节点对等 2.2 分片shard、副本replica机制2.3 es容错机制 3. 文…...
投资策略分析:十年年化32.2%,夏普比1.31的动量斜率策略(策略源码+数据下载)
原创内容第848篇,专注智能量化投资、个人成长与财富自由。 竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。 回首向来萧瑟处,归去,也无风雨也无晴。 苏轼被贬黄州期间,借雨中徐行的意象,表达对人生荣辱得…...
httpx模块的使用
在使用requests模块发起请求时,报以下错误,表示服务器有可能使用的是http2.0协议版本,导致requests无法爬取。 此时就可以使用httpx模块爬取。 先下载httpx模块: pip install httpx[http2]然后用httpx发起请求: impo…...
【文献研究】含硼钢中BN表面偏析对可镀性的影响
《B 添加钢的溶融 Zn めっき性に及ぼす BN 表面析出の影響》由JFE公司田原大輔等人撰写。研究聚焦 B 添加钢在低露点退火时 BN 形成对镀锌性的影响,对汽车用高强度钢镀锌工艺优化意义重大。通过多组对比实验,结合多种分析手段,明确了相关因素…...
Logo语言的区块链
Logo语言的区块链探索 引言 随着科技的快速发展,区块链作为一种颠覆传统的分布式账本技术,正逐渐被许多行业所接受和应用。其核心特性在于去中心化、透明性、不可篡改性和安全性,这些特性使得区块链在金融、供应链、医疗、版权保护等领域显…...
3D Gaussian Splatting as MCMC 与gsplat中的应用实现
3D高斯泼溅(3D Gaussian splatting)自2023年提出以后,相关研究paper井喷式增长,尽管出现了许多改进版本,但依旧面临着诸多挑战,例如实现照片级真实感、应对高存储需求,而 “悬浮的高斯核” 问题就是其中之一。浮动高斯核通常由输入图像中的曝光或颜色不一致引发,也可能…...
车载ECU底软测试:方法与技术的深度解析
文章目录 引言车载 ECU 底软概述测试目标测试范围功能验证性能与实时性安全性与可靠性兼容性测试测试工具与技术方案分层测试方法与技术实现1. 单元测试(Unit Testing)2. 集成测试(Integration Testing)3. 系统测试(System Testing)4. 安全认证测试(Certification Testi…...
机器视觉3D中激光偏镜的优点
机器视觉的3D应用中,激光偏镜(如偏振片、波片、偏振分束器等)通过其独特的偏振控制能力,显著提升了系统的测量精度、抗干扰能力和适应性。以下是其核心优点: 1. 提升3D成像精度 抑制环境光干扰:偏振片可滤除非偏振的环境杂光(如日光、室内照明),仅保留激光偏振信号,大…...
25.6 多模态AI类型系统实战:日均10万请求下的99.99%可靠性保障与10倍性能提升
多模态AI类型系统实战:日均10万请求下的99.99%可靠性保障与10倍性能提升 关键词:类型标注实践, Pydantic 数据建模, 多模态数据处理, CogView 集成, CharGLM 对话引擎 1. 类型系统在 AI 应用中的核心价值 在复杂 Agent 系统中,类型标注是保障代码健壮性的第一道防线。当我…...
单链表的实现 | 附学生信息管理系统的实现
目录 1.前言: 2.单链表的相关概念: 2.1定义: 2.2形式: 2.3特点: 3.常见功能及代码 : 3.1创建节点: 3.2头插: 3.3尾插: 3.4头删: 3.5尾删: 3.6插入…...
【CMake】《CMake构建实战:项目开发卷》笔记-Chapter11-实践:基于onnxruntime的手写数字识别库
第11章 实践:基于onnxruntime的手写数字识别库 读者已经跟着本书实践了很多零零散散的实例,应该能够熟练使用CMake来构建C和C程序了吧!不过,前面的实例往往都是针对某个特定功能编写的,我们可能很难将它们综合起来实…...
微软主要收入云计算,OFFICE,操作系统和游戏10大分类
微软2024年主要收入10大分类是哪些,再加一列赚钱比例 微软 2024 财年的财务数据可能尚未完全统计完成,且官方可能没有正好按 10 大分类公布主要收入情况。不过,依据微软过往的业务板块和常见的收入来源,下面是模拟的表格,赚钱比例…...
PDF预览-搜索并高亮文本
在PDF.js中实现搜索高亮功能可以通过自定义一些代码来实现。PDF.js 是一个通用的、基于Web的PDF阅读器,它允许你在网页上嵌入PDF文件,并提供基本的阅读功能。要实现搜索并高亮显示文本,你可以通过以下几个步骤来完成: 1. 引入PDF…...
随笔1 认识编译命令
1.认识编译命令 1.1 解释gcc编译命令: gcc test1.cpp -o test1 pkg-config --cflags --libs opencv 命令解析: gcc:GNU C/C 编译器,用于编译C/C代码。 test1.cpp:源代码文件。 -o test1:指定输出的可执行文件名为t…...