ARM体系论文

2024-05-25

ARM体系论文(通用4篇)

ARM体系论文 篇1

嵌入式系统中,包含一些决定系统性能的关键程序。通过程序优化可大幅提升系统的性能,降低系统的整体功耗。优化可将一个不可行的系统变得可行,亦可将一个无竞争力的系统变得极具竞争力。对于程序的优化,使用传统的编译器优化可得到性能较好的目标代码。但要获得最佳性能,就要通过手写汇编来优化对软件性能起到决定作用的关键程序。手工编写汇编代码,可直接控制高级语言编程时不能有效使用的3个优化手段:条件执行、指令调整和寄存器分配[1]。本文基于ARM9指令架构的特点,应用上述优化手段,对决定系统性能的关键程序的汇编代码做二次优化。

1 ARM处理器结构

ARM采用RISC(Reduced Instruction Set Computer)指令结构,使用简单高效的指令,并通过简单指令组合来完成不常用的复杂功能。因此在ARM上实现特殊功能时,效率可能较低,但可利用流水线技术和超标量技术加以改进和弥补。ARM架构对存储器操作有限制,使得控制简单化[2,3]。

2 ARM9架构相关优化

ARM处理器指令具备条件执行的特征,利于取代比较指令优化分支结构和循环结构。ARM寄存器数量众多,结合多寄存器装载或存储的LDM和STM指令,易于实现循环展开优化。

近年来,嵌入式微处理器的代码优化得到广泛研究。Simunic等人[4]将代码优化分成算法优化、数据优化和指令流优化3类。kis Kaspersky[5]使用VC++6.0、Borland C++5.0和WatcomC 10.0的3种流行编译器分析优化内容,对比代码质量。Rainer Leupers[6]分析了大量嵌入式微处理器相关的优化方法、优化算法和优化工具。研究了寄存器分配、指令调度、代码选择、条件执行、函数内联等各种优化手段的优缺点。David A Ortiz和Nayda G等人[7]研究了编译器优化,指令级优化和源代码级优化对嵌入式系统的性能影响。刘露、李小进等人[8]通过研究处理器功耗与代码优化的关系,验证代码优化能影响cache命中率从而改善硬件功耗。王荣胜等[9]研究了基于ARM编译器的优化策略,并通过软硬件的综合测试来验证包括循环优化,指令归并优化,延迟分支等各项优化策略的效果。江毛进、陆鑫达等人[10]讨论了循环优化的目标和循环优化的各种程序变换方法。本文提出多层嵌套循环计数值组合、循环处理数据合并和循环最优展开等优化方法。

2.1 循环计数值组合

多层嵌套循环需要多个循环计数器。对于ARM架构,一个计数器可满足循环计数低于32位的循环体。实际应用中,循环计数一般<32位,则可将多个循环计数值组合放在一个寄存器中,最内层的循环计数值放在寄存器的最高位,依次类推。组合方式可依据总的循环次数和循环嵌套层数来决定。以矩阵乘法程序为例,程序流程图如图1所示。

以上代码经ARM-Linux-gcc3.4.5编译后的代码的主要部分如下

上述程序中3层循环的3个计数变量全都存储在内存中,这样严重影响了程序的性能。但若将3个变量全部存储在寄存器中这样又增加了寄存器使用数量。因此,对程序进行循环计数值合并到寄存器的优化。取1个寄存器r3,最低8位放最外层循环计数变量,第2个8位放中间层循环计数值,第3个8位放最内层循环计数值。同时利用条件执行来取代比较指令。优化后的程序如下

上述程序首先对r3的16~23位进行减1运算,直到结果为负便完成最内层循环计数。接着用加来清除位16-31。然后对r3的位8~15减28来完成中间层循环计数。最外层循环也采用相同的处理方法。由此既节省了寄存器资源,又发挥了ARM加减指令处理宽范围常数的能力,ARM桶形寄存器的移位处理能力和ARM指令条件执行的优势。

理论上,当循环程序循环次数不超过32位,则不论循环嵌套多少层,均可将循环的计数值移位组合到一个寄存器中。单个寄存器组合一般情形:设循环嵌套层数为n,循环由外向内每层循环次数分别为(i=1,2,3,…,n)。则有

