第三章 ARM程序设计基础 新 2_第1页
第三章 ARM程序设计基础 新 2_第2页
第三章 ARM程序设计基础 新 2_第3页
第三章 ARM程序设计基础 新 2_第4页
第三章 ARM程序设计基础 新 2_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第三章

ARM程序设计基础(2)内容3.1ARM程序设计简介3.2ARM程序设计简单实例3.3ARM初始化程序实例3.4ARM与C语言混合编程3.5BootLoader3.3ARM初始化程序实例基于操作系统的初始化由BootLoader实现不基于操作系统的程序初始化定义常量(地址,数值等等)定义本地异常向量表中断模式的现场保护初始化各模式的堆栈指针复制全局异常向量表修改处理器模式或状态定义常量EQU:名称EQU 表达式[,类型]

说明:EQU用于将程序中的数字常量、标号、基于寄存器的值赋予一个等效的名称,这一点类似于C语言中的#define,可用“*”代替EQU。XEQU22X*33USERMODEEQU 0x10FIQMODE EQU 0x11IRQMODE EQU 0x12SVCMODE EQU 0x13ABORTMODEEQU 0x17UNDEFMODEEQU 0x1bMODEMASKEQU 0x1fNOINT EQU 0xc0I_Bit * 0x80F_Bit * 0x40M4:M0模式0b10000用户0b10001快中断0b10010中断0b10011管理0b10111中止0b11011未定义0b11111系统定义异常向量表AREA Init,CODE,READONLYIMPORT__use_no_semihosting_swi;不使用半主机C库函数IMPORT Enter_UNDEF;外部C函数IMPORT Enter_SWIIMPORT Enter_PABORTIMPORT Enter_DABORTIMPORT Enter_FIQENTRYb ColdResetb Enter_UNDEF ;UndefinedInstructionb Enter_SWI ;syscall_handlerorSWIb Enter_PABORT ;PrefetchAbortb Enter_DABORT ;DataAbortb . ;ReservedHandlerb IRQ_Handler ;IRQHandler;中断现场处理b Enter_FIQ ;FIQHandler定义异常向量表IMPORT:IMPORT标号[,WEAK]

说明:IMPORT告诉编译器这个标号要在当前源文件中使用,但标号是在其他的源文件中定义的。

[,WEAK]选项表示如果所有的源文件都没有找到这个标号的定义,编译器也不会提示错误信息。定义异常向量表IMPORT__use_no_semihosting_swiIMPORT Enter_UNDEFIMPORT Enter_SWIIMPORT Enter_PABORTIMPORT Enter_DABORTIMPORT Enter_FIQUHAL.c文件中定义定义异常向量表b ColdReset ;b Enter_UNDEF ;UndefinedInstructionb Enter_SWI ;syscall_handlerorSWIb Enter_PABORT ;PrefetchAbortb Enter_DABORT ;DataAbortb . ;ReservedHandlerb IRQ_Handler ;IRQHandlerb Enter_FIQ ;FIQHandler中断模式的现场保护IRQ_Handler IMPORT ISR_IrqHandler;C函数

STMFD sp!,{r0-r12,lr};入栈

BL ISR_IrqHandler LDMFD sp!,{r0-r12,lr};出栈

SUBS pc,lr, #4;返回初始化异常模式的堆栈指针

EXPORTColdResetColdReset

ldr r0,=WTCON ;watchdogdisable

ldr r1,=0x0

str r1,[r0]

ldr r0,=INTMSK

ldr r1,=0xffffffff ;allinterruptdisable

str r1,[r0]

ldr r0,=INTSUBMSK

ldr r1,=0x7ff ;allsubinterruptdisable

str r1,[r0]

bl

InitStacks ;Stack SetupforeachMODEEXPORTEXPORT标号[,WEAK]

说明:EXPORT在程序中声明一个全局标号,其他的文件中的代码可以该标号可被引用。用户也可以用GLOBAL代替EXPORT。[,WEAK]可选项声明其他文件有同名的标号,则该同名标号优先于该标号被引用。LDR、STR存储器访问指令LDR{cond}{T}{S}{B/H}Rd,<地址>将指定地址的数据加载到目的寄存器STR{cond}{T}{B/H}Rd,<地址>将指定寄存器的数据保存到指定的地址空间T在特权模式下访问用户模式的寄存器,在用户模式下无效,不能与前索引偏移一起使用。B访问字节数据H访问半字数据S访问有符号数据,仅用于数据加载LDR、STR存储器访问指令寻址方式寄存器寻址及寄存器间接寻址LDRB R0,[R1,#+0XFFF] /*把R1+0XFFF地址的字节读入R0*/LDR R0,[R1,+R2]!/*把R1+R2地址的32比特数读入R0,然后R1=R1+R2*/STR R0,[R1,+R2,LSL#31]/*把R0(32BIT)写到地址R1+(R2<<31)*/LDR R0,[R1],#+0XFFF /*把R1地址的数读入R0,然后R1=R1+0XFFF*/LDR R0,[R1],+R2 /*把R1地址的数读入R0,然后R1=R1+R2*/LDR R0,[R1],+R2,LSL#31/*把R1地址的数读入R0,然后R1=R1+(R2<<31)*/大范围地址加载指令LDRLDR{cond}Rd,=表达式/标号/立即数直接将数据加载到目的寄存器初始化异常模式的堆栈指针

EXPORTColdResetColdReset

ldr r0,=WTCON ;watchdogdisable

ldr r1,=0x0

str r1,[r0]

ldr r0,=INTMSK

ldr r1,=0xffffffff ;allinterruptdisable

str r1,[r0]

ldr r0,=INTSUBMSK

ldr r1,=0x7ff ;allsubinterruptdisable

str r1,[r0]

bl

InitStacks ;Stack SetupforeachMODEInitStacks

mrs r0,cpsr

bic r0,r0,#MODEMASK

orr r1,r0,#UNDEFMODE|NOINT

msr cpsr_cxsf,r1 ;UndefMode

ldr sp,=UndefStack

orr r1,r0,#ABORTMODE|NOINT

msr cpsr_cxsf,r1 ;AbortMode

ldr sp,=AbortStack

orr r1,r0,#IRQMODE|NOINT

msr cpsr_cxsf,r1 ;IRQMode

ldr sp,=IRQStack

orr r1,r0,#FIQMODE|NOINT

msr cpsr_cxsf,r1 ;FIQMode

ldr sp,=FIQStack

orr r1,r0,#SVCMODE|NOINT

msr cpsr_cxsf,r1 ;SVCMode

ldr sp,=SVCStack

;USERmodeisnotinitialized.

mov

pc,lr;TheLRregistermaybenotvalidfor themodechanges.初始化异常模式的堆栈指针位清除指令BICBIC{cond}{S}Rd,Rn,operand2将Rn的值与operand2的反码按位进行逻辑与操作,结果写入RdBIC r0,r0,#MODEMASK;#0x1F程序状态访问指令MRSMSR当需要修改CPSR/SPSR的内容时,首先要读取它的值到一个通用寄存器,然后修改某些位,最后将数据写回到状态寄存器。CPSR/SPSR不是通用寄存器,不能使用MOV指令来读写。在ARM处理器中,只有MRS指令可以读取CPSR/SPSR;只有MSR可以写CPSR/SPSR。MRS语法MRS{<COND>}<RD>,CPSR|SPSR举例MRS R0,CPSR /*读取CPSR到R0*/MRS R3,SPSR /*读取SPSR到R3*/说明USER和SYSTEM模式没有SPSR,因此这些模式下不能读取SPSR。MSRMSR{<cond>}<psr>_<fields>,#<immed>MSR{<cond>}<psr>_<fields>,<Rm><immed>表示合法的立即数<psr>代表cpsr或spsr<fields>指定传送的区域,可进一步细分(只能小写)c 控制域字节(psr[7:0])x 扩展域字节(psr[15:8]) s 状态域字节(psr[23:16])f 标志域字节(psr[31:24])MSR举例MSR cpsr_c,#0xd3 /*切换到SVC模式*/MSR cpsr_cxsf,r3 /*cpsr=r3*/说明USER和SYSTEM模式没有SPSR,因此这些模式下不能对SPSR操作。由于权限问题,在USER模式下对CPSR[23:0]修改无效。如果使用立即数,要使用合法的立即数。程序不能同过“MSR修改CPSR的T位”来完成ARM/THUMB态的切换。必须使用BX指令,因为BX属于分支指令,它会打断流水线,实现处理器状态切换。如果要修改读出的值,仅修改必要的位,其它位保持不变,这样保持了最大兼容性。InitStacks

mrs r0,cpsr

bic r0,r0,#MODEMASK

orr r1,r0,#UNDEFMODE|NOINT

msr cpsr_cxsf,r1 ;UndefMode

ldr sp,=UndefStack

orr r1,r0,#ABORTMODE|NOINT

msr cpsr_cxsf,r1 ;AbortMode

ldr sp,=AbortStack

orr r1,r0,#IRQMODE|NOINT

msr cpsr_cxsf,r1 ;IRQMode

ldr sp,=IRQStack

orr r1,r0,#FIQMODE|NOINT

msr cpsr_cxsf,r1 ;FIQMode

ldr sp,=FIQStack

;bic r0,r0,#MODEMASK|NOINT

orr r1,r0,#SVCMODE|NOINT

msr cpsr_cxsf,r1 ;SVCMode

ldr sp,=SVCStack

;USERmodeisnotinitialized.

mov

pc,lr;TheLRregistermaybenotvalidfor themodechanges.初始化存储器使用Scattered方式

LOAD0x30008000 ;loadregion{ RAM_EXEC+0 ;PC {

startup.o(init,+FIRST) *(+RO) } L0PAGETABLE0x30200000UNINIT ;about2MByteoffsetSDRAM {

pagetable.o(+ZI) } STACKS+0x100000UNINIT ;64KByteunderL0pagetable {

stack.o(+ZI) } RAM+0 { *(+RW,+ZI) } HEAP+0UNINIT {

heap.o(+ZI) } EXCEPTION_EXEC0OVERLAY ;exceptionregion {

exception.o(+RO) }}3.4ARM与C语言混合编程C中内嵌汇编基于ADS__asm{指令[;/*注释*/]…..[指令]}3.4ARM与C语言混合编程C调用汇编C代码…externvoidscopy(char*d,char*s);Intmain(){…Scopy(dststr,srcstr)…}汇编代码AREAexample,CODE,READONLYEXPORTscopyscopyLDRBR2,[R0],#1STRBR2,[R1],#1CMPR2,#0BNEscopyMOVpc,lrEND3.4ARM与C语言混合编程汇编调用C汇编代码EXPORTcallsum5AREAexample,CODE,READONLYIMPORTsum5callsum5STMFDSP!,{LR} ;LR入栈

ADDR1,R0,R0 ;R0=a,R1=b,R2=cADDR2,R1,R0ADDR3,R1,R2STRR3,[SP,#-4]! ;einstackADDR3,R1,R1 ;R3=dBLsum5 ;callR5,R0=resultADDSP,SP,#4LDMFDSP!,{PC}ENDC代码Intsum5(inta,intb,intc,intd,inte){return(a+b+c+d+e);}3.4ARM与C语言混合编程C/ASM相互调用基于ATPCS(ARM/ThumbProcdureCallStandard)3.4ARM与C语言混合编程交互规则:寄存器规则:R4-R11用来保存局部变量堆栈规则:FD类型(满递减)堆栈参数传递规则:如果参数个数小于等于4,用R0-R3保存参数;参数个数多于4的情况下,剩余的参数传入堆栈子程序结果返回规则:结果为一个32位整数,通过R0返回;结果为一个64位整数,通过R0、R1返回;对于位数更多的结果,通过内存传递。参数传递参数个数多于4的情况下,剩余的参数传入堆栈

3.5BootLoader3.5.1BootLoader的概念3.5.2BootLoader的操作模式3.5.3主要任务与典型结构框架3.5.4Linux的Bootloader(vivi)3.5.1Bootloader的概念BootLoader就是在操作系统内核运行之前运行的一段小程序。通过它,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。3.5.1Bootloader的概念系统加电或复位后,所有的处理器通常都从某个预先安排的地址上取指令。比如,ARM在复位时从地址0x0取指。BootLoader是最先被系统执行的程序3.5.1Bootloader的概念3.5.2BootLoader的操作模式大多数BootLoader都包含两种不同的操作模式:启动加载模式下载模式3.5.2BootLoader的操作模式启动加载模式BootLoader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。这种模式是BootLoader的正常工作模式,因此在嵌入式产品发布的时侯,BootLoader显然必须工作在这种模式下。3.5.2BootLoader的操作模式下载模式在下载模式下,目标机上的BootLoader将通过串口连接或网络连接等通信手段从主机下载文件,如:下载内核映像和根文件系统映像等这种模式通常在第一次安装内核与根文件系统时被使用;此外,以后的系统更新也会使用BootLoader的这种工作模式。3.5.2BootLoader的操作模式主机和目标机之间一般通过串口建立连接,BootLoader软件在执行时通常会通

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论