ARM异常---一个DataAbort的触发过程:

本文深入探讨了DataAbort异常的触发机制及其处理流程,通过解析汇编代码,解释了如何从_ISR_STARTADDRESS开始预留空间用于存储异常处理函数地址,并详细说明了如何在异常发生时,通过跳转到指定的中断服务例行程序(ISR)来执行相应的错误处理逻辑。文章进一步介绍了如何使用特定的宏和变量来实现这一过程,提供了对中断处理和异常管理的深刻理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个DataAbort异常的触发过程:
///////////////////////////
///xxxx.inc
_STACK_BASEADDRESS EQU 0x33ff8000
_MMUTT_STARTADDRESS EQU 0x33ff8000
_ISR_STARTADDRESS EQU 0x33ffff00

 

///xxx.s
         MACRO
$HandlerLabel HANDLER $HandleLabel

$HandlerLabel
    sub    sp,sp,#4    ;decrement sp(to store jump address)
    stmfd    sp!,{r0}    ;PUSH the work register to stack(lr does t 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


HandlerPabort HANDLER HandlePabort

HandlerPabort HANDLER HandlePabort 展开:
{
HandlerPabort
    sub sp,sp,#4       ;decrement sp(to store jump address)
    stmfd sp!,{r0}      ;PUSH the work register to stack(lr does''t push because it return to original address)
ldr r0,
=$HandlePabort  ;load the address of HandleXXX to r0 ldr r0,[r0]        ;load the contents(service routine start address) of Handler function
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) }

 

///xxx.s
/* ^ 其实就是 MAP ,这段程序的意思是,从 _ISR_STARTADDRESS
开始,预留一个变量,每个变量一个标号,预留的空间为 4个字节,也就是 32BIT
,其实这里放的是真正的C写的处理函数的地址,说白了,就是函数指针*/
^ _ISR_STARTADDRESS ; _ISR_STARTADDRESS=0x33FF_FF00
HandleReset # 4
HandleUndef # 4
HandleSWI # 4
HandlePabort # 4
HandleDabort # 4
HandleReserved # 4
HandleIRQ # 4
HandleFIQ # 4

///////////////////////////
xxxx.c
#define _ISR_STARTADDRESS 0x33ffff00
#define pISR_PABORT (*(unsigned *)(_ISR_STARTADDRESS+0xc))
pISR_PABORT=(unsigned)HaltPabort; //给PABORT中断入口函数指针赋值。
【 *PABORTFUNC = HaltPabort 】
/////////////////////

中断触发时:
1 -- ldr r0,=HandlePabort
2 -- (*(unsigned *)HandlePabort) 即是pISR_PABORT
3 -- pISR_PABORT 即是异常处理函数HaltPabort
4 -- POP 出栈时弹出的是HandlePabort 到PC

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值