历史上的今天
返回首页

历史上的今天

今天是:2025年03月20日(星期四)

正在发生

2018年03月20日 | Cortex--M0单片机二-十进制整数转换的快速算法

2018-03-20 来源:eefocus

  为了提高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操作变换为乘法操作的具体实现方法:

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


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

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

c.JPG


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

推荐阅读

史海拾趣

CAO Group Inc公司的发展小趣事

CAO Group并未满足于在牙科行业的成功,而是积极寻求多元化的发展道路。公司开始涉足医疗、执法和光电市场,通过不断推出创新产品和技术,成功拓展了新的业务领域。同时,公司还积极寻求与国际知名企业的合作,通过技术交流和资源共享,不断提升自身的竞争力和影响力。

Crane Co.公司的发展小趣事

Crane Co.的创立可以追溯到1855年,当时R. T. 克瑞黄铜与铸钟厂在芝加哥正式成立。公司起初主要生产阀门、配件和特种铸件,这些产品为当时的工业发展提供了关键支持。随着美国工业的蓬勃发展,Crane Co.凭借其精湛的铸造技术和优质的产品质量,逐渐在阀门制造领域崭露头角。

安森德(Ascend)公司的发展小趣事

随着产品技术的成熟,安森德公司开始积极拓展市场。公司凭借优质的产品和服务,成功进入工业电源、电机驱动、消费电子等多个领域。同时,安森德积极寻求与全球顶尖企业的战略合作,通过与这些企业的技术交流和业务合作,不断提升自身的技术水平和市场竞争力。这些合作不仅为安森德带来了更多的商业机会,也进一步提升了公司在行业内的知名度和影响力。

Cal Crystal Lab Inc / Comclok Inc公司的发展小趣事

随着电子行业的快速发展,技术创新和合作成为了企业发展的重要驱动力。Cal Crystal Lab Inc深知这一点,积极寻求与其他企业的技术合作。通过与国内外知名高校和研究机构的深入合作,公司不断引进新技术、新工艺,提升了产品的技术含量和附加值。同时,Cal Crystal Lab Inc还与其他企业建立了战略合作关系,共同开发新产品、拓展新市场,实现了共赢发展。

振华(CEC)公司的发展小趣事

面对激烈的市场竞争,振华始终将技术创新作为企业发展的核心动力。公司投入大量资金进行技术研发,积极引进国内外先进技术,并与高校、科研机构建立紧密的合作关系。通过持续的技术创新,振华在电子产品领域取得了多项重要突破,推出了一系列具有自主知识产权的高新产品,引领了市场潮流。

聚辰(Giantec)公司的发展小趣事

自1994年(部分资料显示为1993年,但此处采用最新信息)成立以来,港源公司始终将技术创新视为企业发展的核心驱动力。公司专注于轻触开关、微动开关、AC/DC插座、变压器等开关零组件产品的研发,通过引进国内外先进技术,并自主成功研发了自动化生产设备和检测设备,实现了生产自动化,大幅提升了产品质量和生产效率。港源公司还积极参与国际技术交流与合作,与众多行业标杆客户长期紧密合作,能够尽早了解市场需求,快速响应并推出符合行业标准的新产品,从而引领了电子开关行业的发展方向。

问答坊 | AI 解惑

谁有CXA1019M最简单的FM部分电路图

谁有CXA1019M最简单的FM部分电路图…

查看全部问答>

控制思想交流

水温控制程序-PID思想多交流…

查看全部问答>

微软研发神奇臂带让胳膊变成触摸屏

Skinput能够解决MP3等小玩意儿触摸屏越来越小的问题 Skinput能够识别在手上敲打出来的电话号码 研究人员表示,我们的皮肤是一个完美的显示面,能够永远伴随着我们 与MP3播放器结合在一起的Skinput原型,可用于改换歌曲和调整音量 Ski ...…

查看全部问答>

请问哪位有《运算放大器应用技术手册》

这本书太贵了  没米买  只能问各位大哥上传个PDF看看    谢谢…

查看全部问答>

请问什么地方有嵌入式LINUX的介绍?(音频或视频)

请问什么地方有嵌入式LINUX的介绍?(音频或视频)…

查看全部问答>

Wince中为什么文件内存映射读写时会占用程序内存空间

      hFile = CreateFileForMapping();       hMap = CreateFileMapping(hFile,);       pHead = MapViewOfFile(hMap);       BYTE * pData = new BYTE[nSiz ...…

查看全部问答>

6410开发板(ARM1176JZF-S内核)+摄像头,能实时采集视频,并进行图像处理吗?

主要是对采集到的视频进行实时图像处理,如边缘检测,二值化等等。请大家指点,谢谢。…

查看全部问答>

CE5.0 电源属性 系统定时挂起问题

在WINCE5.0 系统中,控制面板--电源--电源属性--方案, 当我在电源使用方案中选电池电源时,将状态切换为挂起的时间不准(即是系统定时睡眠的时间不准), 请高手指点应该怎么样修改,谢谢!…

查看全部问答>

WinCE 5.0的问题

我添加了对中文字体的支持(NLS和SC_song).结果就成这样了.哪位高手指导指导 Copying C:\\WINCE500\\PBWorkspaces\\main\\RelDir\\Emulator_x86_Release\\KbdEmulXTMsEngUs1.dll to C:\\WINCE500\\PBWorkspaces\\main\\RelDir\\Emulator_x86_Releas ...…

查看全部问答>

急请高手帮助!!!!

我有一个内部测试机器的系统,有两只表:一只电能表,一只热能表.热能表有RS232接口,已经有软件支持了,接入电脑后运行软件就可以读取数据了,而电能表 只有RS485接口.现欲将两个表的软体整合成一个软件,并要求达到如下功能:     将测试的负 ...…

查看全部问答>