博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ARM异常---一个DataAbort的触发过程:
阅读量:5146 次
发布时间:2019-06-13

本文共 1867 字,大约阅读时间需要 6 分钟。

一个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

 

转载于:https://www.cnblogs.com/mylinux/p/3905298.html

你可能感兴趣的文章
django知识点总结
查看>>
C++ STL stack、queue和vector的使用
查看>>
OAuth2 .net MVC实现获取token
查看>>
java中XML操作:xml与string互转、读取XML文档节点及对XML节点增删改查
查看>>
Nginx多域名配置
查看>>
使用Reporting Services时遇到的小问题
查看>>
传递事件和传递命令系统···
查看>>
约瑟夫问题
查看>>
Arduino 报错总结
查看>>
树莓派Android Things物联网开发:树莓派GPIO引脚图
查看>>
Database、User、Schema、Tables、Col、Row
查看>>
ckplayer网页播放器简易教程
查看>>
Android Studio 学习(六)内容提供器
查看>>
作业1:求500到1000之间有多少个素数,并打印出来
查看>>
for循环:用turtle画一颗五角星
查看>>
浅谈JavaScript中的eval()
查看>>
操作系统学习(七) 、保护机制概述
查看>>
矩阵快速幂---BestCoder Round#8 1002
查看>>
MySQL建表语句+添加注释
查看>>
性能优化的 ULBOX(收集-)
查看>>