一:AI8051的MDU32测试
乘法和除法单元(称为MDU32)提供快速的32位算术运算。MDU32支持无符号和补码有符号整数操作数。MDU32由专用的直接内存访问控制模块(称为DMA)。所有MDU32算术操作都是通过向DMA控件写入DMA指令来启动的寄存器 DMAIR。MDU32模块执行的所有算术运算的操作数和结果位于寄存器R0-R7。
使用的注意事项
1、DMA模块执行算术运算所需的执行时间,包括:
操作数从DR0-DR4寄存器加载到MDU32模块
MDU32算术运算
从MDU32模块到R0-R7寄存器的结果存储
2、处理器执行C编译算术函数所需的执行时间,包括:
DMA指令写入DMAIR 寄存器
操作数从DR0-DR4寄存器加载到MDU32模块
MDU32算术运算
从MDU32模块到R0-R7寄存器的结果存储
从函数返回(RET指令)
3、MDU32执行乘除法运算时,单片机会自动切换到IDLE模式,即CPU停止时钟指令,其它外设仍继续工作。运算完成后,单片机自动切换到正常工作模式
几种函数执行的时间如下所示:

二:MDU32算术运算
1:32位乘法:
32位乘法运算是对两个无符号或有符号的补码整数参数执行的。第一个参数位于R4-R7寄存器中,第二个参数位于R0-R3寄存器中。运算结果存储到R4-R7寄存器。
2:32位无符号除法:
对两个无符号整数参数执行32位无符号除法运算。第一个参数“被除数”是位于R4-R7寄存器中,第二个参数“除数”位于R0-R3寄存器中。结果存储到R4-R7寄存器。余数在R0-R3中返回。除以零返回OxFFFFFFF
3: 32位有符号除法:
对两个有符号的补码参数执行32位有符号除法运算。第一个参数“被除数”位于R4-R7寄存器中,第二个参数“除数”位于R0-R3寄存器中。结果存储到R4-R7寄存器。余数在R0-R3中返回。除以零返回OxFFFFFEF
三:软件代码如下所示:
ultest = 12345678UL;
ltest = 12345678;
ultest = ultest / 12;
ltest = ltest / 12;
sint1 = 0x31030F05;
sint2 = 0x00401350;
TPIN = 0;
xsint = sint1 * sint2;
TPIN = 1;
// printf("Result1=0x%lx\r\n",xsint);
uint1 = 5;
uint2 = 50;
TPIN = 0;
xuint = uint1 * uint2;
TPIN = 1;
// printf("Result2=%d\r\n",xuint);
uint1 = 654689;
uint2 = 528;
TPIN = 0;
xuint = uint1 / uint2;
TPIN = 1;
// printf("Result3=%u\r\n",xuint);
sint1 = 2134135177;
sint2 = 20000;
TPIN = 0;
xsint = sint1 / sint2;
TPIN = 1;
/// printf("Result4=0x%lx\r\n",xsint);
sint1 = -2134135177;
sint2 = -20000;
TPIN = 0;
xsint = sint1 / sint2;
TPIN = 1;
// printf("Result5=0x%lx\r\n",xsint);
sint1 = 2134135177;
sint2 = -20000;
TPIN = 0;
xsint = sint1 / sint2;
TPIN = 1;四:使用仿真软件看下计算结果:

我要赚赏金
