当前位置:首页 > 单片机 > 单片机
[导读]   为了提高Cortex—M0系列单片机应用系统的二进制到十进制BCD码整数转换代码的执行效率,采用除十求余数法来实现。该快速算法的核心内容是通过高效的汇编语言来实现常数除法,无论在程序代码的运行时

  为了提高Cortex—M0系列单片机应用系统的二进制到十进制BCD码整数转换代码的执行效率,采用除十求余数法来实现。该快速算法的核心内容是通过高效的汇编语言来实现常数除法,无论在程序代码的运行时间和存储空间上,都远胜于sprintf函数。

  在单片机应用系统中,一般都需要高效快速地完成系统所需要的任务,并在任务完成后使系统进入睡眠或低功耗状态,以便最大限度地节省系统功耗,增强系统的抗干扰能力。因此,必须优化和提高系统中各个模块的运算速度,以最大限度地压缩软件运行时间。许多单片机应用系统中都需要进行二进制整数转换为十进制BCD码的操作,以便实现系统信息的显示。对于Cortex—M0系列单片机,由于其指令系统中没有十进制调整指令和除法指令,使得一些文献中提供的高效算法和技巧不再适用于这类单片机,从而造成上述转换操作成为影响系统性能的重要因素,因此提高上述数制转换速度对于提高系统运行效率有极大的促进作用。

  1 传统的实现方法

  要实现快速运算,很自然地想到经典的双字节二进制整数转换成3字节BCD码整数的子程序。其采用的算法是预先将一个3字节队列的内容清除为0,然后依次将需要变换成BCD码的二进制整数的每位依次左移至CY位,再把3字节队列中的数据带进位自身相加,并对相加的结果进行十进制调整。通过16次移位完成运算,结果为压缩格式的3字节BCD编码。由于ARM指令系统中没有类似于MCS-51单片机系统中的十进制调整指令,所以在Cortex—M0系列单片机上实现该算法比较困难。

  2 快速算法概述

  本快速算法采用除十求余数法来实现。设需要转换的数据也就是被除数为W,除数为10,整数除法的商为S,除法运算的余数为R,根据数学运算规则有:

  S=W/10 (1)

  R=W-S×10=W-(W/10)×10 (2)

  经过上述的运算,所得余数R就是从被除数中分离出来的个位数字,也就是首先得到了被除数的最低位的BCD码。为了获取被除数其他位的BCD码,只需要将上面得到的商S作为新的被除数W,然后重复执行上述整数除法运算,就可以分别得到被除数其他位上的BCD码,从而完成将二进制数转换为BCD码的操作。实现上述操作的关键在于如何快速地完成除数为10的快速除法任务。

  3 除法运算的实现

  为了将被除数除以10,可以将其转化为将被除数乘以0.1来实现,为此可以先写出十进制数据0.1所对应的二进制小数的表示形式:

  (0.1)D=0.000 1100 1100 1100 1100 1100 1100 1100 1100 1100……为方便32位单片机进行整数运算,预先将上式中的二进制数左移35位,即将其扩大235倍后得到除数10的魔术数(MagIC_Number)为:

  Magic_Number=CCCCCCCDH(十六进制数)当得到除数10的魔术数后,将被除数与该魔术数相乘,然后将所得的乘积右移35位,即将乘积缩小235倍后得到最终的数据就是所期望的除法结果。

  由于Cortex—M0系列单片机的乘法指令只能保留两个32位数相乘后的乘积的低32位,乘积的高32位被舍弃,所以不能直接采用被除数与除数的魔术数相乘的方法来实现将除法转换为乘法的运算。好在这个魔术数很有特点,可以将其表示为:

  Magic_Number=C0000000H+0C000000H+0CC0000H+0CCCCH (3)由于是通过求余数的方法来获取原始数据的各位BCD码,所以在不损失运算精度的原则下,舍弃了原魔术数Magic_Number的最低位,但这不妨碍最后通过式(2)来求余数的操作。下面就是对式(1)中的除10操作变换为乘法操作的具体实现方法:


通过(4)式,采用Cortex—M0系列单片机指令中的移位指令和加减法指令的组合运算就可以快速地得到整数除法的商S,进而采用式(2)来求余数R。


4 算法中除法运算的汇编代码实现
Cortex—M0系列单片机采用Thumb指令集,式(4)中各数据项中的分数项都可以利用该指令集中的右移指令来实现,并且采用多次累加的办法来完成运算。下面给出具体的汇编语言源程序:



结语
Cortex—M0系列单片机的开发一般采用集成开发环境,为方便使用,可以将上面的子程序封装成符合集成开发环境调用规则的函数,封装时最好包含有将单字节、双字节、三字节和四字节数据转化为BCD码的多个函数。为测试该函数的性能,在IAR集成开发环境下,将General options→Library Options选项卡中的Printf formatter设置成Tiny模式,以便尽量减小Sprintf函数的代码长度和运行时间。为叙述方便,这里假定封装好的函数名为Hex2Bcd,表1给出其与系统函数sprintf的指令运行周期数(CCSTEP)的对比数据。


由表1可以看出,Hex2Bcd函数的平均运行时间不足sprintf函数的5%,速度优势极其明显。另外Hex2Bcd函数的程序代码仅有100字节左右,远少于sprintf函数的1.5 KB,极大地节省了存储空间。因此,本文中的快速算法具有很强的实用性,值得推广应用。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