设每个Xi(i=1,2,3,…,n)的二进制位数分别为Bi(i=1,2,3,…,n)。则有

各层循环均优化成减计数循环,各层循环的减1计数归纳为

再结合循环结束条件控制循环跳转与计数值重装即可完成循环控制。

2.2 循环处理数据合并

ARM在处理<32位长度的变量(字节数据,双字节数据等)时,可将多个数据存放在单个32位寄存器中,即可减少代码尺寸,又能改善性能。以图像合并程序为例,程序流程如图2所示。

以上程序经ARM-Linux-gcc3.4.5编译后的代码的主要部分如下

上述程序中,处理1 Byte的数据全部采用32位寄存器。且每个字节的处理均有多次内存操作。不仅浪费寄存器资源,同时频繁访问内存影响程序性能。因此可将4 Byte数据一次合并到一个寄存器中,通过移位的方式来进行单字节的处理。经二次优化后的主要代码如下

ARM处理器中采用SIMD向量扩展作为计算加速部件,利用128或256位的SIMD寄存器对多个字符型、整型、浮点型数据同时进行相同操作,实现一种细粒度的数据级并行[11]。将4 Byte存放在一个寄存器中,使一次循环能处理多个数据。充分利用寄存器资源以及ARM桶形寄存器对移位所提供的硬件支持,使程序运行在性能最优化状态。

2.3 循环最优展开

通过多次执行循环内部语句来展开循环,可减小循环开销。但当循环计数值不是展开次数的倍数或循环计数值比展开次数小时,需要对循环展开做一些特殊处理。实际情况中,循环展开次数与剩余循环的处理,循环体变量个数以及处理器能提供寄存器数量均有关[12]。当上述情况不存在时,循环展开多少次对性能提升最优也需要有一定理论依据。本文基于ARM指令的周期数及其所处理的数据格式特点为依据,以最佳次数展开循环,使得关键程序性能提升最大化。以内存设置程序为例,程序流程图如图3所示。

该代码经过ARM-Linux-gcc3.4.5编译后的代码的主要部分如下

为提高效率,需使用STR或STM指令一次写入多个字节。因此,首先需对齐数组指针s边界。但只有当循环次数n足够大时,对齐才有意义。因此,设足够大的循环次数为N1,在n≥N1时,对齐数组指针s边界。且N1必须≥3,否则数据不足4 Byte,也就无所谓字边界对齐问题。对齐处理后,一次循环使用4条批量存储指令,每条指令写8个字,这样每次可操作128Byte存储单元。但只有在n≥N2≥128的前提下才值得这样做,此处N2为上限值。最后,还剩下n≤N2个字节要设置。但STR指令一次存储4 Byte,当n<4时,再使用STRB指令单字节操作剩余的字节单元。上述过程优化后的代码如下

上述算法中以128Byte,4Byte和1Byte的形式进行,则按块分解循环次数n可表示为n=128n128+4n4+n1,0≤n4<32,0≤n1<4。则有以下3种情形,如表1所示。

(1)0≤n<N1时,ARM920T上占用5n+6个周期;

(2)N1≤n<N2时,处理对齐时平均占用9个周期,处理128Byte时占用6个周期。最后处理4Byte和单字节时占用5(32n128+n4)+5(n1+z1)+2个周期,此处n1=0时,z1=1;否则为0。因此,共占用5(32n128+n4+n1+z1)个周期;

(3)N2≤n时,与(2)中类似,总周期数为5(n4+z4+n1+z1)+32,列表如表1所示。

比较上表可知:当n4≥1时,第2行值小于第一行,除非n4=1或n4=0。设置N1为5,从第1行和第2行来选择最佳的周期。只要当n128≥1时,第2行的值就小于第2行的值。因此取N2为128。综上所述,在循环展开的过程中,可根据处理器指令周期特点以及程序处理数据的特征,列出与展开相关的指令周期多项式。根据多项式系数特征确定最优展开次数。

3 实验

