加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 ARM编程起步

ARM编程起步.pdf

ARM编程起步

v53374594
2010-01-03 0人阅读 举报 0 0 暂无简介

简介:本文档为《ARM编程起步pdf》,可适用于IT/计算机领域

StudyARMStepbyStepNickwang编著共页StudyARMStepbyStep自序本文从学习者的角度出发,分别描述了下面几部分内容:ARM编程的基本知识,BOOT代码流程和功能分析,OS中断程序的编写举例和BOOT代码的流程图,希望这些内容能为初学ARM的朋友拨开迷雾,以最快的速度和最短的时间走进嵌入世界的大们由于编写时间比较急(呵呵,因为还要工作养家糊口),所以错误不可避免,希望各位朋友能指出错误和缺陷共页StudyARMStepbyStep目录第一章:ARMABC¾THEARMPROCESSOR—缩写—处理器模式及对应的寄存器—ARM寄存器总结¾ARMINSTRUCTIONS—指令集概述—指令的条件执行—程序分支—DataMovementMemoryReferenceInstructions¾EXAMPLES—向量乘—字符串比较—子程序调用第二章:引导代码分析¾前言¾概述—与BOOT相关硬件:FLASHROM—BOOT的主要功能¾执行流程及代码分析‹参数初始化参‹‹参数数初初始始化化‹中断‹初始化硬件‹跳转到C语言程序开始第二阶段的初始化和系统引导共页‹初始化堆栈StudyARMStepbyStep第三章:中断服务程序编写¾必需的变量定义—服务程序地址—IO端口—INTERRUPT控制寄存器—EINT的Pending位¾变量解释¾中断服务程序的实现—定义中断服务程序—主程序—中断服务子程序中关键的变量类型—断服务程序运行流程图第四章:BOOT流程图附录:BOOT程序源代码共页StudyARMStepbyStep第章第一章:ARMABC¾TheARMProcessor—缩写ARM:AdvancedRISCMachinesRISC:ReducedInstructionSetComputer(精简指令集)—处理器模式及对应的寄存器ARM支持下面种处理器模式,在正常情况下,程序都在用户模式下执行,当软件异常或硬件中断发生时,进入相应的处理器模式():用户(usr):正常程序执行模式共页编者:王宇行(Nick)Mail:MicroyahoocomMSN:galaxyhotmailcomQQ:Mobile:寄存器:StudyARMStepbyStep共页编者:王宇行(Nick)Mail:MicroyahoocomMSN:galaxyhotmailcomQQ:Mobile:r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,CPSR():FIQ(fiq):高速数据传送或通道处理寄存器:r,r,r,r,r,r,r,r,rfrq,rfrq,rfrq,rfrq,rfrq,rfrq,rfrq,r,CPSR():IRQ(irq):通用中断处理寄存器:r,r,r,r,r,r,r,r,r,r,r,r,r,rirq,rirq,r,CPSR():管理(svc):操作系统保护模式寄存器:r,r,r,r,r,r,r,r,r,r,r,r,r,rsvc,rsvc,r,CPSR():中止(abt):存储器保护寄存器:r,r,r,r,r,r,r,r,r,r,r,r,r,rabt,rabt,r,CPSR():未定义(und):未定义指令寄存器:r,r,r,r,r,r,r,r,r,r,r,r,r,rundStudyARMStepbyStep,rund,r,CPSR在程序正常执行时,如果发生外部普通中断IRQ,就会进入IRQ处理器模式,这时处理器使用rirq和rirq,而不是r和r注释R:程序计数器programcounter她指向的是下一条要执行的指令而不是正在执行的指令R:当执行带链接分支的指令BL时,得到R的副本R:作堆栈指针(SP),通常在BOOT程序里把r初始化成指向为异常模式分配的堆栈异常处理程序将用到的寄存器的值保存到堆栈里,返回时,重新将这些值加载到寄存器共页编者:王宇行(Nick)Mail:MicroyahoocomMSN:galaxyhotmailcomQQ:Mobile:举例:未定义模式堆栈初始化StudyARMStepbyStep共页编者:王宇行(Nick)Mail:MicroyahoocomMSN:galaxyhotmailcomQQ:Mobile:UNDEFMODEDEFINExb()MODEMASKDEFINExf()NOINTDEFINExc()mrsr,cpsr把状态寄存器的值送到rbicr,r,#MODEMASK把cpsr的低四位清零orrr,r,#UNDEFMODE|NOINT把r的值置为:然后送给rmsrcpsrcxsf,r把r的值送到状态寄存器cpsr现在的值是:cpsr:=相当于禁止IRQ和FIQ中断cprs:=处理器的工作模式:未定义ldrsp,=UndefStack把堆栈的位置送给SP—ARM寄存器总结StudyARMStepbyStep共页编者:王宇行(Nick)Mail:MicroyahoocomMSN:galaxyhotmailcomQQ:Mobile:ARM有个位的registers(r到r)r充当程序计数器PC,r(linkregister)存储子程序的返回地址,r是堆栈地址ARM有一个当前程序状态register:CPSR一些registers(r,r)在异常发生时会产生新的instances,比如IRQ处理器模式,这时处理器使用rirq和rirqARM的子程序调用是很快的,因为子程序的返回地址不需要存放在堆栈中¾ARMInstructions—指令集概述运算指令集ADDAddRd OpOpADCAddwithcarryRd OpOpCSUBSubtractRd OpOpSBCSubtractwithcarryRd OpOpC–RSBReversesubtractRd OpOpRSCReversesubtractwithcarryRd OpOpC–MULMultiplyRd OpxOpMLAMultiplyandaccumulateRd RmxRsRnStudyARMStepbyStep共页编者:王宇行(Nick)Mail:MicroyahoocomMSN:galaxyhotmailcomQQ:Mobile:位操作指令集ANDLogicalANDRd Op OpORRLogicalORRd Op OpEORExclusiveORRd Op OpBICLogicalANDNOTRd Op NOTOp比较测试指令集CMPCompareSetconditioncodesonOpOpCMNComparenegatedSetconditioncodesonOpOpTSTestSetconditioncodesonOpOpTEQTestequivalenceSetconditioncodesonOpOp数据移动,访问指令集MOVMoveRd OpMVNMovenegatedRd NOTOpLDRLoadregisterRd M(ea)STRStoreregisterM(ea) RdLDMLoadregistersmultipleStudyARMStepbyStepLoadablockofregistersfrommemorySTMStoreregistersmultipleStoreablockofregistersinmemoryAADDDDSSrr,,rr,,rr与与共页编者:王宇行(Nick)Mail:MicroyahoocomMSN:galaxyhotmailcomQQ:Mobile:AADDDDrr,,rr,,rr有有何何区区别别如如果果有有SS后后缀缀,,要要根根据据计计算算结结果果修修改改状状态态寄寄存存器器的的条条件件码码标标志志位位—指令的条件执行几乎所有的ARM指令均可包含一个可选的条件码,只有在CPSR中的条件码标志满足指定的条件时,指令才执行我们要作的就是把条件定义附加加在指令的后面如:Addr,r,r这条指令无条件地执行如下操作:rÅrr然而对于下面的指令就不是无条件执行了ADDEQr,r,r这条指令只有当CPSR里的Zbit位为时才执行加法操作StudyARMStepbyStep共页编者:王宇行(Nick)Mail:MicroyahoocomMSN:galaxyhotmailcomQQ:Mobile:IFZ=THENrÅrr举例Example:IFx=yTHENp=qrELSEIFx<yTHENp=qr假设:x,y,p,q,r分别存在r,r,r,r,r中CMPr,rcomparexandyADDEQr,r,rIFx=yTHENp=qrSUBLSr,r,rELSEIFx<yTHENp=q–rExample:IF(a=b)AND(c=d)THENe=e假设:a,b,c,d,e分别存在r,r,r,r,r中CMPr,rCompareaandbCMPEQr,rIfa=bTHENcomparecanddADDEQr,r,#ifc=dthenincrementeby—程序分支StudyARMStepbyStep共页编者:王宇行(Nick)Mail:MicroyahoocomMSN:galaxyhotmailcomQQ:Mobile:简单的无条件转移unconditionalbranchBNextbranchto"Next"有条件转移如果CPSR的Zbit是时,跳转如下例:MOVR,#loadtheloopcounterRwithNextbodyofloopSUBSR,R,#decrementloopcounterBNENextrepeatuntilloopcount=zero带链接转移(类似子程序调用)BLNextbranchto"Next"withlink这种情况下用R来保存R的值,然后在跳转到子程序处rÅPCcopyprogramcountertolinkregisterrÅNextjumpto"Next"—DataMovementMemoryReferenceInstructions从一个RegisterCopy数据到另一个RegisterMOVr,#rÅClearrMOVr,r,LSL#rÅr*MOVNEr,r,ASR#IFZ=THENrÅrMOVSr,r,LSL#rÅr*updateStudyARMStepbyStep共页编者:王宇行(Nick)Mail:MicroyahoocomMSN:galaxyhotmailcomQQ:Mobile:conditioncodesMVNr,#rÅthe'scomplementofisMVNr,rrÅrcomplementthebitsofrMVNr,#xFrÅxFFFFFFF存储器与寄存器交换数据LDRr,rloadrwiththewordpointedatbyrSTRr,rstorethewordinrinthelocationpointedatbyrLDRr,r,#effectiveaddress=r,risunchangedLDRr,r,#!effectiveaddress=r,rÅrLDRr,r,#effectiveaddress=r,rÅr¾Examples—向量乘s=A·B=a·ba·ba·ban·bnStudyARMStepbyStep共页编者:王宇行(Nick)Mail:MicroyahoocomMSN:galaxyhotmailcomQQ:Mobile:MOVr,#clearinitialsuminrMOVr,#loadloopcounterwithn(assumehere)ADRr,ArpointsatvectorAADRr,BrpointsatvectorBNextLDRr,r,#Repeat:getAiandupdatepointertoALDRr,r,#getBiandupdatepointertoBMLAr,r,r,rs=sAixBiSUBSr,r,#decrementloopcounterBNENextrepeatntimes—字符串比较比较两个byte的串ADRr,StringrpointstothefirststringADRr,StringrpointstothesecondstringLDMIAr,{rr}getfirstbytestringinrtorLDMIAr,{rr}getsecondbytestringinrtorCMPr,rcomparetwobytechunksCMPEQr,rifpreviousbytessamethencomparenextCMPEQr,randsoonCMPEQr,rBEQEqualiffinalsamethenstringsareequalStudyARMStepbyStep共页编者:王宇行(Nick)Mail:MicroyahoocomMSN:galaxyhotmailcomQQ:Mobile:NotEq………………ifweendherethenstringnotsameEqual………………—子程序调用SUBThisisthefirstsubroutine…………STMFDr,(rr,lr)saveworkingregistersandlinkregisterBLSUBcallsubroutineSUB…………………………LDMFDr,(rr,pc)restoreworkingregistersandreturn……………SUBasubroutinecalledfromSUB……………MOVpc,lrreturn(copylinkregistertoPC)子程序调用通过带连接的分支指令BL实现,她把返回地址保存StudyARMStepbyStep共页编者:王宇行(Nick)Mail:MicroyahoocomMSN:galaxyhotmailcomQQ:Mobile:在R(LR)里如果一个子程序调用另一个子程序,我们必须在R被第二个子程序调用覆盖前,把她保存在堆栈里StudyARMStepbyStep第二章:引导代码分析¾前言学习ARM都不可避免地要了解系统引导引导程序是系统加电后运行的第一段软件代码本章將以SCBX为目标来分析引导程序,希望能对朋友有所帮助。¾概述—与BOOT相关硬件:FLASHROM系统启动以后,SCBX的编址方式如下图:共页编者:王宇行(Nick)Mail:MicroyahoocomMSN:galaxyhotmailcomQQ:Mobile:第章StudyARMStepbyStep从上图可以看出,SCBX的最大寻址空间为M*=M和SCB不同,SCBX处理器不支持MemoryRemap挂共页编者:王宇行(Nick)Mail:MicroyahoocomMSN:galaxyhotmailcomQQ:Mobile:挂挂接接接BBBOOOOOOTTTRRROOOMMMSCBX自身不具有ROM因此必须外接ROM器件来存放掉电后仍需要保存的代码和数据,比如BootROMStudyARMStepbyStepimage在SCBX芯片上有个管脚nGCS:用来做外接ROM芯片选择,如果ROM芯片的使能管脚nCE和SCBX的管脚nGCS相连(见下图),就相当于把ROM映射在SCBX的bank地址空间(见下面的电路图)从上面的地址映射图可以看出BANK的起始地址为x,SCBX在系统复位的时候处理器从x地址开始执行程序所以SCBX系统加电后运行的第一段软件代码就是映射在BANK的ROM里存放的代码我们要做的就是:把FLASHROM如下图接在BANK把BOOTimage烧在FLASHROM这样一个裸设备就可启动了BootROM的数据总线宽度(DataBusWidth)由SCBX的管脚OM:的取值来决定:电路原理图:共页编者:王宇行(Nick)Mail:MicroyahoocomMSN:galaxyhotmailcomQQ:Mobile:StudyARMStepbyStep如共页编者:王宇行(Nick)Mail:MicroyahoocomMSN:galaxyhotmailcomQQ:Mobile:如如何何何把把把BBBOOOOOOTTTiiimmmaaagggeee烧烧烧在在在FFFLLLAAASSSHHHRRROOOMMM—BOOT的主要功能‹建立中断异常矢量表异常中断矢量表(ExceptionVectorTable)是BootStudyARMStepbyStep与操作系统发生联系的地方。即使操作系统内核已经得到处理器的控制权运行一旦发生中断处理器还是会自动跳转到从x地址开始的异常中断矢量表中的某个位置(依据于中断类型)读取指令然后运行。SCBX处理器不支持MemoryRemap这意味着一旦发生中断程序必须到FlashMemory中的ExceptionVectorTable里去走一圈对于SCBX,地址x处的异常中断矢量表只简单地包含跳转指令,具体的中断处理由操作系统的中断处理程序来完成如果在Boot执行的全过程中都不必响应中断那么如下的中断矢量表就可以OKbResetHandlerfordebugbHandlerUndefhandlerUndefbHandlerSWISWIinterrupthandlerbHandlerPaborthandlerPAbortbHandlerDaborthandlerDAbortbhandlerReservedbHandlerIRQbHandlerFIQPabortDabort共页编者:王宇行(Nick)Mail:MicroyahoocomMSN:galaxyhotmailcomQQ:Mobile:对于ARM处理器来说由于其内部使用了哈佛结构独立的数据的指令总线,因此在数据指令的读取过程中产生的异常也StudyARMStepbyStep就很自然地可以区分开来本质上而言这些异常都是同属于存储访问失败产生的异常因此这些异常都由MMU相关在ARM手册中DataAbort和PrefetchAbort都称为Memoryabort如如共页编者:王宇行(Nick)Mail:MicroyahoocomMSN:galaxyhotmailcomQQ:Mobile:如果果果BBBoooooottt功功功能能能要要要求求求使使使用用用中中中断断断,,,BBBOOOOOOTTT如如如何何何修修修改改改‹初始化堆栈ARMTDMI支持种OperationMode:UserModeFIQModeIRQModeSupervisorModeAbortModeUndefinedModeBOOT需要为每种模式建立堆栈,这需要初始化其程序状态寄存器(SPSR)和堆栈指针系统需要初始化那些堆栈取决于用户使用了那些中断,以及系统需要处理那些错误类型一般来说管理者堆栈必须设置,如果使用了IRQ中断,则IRQ堆栈也必须初始化StudyARMStepbyStep共页编者:王宇行(Nick)Mail:MicroyahoocomMSN:galaxyhotmailcomQQ:Mobile:‹初始化硬件软件运行离不开硬件,就像男人离不开女人一样(呵呵,和尚除外),BOOT必须要对硬件进行初始化硬件的初始化通过配置特殊控制寄存器来完成,包括下面几个部分:关WatchdogTimer屏蔽所有的中断为中断提供服务通常是OS设备驱动程序的责任因此Boot的执行全过程中可以不必响应任何中断。中断屏蔽可以通过写CPU的中断屏蔽寄存器或状态寄存器(ARM的CPSR寄存器)来完成初始化PLL和时钟PLL的输出频率要就是处理器的工作主频初始化RAMSCBX使用一组专用的特殊功能寄存器来控制外部存储器的读写操作通过对该组特殊功能寄存器编程可以设定外部数据总线宽度,访问周期,定时的控制信号(例如RAS和CAS)等参数这些主要要通过设置个从xC(BWSCON)开始的寄存器(MEMORYCONTROLLERSPECIALREGISGERS)来完成复制RW到DRAM将Zi段清零一个ARM由RORW和ZI三个段组成其中RO为代码段RW是已初始化的全局变量ZI是未初始化的全局变量(与TEXTDATA和BSS相对应)。RO段是只读的在运行的时候不可以改变所以StudyARMStepbyStep在运行的时候RO段可以驻留在Flash里。RW段是可以读写的所以在运行的时候必须被装载到SDRAM或者SRAM里,所以Boot要将RW段复制到RAM中并将ZI段清零,以保证程序可以正确运行。编译器使用下列符号来记录各段的起始和结束地址:|Image$$RO$$Base|:RO段起始地址|Image$$RO$$Limit|:RO段结束地址加|Image$$RW$$Base|:RW段起始地址|Image$$RW$$Limit|:ZI段结束地址加|Image$$ZI$$Base|:ZI段起始地址|Image$$ZI$$Limit|:ZI段结束地址加这些标号的值是根据链接器中对robase和rwbase的设置来计算得到的共页编者:王宇行(Nick)Mail:MicroyahoocomMSN:galaxyhotmailcomQQ:Mobile:StudyARMStepbyStep共页编者:王宇行(Nick)Mail:MicroyahoocomMSN:galaxyhotmailcomQQ:Mobile:‹跳转到C语言程序开始第二阶段的初始化和系统引导¾执行流程及代码分析‹‹‹参参参数数数初初初始始始化化化程序的最开始的地方做变量定义等初始化工作,BOOT也不例外流程图如下:StudyARMStepbyStep共页编者:王宇行(Nick)Mail:MicroyahoocomMSN:galaxyhotmailcomQQ:Mobile:StudyARMStepbyStep‹中断处理中断源外界有很多很多的中断源SCBX用一个中断控制器来管理各种原因产生的中断。如下图:外部中断源共页编者:王宇行(Nick)Mail:MicroyahoocomMSN:galaxyhotmailcomQQ:Mobile:外部中断源当外部中断源产生中断时,他会触发与中断控制器的那根信号线,中断控制器收到这个信号后会检查一下这个中断是否被允许和是否被屏蔽,如果没有的话,就给她排一个处理的优先级,当轮到这个中断时,触发ARM的中断信号通知ARM内核然后ARM内核就会去FLASH访问中断向量表SCBXIRQFRQARM内核中断控制ARM要求中断向量表必须放置在从0x地址开始、连续×字节的空间内每当一个中断发生后处理器会自动跳转到从x地址开始的异常中断矢量表中的某个位置(由中断类型来确定)读取指令然后运行中断处理模式StudyARMStepbyStepSCBX的中断控制器支持两个中断处理模式:普通中断模式(NONVECTOREDINTERRUPTMODE)向量中断模式(vectoredinterruptmode)我们可以通过配置中断控制寄存器INTCON(xE)选择使用那一个模式:INTCON:ThisbitdisablesenablesvectormodeforIRQ:=Nonvectoredinterruptmode:=Vectoredinterruptmode下面代码可以配置为向量中断模式INTCON=x不同的中断模式会有不同的处理方式如图所示:z普通中断模式:EINT软硬件分界线共页编者:王宇行(Nick)Mail:MicroyahoocomMSN:galaxyhotmailcomQQ:Mobile:HandleEINTIsrIRQbHandlerIRQARM核中断控制器CPU从向量表中的地址值x(IRQ)处执行,该处指令是bHandlerIRQ,然后通过IsrIRQ例程计算出相应HandleEINT的值这个值为中断处理程序的起始地址再将此值加载到PC。StudyARMStepbyStepz向量中断模式EINT软硬件分界线共页编者:王宇行(Nick)Mail:MicroyahoocomMSN:galaxyhotmailcomQQ:Mobile:ARM核ldrpc,=HandlerEINTHandleEINT中断控制器和普通中断模式比较向量中断模式下少了一项工作:不执行IsrIRQ子程序。他直接找到了中断服务程序的起始地址,由此可见向量中断模式下处理中断要快一点向量中断模式在向量中断模式下当中断发生时CPU会跳转到向量表中相应中断类型的表项,直接把中断服务例程的起始地址送到PC例如:若产生EINT中断,那么CPU会自动跳转

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/20

ARM编程起步

仅供在线阅读

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利