首页 > 编程知识 正文

单片机c语言代码大全,单片机编程语言

时间:2023-05-04 15:43:32 阅读:18433 作者:3374

原标题:针对小容量单片机的程序优化方式---乘除法篇

目前,单片机市场竞争激烈,许多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位的例程,便于大家的移植和理解。

责任编辑:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。