3.1 实验环境

本文通过硬件实验验证优化方法的有效性。实验环境如下:硬件平台:精致2440开发板;处理器:S3C2440;内核:ARM920T;操作系统内核版本:Linux2.6.22.6;编译工具:ARM-Linux-gcc-3.4.5。

3.2 实验过程

取3组经典程序,矩阵乘法程序,图像合并程序和内存设置程序。将其编译成两种汇编程序,即原始程序和编译器最优程序。将原始程序进行二次优化得到二次优化程序。将其分别运行在目标平台上。统计1 000次实验数据,利用Matlab7.0获得性能直方图,通过对比分析验证优化手段的有效性。

3.3 实验结果分析

3个程序运行平均时间如图4所示,寄存器使用数量、代码行数以及性能对比如表2~表4所示。

上述实验数据表明,3个经典程序经二次优化后,性能均优于原始程序和编译器最优程序。矩阵乘法程序和图像合并程序的代码也得到了精简,利于节省内存空间;寄存器使用方面,矩阵乘法程序利用循环计数值合并优化,利于节省寄存器资源;而图像合并程序和内存设置程序以牺牲寄存器资源换取程序性能的大幅提升。

4 结束语

本文提到的3种优化方法中,循环计数值的组合应用灵活,各种架构均可参考应用。但对于循环计数值超过32位时,如何应用多个寄存器进行组合并改善性能还有待研究。而循环的最优展开次数需根据处理器架构和程序的特点来确定,且需要列出指令周期多项式,过程较为繁琐,实际应用中可根据性能要求取舍。循环处理数据合并适用于图像和字符处理,内存对齐虽增加一定开销,但数据量较大时实用性较强。

摘要:在嵌入式系统软件开发过程中,GCC编译循环程序时的窥孔优化比较欠缺,编译代码在性能上较ARM商业编译器低。文中提出针对于ARM9处理器的循环计数值组合、循环处理数据合并和循环最优展开等3种窥孔优化方法优化汇编代码。选取矩阵乘法,图像合并和内存设置等经典程序运行在ARM9平台上,分别验证3种窥孔优化方法。实验数据表明,与GCC编译代码相比,经文中提出的方法优化后的代码在寄存器使用数量上,平均节省了50%,性能提升近2倍。

关键词:窥孔优化,循环计数值组合,循环处理数据合并,循环最优展开

ARM体系论文 篇2

2008-08-13 13:55

由于很多人总问这个问题,所以这里做一个总结文档供大家参考。

这里必须先说明,以下的步骤都是针对Linux系统的,并不面向WinCE。也许你会注意到,现在做嵌入式的人中,做linux研究的人远比做WinCE的人多,很多产家提供的资料也是以linux为主。我一直很难理解,其实WinCE的界面比linux的界面好看多了,使用起来也很方便,更为重要的是,WinCE的开发和Windows下的开发基本一样,学起来简单得多,但是学linux或者使用linux做嵌入式的人就是远比WinCE多。在和很多工作的人交流时我了解到,他们公司从没考虑使用WinCE,因为成本高,都是使用linux进行开发。我读研究生的的实验室中也没有使用WinCE的,大都研究linux,也有少部分项目使用vxwork,但是就没有听说过使用WinCE的,原因就是开源!当然现在WinCE6.0听说也开源,不过在成本和资源上linux已经有了无人能挡的优势。与此相对应的是,越来越多的电子厂商已经开始使用linux开发产品。举个例子,Google近期开发的智能手机操作系统Android其实就是使用linux-2.6.23内核进行改进得到的。

第一,学习基本的裸机编程。

对于学硬件的人而言,必须先对硬件的基本使用方法有感性的认识,更必须深刻认识该硬件的控制方式,如果一开始就学linux系统、学移植那么只会马上就陷入一个很深的漩涡。我在刚刚开始学ARM的时候是选择ARM7(主意是当时ARM9还很贵),学ARM7的时候还是保持着学51单片机的思维,使用ADS去编程,第一个实验就是控制led。学过一段时间ARM的人都会笑这样很笨,实际上也不是,我倒是觉得有这个过程会好很多,因为无论做多复杂的系统最终都会落实到这些最底层的硬件控制,因此对这些硬件的控制有了感性的认识就好很多了

