您的位置 首页 应用

arm中system形式的效果

这几天学了很多arm细节知识,个人平时实在没有深入进去交了钱被人逼着学才会努力深究,真是贱以前就知道arm有7种基本工作模式FIQ、IRQ由…

这几天学了许多arm细节常识,个人平常真实没有深化进去

交了钱被人逼着学才会尽力深究,真是贱

曾经就知道arm有7种根本作业方式
FIQ 、IRQ由中止进入
UNDEF、ABORT 由程序反常进入
SVC由上电和软中止进入
user由SVC处理程序自动进入
可是还有一个system,运用和user相同的寄存器,可是又没有SPSR,一起还能履行特权指令
这么一个特殊,OS把它当user用不安全,当反常和中止,又没有自动进入方法
怎样看怎样别扭,当然这也是领会之后才意识到的,system是用来处理arm中中止可重入问题的

搜了一下,网上的关于arm可重入中止的解说只要1篇,并且没有考虑彻底http://blog.chinaunix.net/u1/58640/showart_513501.html
默许的中止处理函数都会自己先自动把lr压栈先,此文没有考虑这一点,把损坏想的严峻了

这样的理论常识实践中几乎没有用到,唯有寻求专业的人士才会深究,这样就能满意特殊要求,做到一般人做不到的作业

首要,armcc关键字__irq不能用来编写可重入中止
当中止可重入时,在中止处理函数中运用 BL 调用子函数,这时候问题就来了,分两种状况
假如子函数不是__irq 方法声明的,没有自己压栈lr的习气,那么此刻再来一个irq中止,lr_irq就被新值冲掉
,从此堕入一个死循环。
假如子函数是会自动压栈lr的好孩子,那么仅仅在履行压栈lr的这条指令时,产生irq中止才会导致上述问题,可是触发问题的条件就变得很苛刻了

所以,这时候就需要system方式来解救国际了
编写可重入中止有必要凭借以下汇编代码

IRQHandler
;LR_IRQ ,SPSR_IRQ,r12压栈,防止下一个IRQ中止将其冲掉
sub lr,lr,#4
stmfd sp!,{lr}
mrs r14,spsr
STMFD sp!,{r12,r14}

;读、清中止控制器中止源
;省掉相关代码
mov r12,#IntBase
LDR r12,[r12,#IntSource]

;切换到system方式,一起使能IRQ
mrs r14,cpsr
bic r14,r14,#0x9f
orr r14,r14,#0x1f
msr CPSR_c,r14

;保存r0-r3,LR_user到user栈中,然后调用c子程序,中止源r0最为一个参数传进c处理函数
BL C_irq_handler ;看姓名,就知道这个c程序是__irq方式声明的
;是一个会自己压栈LR的好孩子
LDMFD sp!,{r0-r3,lr}

;切换到IRQ方式一起制止IRQ
mrs r12,cpsr
bic r12,r12,#0x1f
orr r12,r12,#0x92
msr CPSR_c,r12

;康复LR_irq,SPSR_irq和作业寄存器r12,然后退出IRQ
LDMFD sp!,{r12,r14}
msr SPSR_csxf,r14
LDMFD sp!,{PC}^

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部