找回密码
 注册
关于网站域名变更的通知
查看: 450|回复: 3
打印 上一主题 下一主题

单片机的异常处理

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-10-29 15:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
ARM处理器中,如果一个程序产生了错误并且被处理器检测到,这是就会产生错误异常。
+ Y" I. `/ a% Z1 ~
( S& r# \) d* g/ a, g错误是怎么发生的呢?
" h/ M3 U( ]4 z* ]- t: R许多可能的原因都会引起错误发生,比如对于存储器相关错误,总线系统的异常响应可以有以下原因:
, t' k& ]- Z( Z4 u( d4 o+ Z访问的地址非法;, x- l, N- X% w1 g  Z3 d! f* o
由于传输的类型非法,总线的从设备不接受此次传输(从设备决定)
1 @, E2 ?) P: l; F' f  R由于传输未使能或初始化,总线的从设备无法进行此次传输(例如,如果外设的时钟被关闭,那么访问这个外设时,微控制器就可能会产生错误响应)。
! B7 r6 Y7 f: G1 C$ U5 _) @当确定了硬件错误异常的直接原因以后,我们可能还得花费一些时间来确定问题的根源。例如,总线错误可以由很多种情况引发,例如错误的指针操作、栈空间损坏、内存溢出、非法存储器映射以及其他原因。0 Y+ X" D5 |7 r  g0 a$ O: X
9 {5 g! c: B- C
分析错误
: J3 y6 k* I2 f0 L5 C$ U( y根据错误类型的不同,通常能够直接确定引起硬件错误异常的指令的位置。要实现这个目的,就需要知道进入硬件错误异常时的寄存器的内容,以及异常处理前压入栈中的寄存器的内容。这些值中包含了程序返回地址,通过它也能知道引起错误的指令地址。
. ], H" S. U7 W& ~3 b( y7 h9 b5 p. _& _0 U$ l
如果使用了调试器,那么可在工程中创建硬件错误异常处理,并且在其中添加一个用以暂停处理器的断点指令;或者也可以在硬件错误异常处理的开始部分设置一个断点,这样当硬件错误发生时,处理器就会自动暂停。在处理器由于硬件错误暂停后,我们就可以尝试着按照下面图的流程对错误进行定位。
0 n. t* p; x) p3 w5 e! B

6 _! g  F& ^/ ^/ [( ]为了给分析提供更多的信息,也可以生成程序映像的汇编代码,并且利用在栈帧中找到的PC值确定错误的位置。如果错误的地址为存储器访问指令,就应该检查寄存器的值确定存储器访问的地址是否合法。除了检查地址范围,也应该确认存储器的地址是否正确地对齐。
0 g  N  q3 e3 P) }/ v+ c, l; d
4 v# \3 _& Z$ Q7 R2 j" U除了压入栈中的PC值(返回地址),栈帧中也包含了其他有助于调试的寄存器值。例如,压入栈的IPSR能够反映处理器是否在进行异常处理,EPSR则代表了处理器状态(EPSR的T位为0,则表示错误由意外切换至ARM状态引起)。
$ r2 `" Z# A( C7 m
( \: W. J9 C( e5 C: g/ D栈中的LR也可能会提供一些信息,例如发生错误的函数的返回地址,错误是否发生在异常处理中,以及EXC_RETURN的值是否被异常破坏等。% {5 x& m# [8 Q
: H$ n4 J( `9 y/ r* j
另外,当前的寄存器值也可以提供有助于定位错误原因的各种信息,除了当前栈指针的值,当前的链接寄存器的值也可能有帮助。如果LR中为非法的EXC_RETURN的值,这就意味着它在前面异常处理中被错误地修改了。& w! M! d+ R( }, ~& X- T) W4 a. V+ F
4 d/ U. ^" l/ P2 U* J( u
5 t# p  o& F+ ^$ `
CONTROL寄存器也可以提供帮助。在没有OS的简单应用程序中,进程栈指针(PSP)不会被用到,并且CONTROL寄存器会一直保持为0。如果CONTROL寄存器被设置为0x2(PSP用于线程状态),这就意味着LR在之前的异常处理中被错误地修改了,或者栈内容被破坏导致了EXC_RETURN的值错误。
1 M' U) e3 u( y2 x+ x
0 k, }, q" x! W9 t
6 D- v; z: d& J& u! @" g

该用户从未签到

2#
发表于 2021-10-29 15:17 | 只看该作者
根据错误类型的不同,通常能够直接确定引起硬件错误异常的指令的位置
  • TA的每日心情

    2019-11-19 15:55
  • 签到天数: 1 天

    [LV.1]初来乍到

    3#
    发表于 2021-10-29 16:17 | 只看该作者
    总线错误可以由很多种情况引发,例如错误的指针操作、栈空间损坏、内存溢出、非法存储器映射以及其他原因

    该用户从未签到

    4#
    发表于 2021-10-29 16:18 | 只看该作者
    为了给分析提供更多的信息,也可以生成程序映像的汇编代码,并且利用在栈帧中找到的PC值确定错误的位置
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-11-5 10:12 , Processed in 0.125000 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表