学习裸机的编程的同时要好好理解这个硬件的构架、控制原理,这些我称他为理解硬件。所谓的理解硬件就是说,理解这个硬件是怎么组织这么多资源的,这些资源又是怎么由cpu、由编程进行控制的。比如说,s3c2410中有AD转换器,有GPIO(通用IO口),还有nandflash控制器,这些东西都有一些寄存器来控制,这些寄存器都有一个地址,那么这些地址是什么意思?又怎么通过寄存器来控制这些外围设备的运转?还有,norflash内部的每一个单元在这个芯片的内存中都有一个相应的地址单元,那么这些地址与刚刚说的寄存器地址又有什么关系?他们是一样的吗?而与norflash相对应的nandflash内部的储存单元并不是线性排放的,那么s3c2410怎么将nandflash的地址映射在内存空间上进行使用?或者简单地说应该怎么用nandflash?再有,使用ADS进对ARM9行编程时都需要使用到一个初始化的汇编文件,这个文件究竟有什么用?他里面的代码是什么意思?不要这个可以吗?

诸如此类都是对硬件的理解,理解了这些东西就对硬件有很深的理解了,这对以后更深一步的学习将有很大的帮助,如果跳过这一步,我相信越往后学越会

觉得迷茫,越觉得这写东西深不可测。因为,你的根基没打好。

不过先声明一下,本人并没有使用ADS对ARM9进行编程,我是学完ARM7后直接就使用ARM9学linux系统的,因此涉及使用ADS对ARM9进行编程的问题我很难回答^_^,自己去研究研究吧。

对于这部分不久将提供一份教程,这个教程中的例程并不是我为我们所代理的板子写的,是我在我们学院实验室拿的,英培特为他们自己的实验箱写的,不过很有借鉴意义,可以作为一份有价值的参考。

第二,使用linux系统进行一些基本的实验。

在买一套板子的时候一般会提供一些linux的试验例程,好好做一段时间这个吧,这个过程也是很有意义的,也是为进一步的学习积累感性认识,你能想象一个从没有使用过linux系统的人能学好linux的编程吗?好好按照手册上的例程做一做里面的实验,虽然有点娃娃学走路,有点弱智,但是我想很多高手都会经历这个过程。

在这方面我们深蓝科技目前没有计划提供相应的例程,主要是开发板的提供商会提供很丰富的例程,我们不做重复工作,只提供他们没有的、最有价值的东西给大家。

第三,研究完整的linux系统的的运行过程。

所谓完整的linux系统包括哪些部分呢?

三部分:bootloader、linux kernel(linux内核)、rootfile(根文件系统)。那么这3部分是怎么相互协作来构成这个系统的呢?各自有什么用呢?三者有什么联系?怎么联系?系统的执行流程又是怎么样的呢?搞清楚这个问题你对整个系统的运行就很清楚了,对于下一步制作这个linux系统就打下了另一个重要的根基。介绍这方面的资料网上可以挖掘到几吨,自己好好研究吧。第四,开始做系统移植。

上面说到完整的linux有3部分,而且你也知道了他们之间的关系和作用,那么现在你要做的便是自己动手学会制作这些东西。

当然我不可能叫你编写这些代码,这不实现。事实上这个3者都能在网下载到相应的源代码,但是这个源代码不可能下载编译后就能在你的系统上运行,需要很多的修改,直到他能运行在你的板子上,这个修改的过程就叫移植。在进行移植的过程中你要学的东西很多,要懂的相关知识也很多,等你完成了这个过程你会发现你已经算是一个初出茅庐的高手了。

在这个过程中如果你很有研究精神的话你必然会想到看源代码。很多书介绍你

怎么阅读linux源代码,我不提倡无目的地去看linux源代码,用许三多的话说,这没有意义。等你在做移植的时候你觉得你必须去看源代码时再去找基本好书看看,这里我推荐一本好书倪继利的《linux内核的分析与编程》,这是一本针对linux-2.6.11内核的书,说得很深,建议先提高自己的C语言编程水平再去看。

