异常处理

<1>用C实现异常处理

根据AAPCS标准:C函数可以修改R0~R3、R12、LR以及xPSR。若C函数需要使用R4~R11,就需要将这些寄存器保存到栈中,并且在函数结束前将它们恢复。

调用者保存寄存器(R0~R3、R12、LR以及xPSR):若在函数调用后还需要使用这些寄存器的值,在进行调用前,调用子程序的代码需要将这些寄存器的内容保存到内存中(如栈)。函数调用后不需要使用寄存器数值则不需要保存。

被调用者保存寄存器(R4~R11):被调用的子程序或者函数需要确保这些寄存器在函数结束时不会发生变化(和进入函数时的数值一样)。这些寄存器的数值可能会在函数执行过程中变化,不过需要在函数退出前将它们恢复为初始值。

要使C函数可以用作异常处理,异常机制需要在异常入口处自动保存R0~R3、R12、LR以及xPSR,并在异常退出时将它们恢复,这些都要由处理器硬件控制。这样,当返回到中断程序时,所有寄存器的数值都和进入中断时相同。另外,与普通的C函数调用不同,返回地址(PC)并没有存储在LR中(异常机制在进入异常时将EXC_RETURN值存储在LR中,该数值在异常返回时用到),因此,异常流程也需要保存返回地址。


<2>栈帧

在异常入口处被压入的数据块称为栈帧,对于Cortex-M3,栈帧是8个字,对于Cortex-M4,栈帧可能是8个字或者26个字。

根据AAPCS标准:栈指针的数值在函数入口和出口处应该是双字对齐的。

因此,若在中断产生时栈帧 未对齐到双字地址,Cortex-M处理器会自动插入一个字,以保证双字对齐。“双字栈对齐“特性是可编程的,若异常未完全符合AAPCS,则可以将该特性关闭。

若使能了双字栈对齐特性,而且栈指针的数值未对齐到双字,此时会在栈中插入一个字的空间,以确保栈指针被强制对齐到双字地址,而且压栈的xPSR的第9位被置为1。


<3>EXC_RETURN

处理器进入异常处理,LR会被更新为EXC_RETURN数值。该数值用于触发异常返回。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值