32 位硬件乘除 初试
本帖最后由 DebugLab 于 2024-8-18 18:35 编辑使用的单片机是:8051U
乘法和除法单元(称为 MDU32)提供快速的 32 位算术运算。 MDU32 支持无符号和补码有符号整数操作数。 MDU32 由专用的直接内存访问控制模块(称为 DMA)。所有 MDU32 算术操作都是通过向DMA 控件写入 DMA 指令来启动的寄存器 DMAIR。 MDU32 模块执行的所有算术运算的操作数和结果位于寄存器 R0-R7。
MDU32 执行乘除法运算时,单片机会自动切换到 IDLE 模式,即 CPU 停止时钟指令,其它外设仍继续工作。运算完成后,单片机自动切换到正常工作模式
实验方法:
添加“STC32_MDU32_LARGE_Vxx.LIB”到keil中
然后while中添加测试代码,P10用于测试运行时间
while(1)
{
P10 = 0;
sint1 = 0x31030F05;
sint2 = 0x00401350;
xsint = sint1 * sint2;
uint1 = 5;
uint2 = 50;
xuint = uint1 * uint2;
uint1 = 528745;
uint2 = 654689;
xuint = uint1 / uint2;
sint1 = 2000000000;
sint2 = 2134135177;
xsint = sint1 / sint2;
sint1 = -2000000000;
sint2 = -2134135177;
xsint = sint1 / sint2;
sint1 = -2000000000;
sint2 = 2134135177;
xsint = sint1 / sint2;
P10 = 1;
sint1 = 0x31030F05;
sint2 = 0x00401350;
xsint = sint1 * sint2;
uint1 = 5;
uint2 = 50;
xuint = uint1 * uint2;
uint1 = 528745;
uint2 = 654689;
xuint = uint1 / uint2;
sint1 = 2000000000;
sint2 = 2134135177;
xsint = sint1 / sint2;
sint1 = -2000000000;
sint2 = -2134135177;
xsint = sint1 / sint2;
sint1 = -2000000000;
sint2 = 2134135177;
xsint = sint1 / sint2;
}测试结果:
使用MDU32执行时间为:7.43us
不使用MDU32执行时间为:43.3us
本帖最后由 health 于 2024-8-17 14:14 编辑
MDU32功能有点弱,至少应该搞个32b * 32b = 64b,还有乘加 32b * 32b + 64b = 64b
---------------------------------------------------
又详细了解了一下,MDU32是用硬件协处理器代替C51/C251的库函数,C51/C251目前好像没有64位整数类型,自然也没有相关的运算库函数。
即使MDU加了64位运算,也没法在C51/C251中直接调用。
硬件就是比软件 很好的实验,谢谢分享
页:
[1]