至于每个部分的移植网上也可以找到好多吨的资料,自己研究研究吧,不过要提醒的是,很多介绍自己经验的东西都或多或少有所保留,你按照他说的去做总有一些问题,但是他不会告诉你怎么解决,这时就要靠自己,如果自己都靠不住就找我一起研究研究吧,我也不能保证能解决你的问题,因为我未必遇到过你的问题,不过我相信能给你一点建议,也许有助你解决问题。

这一步的最终目的是,从源代码的官方主页上(都是外国的,悲哀)下载标准的源代码包,然后进行修改,最终运行在板子上。

盗用阿基米德的一句话:“给我一根网线,我能将linux搞定”。

第五,研究linux驱动程序的编写。

移植系统并不是最终的目的,最终的目的是开发产品,做项目,这些都要进行驱动程序的开发。

Linux的驱动程序可以说是五花八门,linux2.4和linux2.6的编写有相当大的区别,就是同为linux2.6但是不同版本间的驱动程序也有区别,因此编写linux的驱动程序变都不是那么容易的事情,对于最新版本的驱动程序的编写甚至还没有足够的参考资料。那么我的建议就是使用、移植一个不算很新的版本内核,这样到时学驱动的编程就有足够的资料了。

这部分的推荐书籍可以参考另一篇文章《推荐几本学习嵌入式linux的书籍》。第六,研究应用程序的编写。

做作品做项目除了编写驱动程序,最后还要编写应用程序。现在的趋势是图形应用程序的开发,而图形应用程序中用得最多的还是qt/e函数库。我一直就使用这个函数库来开发自己的应用程序,不过我希望你能使用国产的MiniGUI函数库。盗用周杰伦的广告词就是“支持国产,支持MiniGUI”。MiniGUI的编程比较相似Windows下的VC编程,比较容易上手,效果应该说是相当不错的,我曾使用过来开发ARM7的程序。不过MiniGUI最大的不好就是没有像qtopia这样的图形操作平台,这大大限制了他的推广,我曾经幻想过与北京飞漫公司(就是MiniGUI的版权拥有者)合作使用MiniGUI函数库开发像qtopia这样的图形操作平台,不过由于水平有限这只能是幻想了,呵呵。

完成这一步你基本就学完了嵌入式linux的全部内容了。

还有一个小小的经验想和大家分享。我在学习嵌入式linux的过程中很少问人,客观原因是身边的老师、同学师兄都没有这方面的高手,主观原因是我不喜欢问人,喜欢自己研究解决问题。这样做有个好处,就是可以提高自己解决问题的能力,因为做这些东西总有很多问题你难以理解,别人也没有这方面的经验,也不是所有问题都有人给你答案,这时必须要自己解决问题,这样,个人的解决问题能力就显得非常关键了。因此我的建议就是一般的问题到网上搜索一下,确实找不到答案了就问问高手,还是不行了就自己去研究,不要一味去等别人帮你解决问题。

ARM体系论文 篇3

记者:为何称“Cortex-A50系列两个处理器A53和A57的发布可能是在ARM公司成立25周年以来最重要的一个产品发布”?

Mike Inglis:因为这是我们第一个64位的产品, 它将改变无论是移动计算还是服务器, 还是网络方面未来市场的版图。

ARM的64位处理器系列的两款产品, 未来主要针对三大类不同的应用, 第一类是移动和平板电脑之类的产品;第二类是网络;第三类是服务器。我们的新系列以及两款处理器, 也得到了来自我们很多合作伙伴的支持。

记者:两个核的特点是什么?

Mike Inglis:Cortex-A57是ARM最先进、性能最高的应用处理器, 而Cortex-A53不仅是功耗效率最高的ARM应用处理器, 也是全球最小的64位处理器。这两款处理器可各自独立运作或整合为ARM big.LITTLE处理器架构, 以结合高性能与高功耗效率的特点。

在此前推出的ARM Artisan物理IP及POP IP内核硬化加速技术以及先进CMOS与鳍式场效应晶体管 (FinFET) 制程技术的支持下, Cortex-A57与Cortex-A53处理器可提供数GHz级别的性能。

记者:ARM为什么要推64位处理器?

Mike Inglis:首先在网络设备或网络应用领域, 传统上是以64位进行开发的。另外, 随着我们智能手机或者超级手机当中的内存在不断地扩大, 未来也对64位提出了更多的要求。PC市场花了八年的时间从32位过渡到64位, 我相信手机或者移动市场转变会快得多, 但是也不会一蹴而就的, 所以这也是为什么我们在新的架构中同时兼容了32位和64位。还有, 对64位的需求来自于厂商, 他们开发的产品希望可以覆盖到从平板到普通电脑, 他们希望在这些产品当中能够实现软件的一致性和统一性, 所以也会对64位有一个大的需求。因此, 我们在服务器、网络这些领域转变的速度会快一些, 在移动市场的转变可能稍微慢一些。

移动业将重塑半导体业

记者:为何移动业将会塑造半导体业?Mike Inglis:未来影响半导体行业的可能有两大因素, 第一个是量的因素, 可以看到PC现在的年销售量大概是在亿以上的级别, 但是移动市场的出货量是几十亿的, 高了一个数量级, 未来半导体行业肯定会需要关注量更大的一些市场。第二个就是从利润率的角度, PC业其实是利润率是相对比较高的, 尽管可能很大的一部分利润都被个别厂商占去了。在移动市场上, 有很多产品的零售价可能也就是几十美元 (几百元人民币) , 它本身没有办法去获得很大的利润率, 这样也对半导体业提出了一个很高的要求。我们可以看到的是, PC行业过去几年可能没有什么大的创新和变化, 但是我们目前看到使用计算设备的习惯或者方式发生了很大的变化, 越来越多的人开始使用平板电脑等具有创新功能的移动设备, 这些创新并不意味着可能尺寸小一点, 而是这种使用方式是完全不同于传统PC的, 这是我们真正所谓的创新。

记者:你们去年刚推出A15, 现在客户是否应该升级到新核?会不会只有高通这样有实力的公司才可以跟得上这样的步伐?一些中小公司是不是就没有这样的机会?

Mike Inglis:没有一个单一尺寸的产品适用于所有应用, 我们需要根据不同应用的需求以及它的一些功耗的水平, 对处理器进行不同的设置。

实际上, 不是ARM要把产品更新换代、推得更快, 因为ARM每一代新产品的模式都是通过与一些领先的合作伙伴来推动的。比如A50系列, 有AMD、海思等公司的推动。我们一定要有足够多的合作伙伴来推动, 才会做下一代产品, 所以从这个角度来看, 一定有特定的群体、足够的需求。

至于客户用得起的问题, 并不是说所有的中国客户都一定要同质化、有一样的选择。比如平板电脑, 中国今年到三季度为止出货量已经超过3千万了, 我们预计到四季度大概会有5千万。全球平板今年出货量也不过1.5亿左右, 所以中国占了三分之一以上。中国公司设计的芯片, 有基于A8、A9单核、A9双核, 甚至有A5单核、A5双核的。这个选择性还是因为消费市场是多样化的, 每家公司根据自己的定位与执行能力有不同的选择。ARM产品之所以现在这么广泛, 从某种程度上也针对了不同层次或不同群体的客户的需求。

记者:竞争对手也有6 4位产品, ARM的优势是什么?

Mike Inglis:明显的优势有两个:一个从整个的功耗来看, 我们持续了ARM的功耗优势, 整个的功耗保持在同一水平。第二是芯片系统支持方面, 现在兼容原来32位的所有应用, 这样就保证了我们开始就有一个可以使用的系统, 再加上32位应用运行在64位的A53和A57上, 处理能力也得到了很大的提高。还有一个优势, 我们有广泛的应用后, 对于生态系统的滚雪球发展很有帮助。

中国市场

记者:ARM如何看待中国市场?

