当前位置: 首页 > 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()。

数据类型

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

http://www.lryc.cn/news/470745.html

相关文章:

  • 在元神操作系统启动时自动执行任务脚本
  • JAVA学习-练习试用Java实现“判断是否为等边三角形的方法”
  • Leetcode 140 Word Break II
  • 文理学院数据库应用技术实验报告0
  • Bootstrap 4 按钮
  • 【笔记】LLM位置编码之标准位置编码
  • 环 境 配 置
  • 理解dbt artifacts及其实际应用
  • 100种算法【Python版】第15篇——KMP算法
  • 【软件工程】软件项目管理/工程项目管理复习资料
  • C语言基础题(大合集2)
  • Stable Diffusion视频插件Ebsynth Utility使用方法
  • Ubuntu忘记密码
  • 使用Python实现深度学习模型:智能极端天气事件预测
  • cJson函数解析
  • 基于SSM+微信小程序的跑腿平台管理系统(跑腿3)
  • mit6824-02-Lab1:MapReduce分布式实现
  • 【NOIP普及组】 装箱问题
  • Flutter主题最佳实践
  • 计算机网络:网络层 —— IPv4 数据报的首部格式
  • MySQL 之 索引
  • 手动探针台的用途及组成部分
  • ❤️算法笔记❤️-(每日一刷-5、最长回文串)
  • nginx 路径匹配,关于“/“对规则的影响
  • 安全知识见闻-网络安全热门证书
  • Pandabuy事件警示:反向海淘品牌如何规避风险
  • 【纯血鸿蒙】安装hdc工具
  • TensorFlow面试整理-给定一个任务(如图像分类、文本分类),如何从头构建一个TensorFlow模型?
  • unity中出现一些莫名其妙的问题
  • Python爬虫-汽车投诉排行榜单数据