【复旦微FM33 MCU 外设开发指南】外设篇1——硬件除法器
前言
本系列基于复旦微FM33LC0系列单片机的DataSheet编写,旨在提供一些开发指南。
本文章及本系列其他文章将持续更新,本系列其它文章请跳转【复旦微FM33 MCU 外设开发指南】总集篇
本文章最后更新日期:2024/10/24
文章目录
- 前言
- 用途
- 工作流程
- 寄存器
- 耗时对比
- 注意事项
- 原子操作
- 效率
- 数据类型
用途
对于M0内核的MCU而言,其内核是没有除法指令的。
当语法中出现除法操作,是借助C语言函数库来完成除法操作的。这种操作比较耗时
FM33LC0配备有硬件除法器外设HDIV,用于帮助软件加速除法运算。
工作流程

寄存器

HDIV->END :32bit 有符号被除数
HDIV->SOR :16bit 有符号除数
HDIV->QUOT :32bit 有符号商
HDIV->REMD :16bit 有符号余数
HDIV->SR:

耗时对比
FM33LC0的DataSheet写明,一次除法运算需要8个24MHz周期。
在48MHz的主频,编译器优化等级-O0的情况下:
C语言使用for循环进行100万次除法操作耗时4728ms,用硬件除法器耗时1044ms。
(由于使用了1ms的定时器中断计时,实际计算时间会比这个更短)
硬件除法器测试代码如下:
static uint32_t beginTime = 0, endTime = 0; // 起始时间和结束时间
uint32_t x = 214748364; // 被除数,必须加volatile,否则会被编译器优化
uint16_t y = 5635; // 除数,必须加volatile,否则会被编译器优化
volatile uint32_t z = 0; // 商,必须加volatile,否则会被编译器优化RCC->PCLKCR1 |= 0x1u << 9; // 使能硬件除法器时钟
beginTime = GetTimingCounter(); // 开始计时for(uint32_t i = 0; i <1000000; i++)
{
#if 1/* 使用硬件除法器 */HDIV->END = x; // 被除数HDIV->SOR = y; // 除数while( HDIV->SR & 0x01 ); // 等待计算完成z = HDIV->QUOT; // 商
#else/* 直接做除法运算 */z = x / y;
#endif
}endTime = GetTimingCounter(); // 结束计时
注意事项
原子操作
在使用硬件除法器时务必注意加入原子操作。
在使用HDIV时,需要先写入被除数寄存器HDIV->END,再写入除数寄存器HDIV->SOR,当写入除数寄存器后会自动开始运算。
如果模块A使用硬件除法器做除法,在写入被除数寄存器HDIV->END后,还没来得及写入除数寄存器HDIV->SOR,被一个高优先级的模块B抢占,而模块B也使用硬件除法器做除法,将导致:当程序返回到模块A时,HDIV->END寄存器的值其实是模块B的被除数,从而得到错误的结果。
效率
虽然操作硬件除法器比直接进行除法更加省时间,但平时我们都会将硬件除法器封装为一个单独的函数,在这种情况下:
1:函数中应当使用原子操作并操作硬件除法器,以防止运算过程被打断。在这种情况下,考虑到函数的调用时间、开关中断的时间,硬件除法器节省的时间优势会降低。
2:硬件除法器的HDIV->SR寄存器可以指示当前是否在运行过程中,但如果在填写HDIV->END和HDIV->SOR寄存器后,使用while去一直查询该寄存器来判断是否运算完成是很耗费时间的。所以可以直接加入若干个__nop()。
数据类型
硬件除法器的数据寄存器数据类型都是有符号类型的,使用时请注意类型要匹配。
相关文章:
【复旦微FM33 MCU 外设开发指南】外设篇1——硬件除法器
前言 本系列基于复旦微FM33LC0系列单片机的DataSheet编写,旨在提供一些开发指南。 本文章及本系列其他文章将持续更新,本系列其它文章请跳转【复旦微FM33 MCU 外设开发指南】总集篇 本文章最后更新日期:2024/10/24 文章目录 前言用途工作流…...
在元神操作系统启动时自动执行任务脚本
1. 背景 本文主要介绍让元神操作系统启动时自动执行任务脚本的方法,适用于无人化任务执行目的。将任务脚本及相关的应用程序准备好之后,把装有元神操作系统的U盘插入目标电脑,然后打开电脑电源就会自动完成所设置的任务。 2. 方法 &#x…...
JAVA学习-练习试用Java实现“判断是否为等边三角形的方法”
问题: 定义一个三角形类(Triangle),包含三个边长(a, b, c)属性,并实现一个判断是否为等边三角形的方法。 解答思路: 下面是一个简单的 Triangle 类定义,其中包含了三个…...
Leetcode 140 Word Break II
题意:给定一个string以及一个wordDict,要求返回一个vector<string> ,这个vector中的string都是word Dict中的组合 Input: s “catsanddog”, wordDict [“cat”,“cats”,“and”,“sand”,“dog”] Output: [“cats and dog”,“cat sand dog”…...
文理学院数据库应用技术实验报告0
文理学院数据库应用技术实验报告0 实验内容 打开cmd,利用MySQL命令连接MySQL服务器。 mysql -u root -p查看当前MySQL服务实例使用的字符集(character)。 SHOW VARIABLES LIKE character_set_server;查看当前MySQL服务实例支持的字符序(collation)。 SHOW VARIABLES LIKE c…...
Bootstrap 4 按钮
Bootstrap 4 按钮 Bootstrap 4 是一个流行的前端框架,它提供了大量的组件和样式,用于快速开发响应式和移动设备优先的网页。在本文中,我们将重点讨论 Bootstrap 4 中的按钮组件,包括它们的基本用法、样式选项和自定义方法。 基本按钮 在 Bootstrap 4 中,创建一个基本按…...
【笔记】LLM位置编码之标准位置编码
标准位置编码 起源原理证明:对于任何固定的偏移量 k k k, P E p o s k PE_{posk} PEposk可以表示为 P E p o s PE_{pos} PEpos的线性函数。计算 P E p o s k 与 P E p o s PE_{posk} 与PE_{pos} PEposk与PEpos的内积结论 通俗理解缺点 起源 由…...
环 境 配 置
01 Ubuntu18.04中QT环境 1. 下载安装包 官网 http://download.qt.io/archive/qt/5.9/5.9.1/qt-opensource-linux-x64-5.9.1.run 国内镜像服务器 https://mirrors.tuna.tsinghua.edu.cn/qt/archive/qt/5.9/5.9.1/qt-opensource-linux-x64-5.9.1.run QQ群 ...... 2. 安装 把下载…...
理解dbt artifacts及其实际应用
dbt是数据分析领域的一种变革性工具,它使数据专业人员能够对仓库中的数据进行转换和建模。它的强大功能之一是生成dbt artifacts:dbt运行的结构化输出,提供对dbt项目及其操作的深入了解。 dbt 构件介绍 dbt构件是每次dbt运行时生成的JSON文…...
100种算法【Python版】第15篇——KMP算法
本文目录 1 算法原理1.1 部分匹配表2 实现步骤3 示例说明4 python实例5 算法应用领域1 算法原理 KMP(Knuth-Morris-Pratt)算法是一种用于高效字符串匹配的算法。它通过预处理模式字符串,构建一个部分匹配表(前缀函数),以避免重复比较,从而提高匹配效率。KMP 算法通过利…...
【软件工程】软件项目管理/工程项目管理复习资料
第一章 软件项目管理概述习题 一. 填空题 实现项目目标的制约因素有( 项目范围 )、( 成本 )、( 进度计划 )、( 客户满意度 )等。 项目管理( 启动过程组 )、…...
C语言基础题(大合集2)
1. 时间转换 给定秒数 --> 输出秒数 转化成 时/分/秒 //时间转换 //给定秒数 --> 转换成 小时/分/秒 int main() {//输入int seconds 0;int h 0;//小时int m 0;//分钟int s 0;//秒scanf("%d", &seconds);//计算h seconds / 60 / 60;m seconds / 60…...
Stable Diffusion视频插件Ebsynth Utility使用方法
在Stable Diffusion中安装完Ebsynth Utility后,就可以开始试用了。 启动Stable Diffusion后,出面画面: 1、步骤1:视频分帧及生成蒙板帧 填入工程目录,选择上传所用的视频文件:注意对目录命名的要求-不能有…...
Ubuntu忘记密码
如果你忘记了WSL(Windows Subsystem for Linux)中Linux发行版的密码,可以按照以下步骤来重置密码: 一、对于Ubuntu或Debian等基于Debian的发行版(以Ubuntu为例) 关闭WSL实例(如果正在运行&…...
使用Python实现深度学习模型:智能极端天气事件预测
极端天气事件,如暴雨、台风和热浪,往往会对人类社会和自然环境产生深远的影响。近年来,气象数据和深度学习技术的发展使得智能预测极端天气成为可能。通过训练深度学习模型,我们可以建立一个自动化的预测系统,从大量的历史气象数据中学习并预测未来的极端天气事件。这篇文…...
cJson函数解析
获取json版本号 CJSON_PUBLIC(const char*) cJSON_Version(void);设置自定义内存分配函数 CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks);解析 JSON 字符串并将其转换为 cJSON 数据结构 CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value);用于解析指定长度的…...
基于SSM+微信小程序的跑腿平台管理系统(跑腿3)
👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM微信小程序的跑腿平台管理系统实现了管理员、接单员及用户三个角色。 1、管理员实现了首页、个人中心、管理员管理、基础数据管理、接单详情、跑腿任务管理等。 2、接单员实现了…...
mit6824-02-Lab1:MapReduce分布式实现
文章目录 写在前面总体思路分析代码实现参考链接 写在前面 具体上次写6824的第一篇文章已经过去了快一个月,上次学习了MapReduce论文相关理论后一直没有继续写代码实现,自己一边要搞论文没有整块时间实现,这两天抽写了相关代码,算…...
【NOIP普及组】 装箱问题
【NOIP普及组】 装箱问题 💐The Begin💐点点关注,收藏不迷路💐 有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0&…...
Flutter主题最佳实践
Styling your Flutter app not only makes it visually appealing but also enhances the user experience. Flutter offers a robust theming system that helps you maintain consistency and customize your app’s look and feel. 设计 Flutter 应用程序的风格不仅能使其在…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
Python 高效图像帧提取与视频编码:实战指南
Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...
鸿蒙HarmonyOS 5军旗小游戏实现指南
1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发,采用DevEco Studio实现,包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...
flow_controllers
关键点: 流控制器类型: 同步(Sync):发布操作会阻塞,直到数据被确认发送。异步(Async):发布操作非阻塞,数据发送由后台线程处理。纯同步(PureSync…...
Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合
无论是python,或者java 的大型项目中,都会涉及到 自身平台微服务之间的相互调用,以及和第三发平台的 接口对接,那在python 中是怎么实现的呢? 在 Python Web 开发中,FastAPI 和 Django 是两个重要但定位不…...