Mike Inglis:毫无疑问, 中国对ARM来说是很重要的市场。在过去十年我们在这个市场取得了一些非常令人兴奋的成绩, 截至2012年10月底, 我们在华累计出货量已经超过了15亿了, 其中2011年就出货了6亿多个, 2007年时我们的出货量才二三千万, 所以成长大概是二三十倍。

我们的业务模式决定了只有当我们的合作伙伴设计成功, 他们的芯片被真正意义上销售了之后, 我们才能赚到我们应该赚到的钱。所以我们希望我们所有的合作伙伴都能成功, 而这种成功是没有办法在互相抄袭的基础上获得的, 我们必须帮助他们差异化, 帮助他们将自己设计的有价值的IP加入到其产品的设计当中去。

我们都是消费者, 有人迷品牌, 有人是迷品质, 有人迷外形, 价钱也是个决策点。但也正是因为如此, ARM能够促使这个市场玩家更多, 合作伙伴更多。

——Mike Inglis

就像过去PC业对半导体业有非常重要的塑造功能, 未来应该是由移动行业来塑造半导体企业的未来。

——Mike Inglis

ARM学习心得体会 篇4

1.懂得了如何使用IAR的软件使用,使用前要先进行环境的设置,具体见文档IAR使用说明。

2.第一次是学习点亮LED灯,在点亮LED灯中学习到如果要点亮LED灯必须学会调用已经写好的库函数,对系统进行初始化SystemInit();对IO口进行初始化GPIOInit();,还得对GPIO口的设置GPIOSetDir--设置GPIO口为输入为1的IO口,设置完成后就可以对IO口成为输入输出方向,当要点亮LED灯时,要使用到GPIOSetValue();函数,当为确定好某个IO口确定时,后一个为0时可以设置LED灯为点亮了,然后就可以对IO口进行设置了,用法和单片机基本一致,具体可以参考程序《闪灯》。

3.蜂鸣器的鸣响很简单,就是首先对蜂鸣器的IO端口进行设定以驱动蜂鸣器,GPIOSetDir(PORT3, 3, 1);当蜂鸣器需要鸣响时,直接对PORT3_3端口进行赋值0《GPIOSetValue(PORT3, 3, 0);》不让蜂鸣器鸣响则是(GPIOSetValue(PORT3, 3, 01);)就可以了。4.串口的使用

串口开始时要初始化出口,并且通过串口打印前会把数据存在数据缓存区里面,如果我们需要通过输入值来控制ARM板子的功能时,可以读取缓存区(UARTBuffer[UARTCount-1])的内容(缓存区的内的数据都是字符型数据【char】)然后就可以通过输入的值来处理,可以用中断方式,也可以用查询方式,可参考串口中断程序 5.中断的使用

使用中断时需要初始化中断例如:

init_timer32(TEST_TIMER_NUM,TIME_INTERVAL);

// 初始化定时器 enable_timer32(TEST_TIMER_NUM);

//使能定时器使定时器工作 LPC_SYSCON->SYSAHBCLKCTRL |=(1<<6);//能AHB时钟,为GPIO提供时钟源

通过定时器就可以在定时器内直接操作例如图1:

图1 定时器的使用操作要先开使能,与定时器的定时方式如 图2

图2 6.外部中断

外部中断时要先对外部中断的方式进行设置,是下降沿触发还是上升沿触发方式或其他,图3 7.步进电机

InitStep();

//步进机相关引脚初始化

对了步进电机的引脚初始化后就可以对步进电机的转动方向进行控制了,如图4

图4 当MOTOR_CCW 时,为反转方式 8.键盘扫描

对键盘进行操作时,可以对键盘进行操作,可以通过串口输入1~8来控制灯的闪动情况,初始化如图5

图5 对键盘的操作时使用可以参考如下图6:

图6 9.I2C 在I2C中首先要在头文件定义一个#define __DEBUG_FLASH,使后面的程序生效。图7所示:

图7 在I2C里面要输出温度值的后面三位小数要经过处理,如图8所示:

图8 10.ADC芯片

在用到ADC芯片时,可以显示阻值或者mv显示,需经过处理如图9所示:

上一篇:肥料化利用下一篇:离心泵的安装与维护