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

【复旦微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->ENDHDIV->SOR寄存器后,使用while去一直查询该寄存器来判断是否运算完成是很耗费时间的。所以可以直接加入若干个__nop()。

数据类型

硬件除法器的数据寄存器数据类型都是有符号类型的,使用时请注意类型要匹配。

相关文章:

【复旦微FM33 MCU 外设开发指南】外设篇1——硬件除法器

前言 本系列基于复旦微FM33LC0系列单片机的DataSheet编写&#xff0c;旨在提供一些开发指南。 本文章及本系列其他文章将持续更新&#xff0c;本系列其它文章请跳转【复旦微FM33 MCU 外设开发指南】总集篇 本文章最后更新日期&#xff1a;2024/10/24 文章目录 前言用途工作流…...

在元神操作系统启动时自动执行任务脚本

1. 背景 本文主要介绍让元神操作系统启动时自动执行任务脚本的方法&#xff0c;适用于无人化任务执行目的。将任务脚本及相关的应用程序准备好之后&#xff0c;把装有元神操作系统的U盘插入目标电脑&#xff0c;然后打开电脑电源就会自动完成所设置的任务。 2. 方法 &#x…...

JAVA学习-练习试用Java实现“判断是否为等边三角形的方法”

问题&#xff1a; 定义一个三角形类&#xff08;Triangle&#xff09;&#xff0c;包含三个边长&#xff08;a, b, c&#xff09;属性&#xff0c;并实现一个判断是否为等边三角形的方法。 解答思路&#xff1a; 下面是一个简单的 Triangle 类定义&#xff0c;其中包含了三个…...

Leetcode 140 Word Break II

题意&#xff1a;给定一个string以及一个wordDict,要求返回一个vector<string> &#xff0c;这个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位置编码之标准位置编码

标准位置编码 起源原理证明&#xff1a;对于任何固定的偏移量 k k k&#xff0c; 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是数据分析领域的一种变革性工具&#xff0c;它使数据专业人员能够对仓库中的数据进行转换和建模。它的强大功能之一是生成dbt artifacts&#xff1a;dbt运行的结构化输出&#xff0c;提供对dbt项目及其操作的深入了解。 dbt 构件介绍 dbt构件是每次dbt运行时生成的JSON文…...

100种算法【Python版】第15篇——KMP算法

本文目录 1 算法原理1.1 部分匹配表2 实现步骤3 示例说明4 python实例5 算法应用领域1 算法原理 KMP(Knuth-Morris-Pratt)算法是一种用于高效字符串匹配的算法。它通过预处理模式字符串,构建一个部分匹配表(前缀函数),以避免重复比较,从而提高匹配效率。KMP 算法通过利…...

【软件工程】软件项目管理/工程项目管理复习资料

第一章 软件项目管理概述习题 一. 填空题 实现项目目标的制约因素有&#xff08; 项目范围 &#xff09;、&#xff08; 成本 &#xff09;、&#xff08; 进度计划 &#xff09;、&#xff08; 客户满意度 &#xff09;等。 项目管理&#xff08; 启动过程组 &#xff09;、…...

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后&#xff0c;就可以开始试用了。 启动Stable Diffusion后&#xff0c;出面画面&#xff1a; 1、步骤1&#xff1a;视频分帧及生成蒙板帧 填入工程目录&#xff0c;选择上传所用的视频文件&#xff1a;注意对目录命名的要求-不能有…...

Ubuntu忘记密码

如果你忘记了WSL&#xff08;Windows Subsystem for Linux&#xff09;中Linux发行版的密码&#xff0c;可以按照以下步骤来重置密码&#xff1a; 一、对于Ubuntu或Debian等基于Debian的发行版&#xff08;以Ubuntu为例&#xff09; 关闭WSL实例&#xff08;如果正在运行&…...

使用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)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM微信小程序的跑腿平台管理系统实现了管理员、接单员及用户三个角色。 1、管理员实现了首页、个人中心、管理员管理、基础数据管理、接单详情、跑腿任务管理等。 2、接单员实现了…...

mit6824-02-Lab1:MapReduce分布式实现

文章目录 写在前面总体思路分析代码实现参考链接 写在前面 具体上次写6824的第一篇文章已经过去了快一个月&#xff0c;上次学习了MapReduce论文相关理论后一直没有继续写代码实现&#xff0c;自己一边要搞论文没有整块时间实现&#xff0c;这两天抽写了相关代码&#xff0c;算…...

【NOIP普及组】 装箱问题

【NOIP普及组】 装箱问题 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 有一个箱子容量为V&#xff08;正整数&#xff0c;0&#xff1c;&#xff1d;V&#xff1c;&#xff1d;20000&#xff09;&#xff0c;同时有n个物品&#xff08;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 应用程序的风格不仅能使其在…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

掌握 HTTP 请求:理解 cURL GET 语法

cURL 是一个强大的命令行工具&#xff0c;用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中&#xff0c;cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...

uniapp 实现腾讯云IM群文件上传下载功能

UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中&#xff0c;群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS&#xff0c;在uniapp中实现&#xff1a; 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...

VisualXML全新升级 | 新增数据库编辑功能

VisualXML是一个功能强大的网络总线设计工具&#xff0c;专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑&#xff08;如DBC、LDF、ARXML、HEX等&#xff09;&#xff0c;并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...

软件工程 期末复习

瀑布模型&#xff1a;计划 螺旋模型&#xff1a;风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合&#xff1a;模块内部功能紧密 模块之间依赖程度小 高内聚&#xff1a;指的是一个模块内部的功能应该紧密相关。换句话说&#xff0c;一个模块应当只实现单一的功能…...