原标题:针对小容量单片机的程序优化方式---乘除法篇
目前,单片机市场竞争激烈,许多APP应用从性价比角度出发,选择使用程序存储空间小(例如1K、2K )的资源8位MCU芯片进行开发。 一般来说,在这种MCU中没有硬件乘法、除法指令,必须使用乘除法的程序的情况下,如果编译器仅调用内部函数库来实现,就存在代码量多、执行效率低的缺点。
上海晟硅微电子推出的MC30、MC32系列MCU采用RISC架构,在小资源8位MCU领域有广泛的用户群和广泛的应用,本文以晟硅微电子这两个系列产品的指令集为例,对组件和c控制
乘法篇
单片机中的乘法是二进制的乘法。 也就是说,乘数的各位乘以被乘数,并将其相加。 乘数和被乘数是二进制数,所以在实际编程中,每步的乘法可以通过移位来实现。
例如,乘数R3=01101101、被乘数R4=11000101、乘积R1R0 . 步骤如下
1、清空乘积R1R0;
2、乘数的第0位是1,其被乘数R4需要移动2进制1,即向左移动0位,与R1R0相加
3、乘数第一名为0,忽略不计;
4、乘数的第2位是1,其被乘数R4需要移动2进制100,即向左移动2位并与R1R0相加
5、乘数的第三位是1,其被乘数R4需要移动二进制1000,即向左移动三位,与R1R0相加;
6、乘数第四位为0,忽略
7、乘数的第五位是1,其被乘数R4需要二进制100000,即向左移动五位并与R1R0相加;
8、乘数的第六位是1,其被乘数R4需要二进制1000000,即向左移动6位并与R1R0相加;
9、乘数第7位为0,忽略;
10、此时R1R0的值是最后的乘积,算法至此完成。
上述示例的运算结果:
R1R0=R3*R4=(R46 ) R45 ) R43 ) R42 ) R4=101001111100001
实际运算流程图如图1.1所示。
图1.1汇编乘法流程图
在实际编程过程中,程序优化有两个目标,提高程序的执行效率,减少代码量。 看看本文提供的汇编算法与普通c语言编程的效率和代码量的比较。
表1.1是比较程序执行效率的数据,表明与c语言相比,汇编编译的执行时间大大缩短。
组件(时钟周期)
c语言(时钟周期)
8*8位乘法
79-87
184-190
16*8位乘法
201-210
362-388
16*16位乘法
234-379
396-468
表1.1乘法时钟周期比较表
表1.2是程序代码量的比较数据,程序集占用的程序区域也可能比c语言小很多。
汇编(Byte )。
c语言(字节) )
8*8位乘法
15
34
16*8位乘法
19
96
16*16位乘法
31
96
表1.2乘法ROM空间使用情况比较表
从以上两点来看,本文介绍的乘法算法各方面的使用情况都比c编译好得多。 通过这样优化,可以优化在使用中无法满足APP应用程序需要的现有程序,如程序空间不足或执行时间过长。
汇编语言最接近机器语言。 汇编语言可以直接操作寄存器,调整指令的执行顺序。 由于汇编语言直接面对硬件平台,不同的硬件平台指令集和指令周期相差很大,不方便程序的移植和维护,所以我们制定乘法例程来简化指令集,大家
除法篇
单片机中的除法也是二进制除法。 类似于现实中的数学除法。 被除数从高位开始,按位与除数进行打交道,取馀数的运算。 重新进行除法运算,直到所得的馀数不能与之后的被除数一起被整除为止。 单片机中的除法是二进制数,每一步的除法最多只有一个,所以在实际编程中可以把每一步的除法看作减法。
例如被除数R3R4=1100110001101101、除数R5=11000101、商R1R0、余数R2。 步骤如下
1、通关商R1R0,余数R2;
2、被除数开放最高位,排在第15位,为1,1小于除数,商为0,馀R2为1;
3、前一步骤的馀数和被除数次数的前、后14位,得11、11仍然小于除数,商为0,馀R2为11
直到离开第4、8位,为1100(1100 ),大于除数,商为1,馀数R2为111。
5
、上一步余数并上被除数第7位,得1110,没有除数大,商为0,余数R2为1110;6、上一步余数并上被除数第6位,得11101,没有除数大,商为0,余数R2为11101;
7、按照以上步骤,直到放开了被除数得第3位,得11101101,比除数大,商为1,余数R2为101000;
8、上一步余数并上被除数第2位,得1010001,没有除数大,商为0,余数R2为1010001;
9、上一步余数并上被除数第1位,得10100010,没有除数大,商为0,余数R2为10100010;
10、上一步余数并上被除数第0位,得101000101,比除数大,商为1,余数R2为10000000;
11、然后把以上所有步骤中得商从左至右依次排列就是最后的商100001001,乐观的蜜蜂最后算得的余数10000000。
以上例子运算结果 R1R0 = R3R4 / R5 = 100001001
R2 = R3R4 % R5 = 10000000
实际运算流程图见图2.1。
图2.1 汇编除法运算流程图
除法运算的效率,代码量见以下表格
表1.1是程序运行效率和代码量的对比数据(可能会有小的偏差),很明显本文提供的汇编算法要优化的很多。
16/8位除法
汇编
C语言
时钟周期
287-321
740-804
使用空间(Byte)
35
142
表2.1 除法运算时钟周期对比表
所以对于除法运算,本文提供的方法也是相对较优的。
以下是针对精简指令集做的除法运算,16/8位的例程,便于大家的移植和理解。
责任编辑: