您的位置 首页 报告

ARM中止宏界说

MACRO$HandlerLabelHANDLER$HandleLabel$HandlerLabelsubsp,sp,#4;decrementsp(tostorejumpaddress)存贮PC跳转地

MACRO

$HandlerLabel HANDLER $HandleLabel

$HandlerLabel

sub sp,sp,#4 ;decrement sp(to store jump address) 存贮PC跳转地址

stmfd sp!,{r0} ;PUSH the work register to stack(lr does not push because it return to original address)

ldr r0,=$HandleLabel ;load the address of HandleXXX to r0

ldr r0,[r0] ;load the contents(service routine start address) of HandleXXX

str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack

ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR)

MEND

MACRO相当于c中的#define

而$HandlerLabel 和 $HandleLabel是两个参数,咱们留意,第一个参数和第二个参数是不相同的,中心少了个r

而第一个参数在本宏中是一个标号,而第二个函数是一个进口地址

以下有界说:

HandlerFIQ HANDLER HandleFIQ

HandlerIRQ HANDLER HandleIRQ

HandlerUndef HANDLER HandleUndef

HandlerSWI HANDLER HandleSWI

HandlerDabort HANDLER HandleDabort

HandlerPabort HANDLER HandlePabort

拿HandlerSWI HANDLER HandleSWI阐明:把它用宏给替换下来今后是:

$HandlerSWI

1:sub sp,sp,#4 ;decrement sp(to store jump address) 存贮PC跳转地址

2:stmfd sp!,{r0} ;PUSH the work register to stack(lr does not push because it return to original address)

3:ldr r0,=$HandleSWI ;load the address of HandleXXX to r0

4:ldr r0,[r0] ;load the contents(service routine start address) of HandleXXX

5:str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack

6:ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR)

这段宏界说的效果是什么呢?是装置SWI中止,怎么装置的呢?

sub sp,sp,#4 是把SP的地址减4字节,而这个当地需求寄存跳转地址也便是第5行的HandleSWI指向的内容(ISR)

接下来是压栈所需求的寄存器r0,由于接下来需求运用r0所以先压栈r0,这也是为什么刚刚先把SP加四字节的原因,第6句话便是跳转到刚刚第5句所压栈的地址处,也便是HandleSWI指向的内容(ISR)处

这儿有一句话不是很理解,便是r0,这样压栈又出栈,跟没有压和出有什么区别,也便是说,上下文的内容相同了,破坏了中止前的r0,回来后的r0不再是原先的r0了,不理解?

VectorsAddr

LDR PC, Reset_Addr

LDR PC, Undefined_Addr

LDR PC, SWI_Addr

LDR PC, Prefetch_Addr

LDR PC, Abort_Addr

NOP ; Reserved vector

LDR PC, IRQ_Addr

LDR PC, FIQ_Addr

EXPORT VectorsAddr

Reset_Addr DCD ResetHandler ;第一次地址转化

Undefined_Addr DCD HandlerUndef

SWI_Addr DCD HandlerSWI

Prefetch_Addr DCD HandlerPabort

Abort_Addr DCD HandlerDabort

IRQ_Addr DCD HandlerIRQ

FIQ_Addr DCD HandlerFIQ

依照我的主意履行中止时是这样的:

首要PC->0x30000000比如说这个地址是IRQ_Addr ,由于DCD是接下来的接连的4字节,PC需求履行

PC->0x30000004这个地址便是履行的HandlerIRQ,而这个地址依据上面装置好的中止,它应该是一个指针,也便是说PC履行的这一句话是一个跳转指令,由于HandlerIRQ是一个指针,那么应该跳到HandlerIRQ所指当地处运转,HandlerIRQ所指的便是真实的中止程序IRQ_ISR,咱们看这儿运用了两次地址转化,第一次是次序履行,第2次才是真实的跳转,那么咱们在装置中止时便是在第2次的当地改动HandlerIRQ所指向的函数就可以操控中止函数的不同。

MACRO ;宏界说开端
MOV_PC_LR ;宏的姓名
[THUMBCODE ;表明在Thumb作业状况
bxlr ;分支到 Thumb 代码 lr
|
movpc,lr ;把lr 保存到PC指针
]
MEND ;宏界说完毕

;arm处理器有两种作业状况
1.arm:32位 这种作业状况下履行字对准的arm指令

2.Thumb:16位 这种作业状况履行半字对准的Thumb指令

;由于处理器分为16位 32位两种作业状况 程序的编译器也是分16位和32两种编译方法 所以下面的程序用于依据处理器作业状况确认编译器编译方法
;code16伪指令指示汇编编译器后边的指令为16位的thumb指令
;code32伪指令指示汇编编译器后边的指令为32位的arm指令
;这段是为了一致现在的处理器作业状况和软件编译方法(16位编译环境运用tasm.exe编译)

别的
[ =if
| =else
] =end if

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ceping/baogao/274708.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部