历史上的今天
今天是:2025年01月19日(星期日)
2020年01月19日 | ARM用户层发生异常后软硬件协同处理流程
2020-01-19 来源:eefocus
我这里是要简单说一下,在ARM平台的用户层发生异常后的软硬件协同处理流程,是个大致的概况,对宏观了解后,具体细节内容网上有很多,可以自行查询。
用户层程序正在执行时,遇到未定义的指令(ARM不是别的指令)或者SWI软件中断指令(产生系统调用),就会产生异常,这里以未定义指令异常为例进行说明:
一旦出现未定义指令异常,CPU会自动做如下操作:
(1)未定义模式(ARM七种运行模式的一种)下对应的lr(即R14,不同的运行模式有不同的lr寄存器)寄存器保存当前发生异常的指令下一条指令的地址。例如,在用户态有A B C 三条指令顺序执行,指令A发生未定义指令异常,则指令B的地址就会由CPU保存到未定义模式下的lr寄存器中,用于异常返回。
(2)CPU修改CPSR寄存器,进入未定义模式:
CPSR[4:0]=0b11011 /*将CPSR的低五位置位11011,正好对应未定义指令模式*/
(3)因为ARM异常只能在ARM状态处理,所以要将状态修改为ARM指令集状态:
CPSR[5]=0
(4)CPU根据发生的异常是未定义指令异常,将PC置为0x0000 0004(也有可能是0xffff0004,在这里不做分析):
PC=0x00000004
以上是CPU在做,剩下的都是操作系统完成,我这里只说个大概,具体细节见我写的另一个文档:
该地址对应的正是一条跳转指令:b vector_und + stubs_offset。该指令会跳转到相应的异常处理函数去执行,函数执行结束后会调用ret_to_usr函数,从SVC模式返回到USR模式,在这个函数中最后一条指令是:MOVS PC,LR。该指令将当前状态的LR寄存器赋值给PC,并且将当前模式寄存器SPSR拷贝到CPSR中(指令中MOV后的S位)
(5)LR保存的就是上面指令B的地址,至此未定义指令异常处理完毕。
对于其他几个异常,如中断、快速中断、数据中止等异常,除了返回地址、PC值等不同外,处理流程大致相同。
史海拾趣
|
一。自我情况说明 上研究生。实验室是搞嵌入式计算技术的。目前主要研究是设计一个多核并行处理器。使用FPGA来进行验证。 我也打算投入FPGA的方向。并为之努力。 下学期就开始,打算先从VHDL和ISE环境学起(我们实验室用的是XILINX)。 二。 ...… 查看全部问答> |
|
现在我用到手了MC8051的IPcore的代码,可是不太熟,好多地方不明白,也没有开发板.所以想找熟悉的人探讨一下.mc8051的压缩包是我从网上下的,你可以以自已去原网站下.是free的.… 查看全部问答> |
|
各位大侠好。。小弟是新手。。想问一下用1602还有一块51单片机做一个电子钟。。都要用到什么东西。。望能详细点解答。。最好能细到连电子元器件都说明。。而且最好能有个大概的制作步骤。。。小弟在此谢过了。。… 查看全部问答> |
|
关于WINDOWS XP下直接IO(IN/OUT)硬盘MBR是否可行 我在WIN XP下写了简单的驱动进入ring0层后,试图直接IO硬盘的MBR,我通过IN指令可以正常读取到硬盘的MBR,但是当我用OUT指令写入的事后发现没有任何效果,WIN XP也并没有crash,但是就是在检查MBR的时候发现MBR内容一点没有变化根本没有我写入的内 ...… 查看全部问答> |
|
跟成都的戴先生认识,还得感谢QQ,通过djyos。 戴:你现在djyos发展得怎么样了? 我:正在努力. 就这样开始我我们的对话,通过QQ聊天,我知道戴先生是一个有10几年敬业的嵌入式业者,由于 ...… 查看全部问答> |
|
写了一个简单的按键驱动(流驱动),加入2440的bsp创建的工程中,修改了cfw.c,armint.c中的中断设置,注册表也改了(在bib文件中加入dll的话报警告说多次进入dll,所以就去掉了bib文件中的,警告也没了。),但是驱动就是不能用,一条打印信息都没 ...… 查看全部问答> |
|
做嵌入式系统,这两个公司哪个好一些。 周立功 http://www.zlgmcu.com/help/renlizhiyuan.asp 广哈通信 http://www.ghtchina.com… 查看全部问答> |
|
用STLINK烧录STM8S103F3芯片有百分之几工作不正常! 用STLINK烧录STM8S103F3芯片有百分之几工作不正常,有些功能正常,有些功能不正常!重烧后正常,不知道是怎么回事 ...… 查看全部问答> |




