编辑: huangshuowei01 | 2016-08-19 |
基于 Cortex?-M0+的单片 机包含加法、减法和乘法指令.Cortex-M0+架构没有用于除法运算的汇编指令,除法逻辑可以根据不同的 编译器而变化.基于 Arm? Cortex-M0+的单片机(MCU)具有一个可配置选项,可通过该选项使用快速乘 法器进行乘法运算.基于该可配置选项,乘法运算可以为单个周期指令到最多
32 个周期指令不等. SAMC21(一款 Cortex-M0+ MCU)非常适合需要数学计算的应用.SAMC21 MCU 具有可进行乘法运算 的快速单周期乘法器选项,还具有一个新的外设,称为除法和平方根加速器(Division and Square Root Accelerator,DIVAS),可用于执行快速除法和平方根运算. ?
2018 Microchip Technology Inc. DS90003178A_CN-page
1 目录 简介.1 1. 概念.3 2. 解决方案/实现.4 3. 相关资源.8 Microchip 网站.9 变更通知客户服务.9 客户支持.9 Microchip 器件代码保护功能.9 法律声明.10 商标.10 DNV 认证的质量管理体系.11 全球销售及服务网点.12 TB3178 ?
2018 Microchip Technology Inc. DS90003178A_CN-page
2 1. 概念 适用于 Arm 架构的应用程序二进制接口(Application Binary Interface,ABI)包含一系列标准,其中有些 是开放的标准,还有一些是 Arm 架构专用标准.ABI 可管控各种基于 Arm 的执行环境中二进制文件和开发 工具的互操作.支持 Arm MCU 的编译器需符合这些标准.这些标准的其中一项是适用于 Arm 架构的运行 时ABI.此标准为 ABI 指定辅助函数,使之能够支持 C、C++和算术运算.对于除法,编译器会用各自的 库代码替换除法和模运算符(即,使用重复减法来实现除法).该库代码将数百个字节添加到代码存储 器,MCU 消耗
50 到400 之间任意数量的时钟周期,具体取决于操作数的大小.编译器可通过过载运行时 ABI 辅助方法来使用 DIVAS 功能.DIVAS 展现出的性能优于编译器除法(即,比除法 65535/3 少50 个时 钟周期).DIVAS 支持整数平方根运算,而不需要任何额外的库依赖关系. 注: 模运算符使用除法来取得余数,因此需要过载.DIVAS 的性能表现可能会随着被除数和除数的值而变 化. TB3178 概念 ?
2018 Microchip Technology Inc. DS90003178A_CN-page
3 2. 解决方案/实现 DIVAS 只支持
32 位整数除法.用于除法运算的运行时 ABI 辅助方法过载,以便编译器了解除法应使用 DIVAS 功能进行除法.根据运行时 ABI 标准,32 位整数除法函数在 r0 中返回商,或在{r0, r1}中返回 商和余数. 在下面的示例中,使用 Arm 专用原型表示法描述二值返回函数. 注: 有些编译器可以使用
64 位有符号/无符号整数作为返回类型,而不是 idiv 或uidiv 结构. int __aeabi_idiv(int numerator, int denominator);
unsigned __aeabi_uidiv(unsigned numerator, unsigned denominator);
typedef struct { int quot;
int rem;
} idiv_return;
typedef struct { unsigned quot;
unsigned rem;
} uidiv_return;
__value_in_regs idiv_return __aeabi_idivmod(int numerator, int denominator);
__value_in_regs uidiv_return __aeabi_uidivmod(unsigned numerator, unsigned denominator);
注: ASFv3 框架为 DIVAS 驱动程序提供支持.DIVAS ASF API 包含整数除法、模和平方根的 API.将符号定 义DIVAS_OVERLOAD_MODE 设置为 true,即可帮助 DIVAS 的ASF 驱动程序中过载的 ABI 辅助方法来执 行内部除法运算.包含运行时 ABI 辅助方法的驱动程序使用 DIVAS ASF 驱动程序 API 进行过载. TB3178 解决方案/实现 ?