mini2440启动代码分析之第五篇(中断向量表)
来源:互联网 发布:时间序列数据回归 编辑:程序博客网 时间:2024/06/05 12:05
转自:http://blog.chinaunix.net/uid-26435987-id-3074176.html
;中断向量表一般位于启动代码的开始部分,它是用户程序与启动代码之间以及启动代码的各部分之间联系的纽带。它由一个一个的跳转函数组成,它就象一个普通的散转函数,只不过散转的过程中有硬件机制参与,当系统发生异常时,ARM 处理器会通过硬件机制强制将PC 指针指向中断向量表中对应的异常跳转函数存储的地址,然后程序会跳转到相应的中断服务程序去执行。(别忘了前篇有个复位b ResetHandler )
b HandlerUndef ;handler for Undefined mode 未定义异常,遇到无法识别的指令时0x04
b HandlerSWI ;handler for SWI interrupt,软中断异常0x08
b HandlerPabort ;handler for PAbort指令预取错误时进入0x0c
b HandlerDabort ;handler for DAbort数据访问不能完成时进入0x10
b . ;reserved, 保留 0x14
b HandlerIRQ ;handler for IRQ interrupt发生IRQ 中断时进入0x18
b HandlerFIQ ;handler for FIQ interrupt发生FIQ 中断时进入0x1c
b EnterPWDN ; Must be @0x20.
这个b EnterPWDN没太见过,然后点击查看到在2440lib.c头文件中可以见到这样的宏声明:
#define EnterPWDN(clkcon) ((void (*)(int))0x20)(clkcon)
不难看出,当我们编程调用EnterPWDN(clkcon)函数的时候,编译器在编译前首先把EnterPWDN(clkcon)转换为((void (*)(int))0x20)(clkcon)语句。现在分析这个语句,对于这个语句,我们先将之分解成3个部分来看:
如下: 1:(void (*)(int) 2:0x20 3:(clkcon)
其中(clkcon)是函数的参数,对照着看就知道了;0x20是要转换的函数的入口地址;着重看(void (*)(int),这部分作为一个整体,描述了转换后的函数的类型,即无返回值,带一个整形参数。而中间那个“(*)”,表示是要转换成一个函数,类比一下就像我们平常用的强制类型转换一样,(int)temp,只不过这里是将一个数转换为另一类型,而咱们刚说的是将一个地址转换为一个函数。
- mini2440启动代码分析之第五篇(中断向量表)
- mini2440启动代码分析之第五篇(中断向量表)
- mini2440启动代码分析之第六篇(DCD与二次查表判中断类型)
- STM32学习笔记之中断向量表,MDK程序启动分析
- LINUX-内核-中断分析-中断向量表(1)-x86
- LINUX-内核-中断分析-中断向量表(2)-mips
- LINUX-内核-中断分析-中断向量表(3)-arm
- mini2440启动代码分析之第九篇
- mini2440启动代码分析之第十篇
- mini2440启动代码分析之第三篇(IMPORT)
- mini2440启动代码分析之第三篇(IMPORT)
- ARM的启动和中断向量表
- ARM的启动和中断向量表
- ARM的启动和中断向量表
- ARM中断向量表的简单分析
- ARM中断向量表的简单分析
- 大型机汇编(mainframe assembler/HLASM)之中断向量表
- 关于mini2440启动代码中中断的产生原理分析
- eclipse c/c++开发代码提示
- 排列组合算法
- 调用构造函数进行类型转换
- HDFS的JAVA接口API操作实例
- header('P3P: CP="CAO PSA OUR"'); session_start();
- mini2440启动代码分析之第五篇(中断向量表)
- iOS之KVC和KVO
- Linux下收集日志的简单脚本
- i2c driver
- Oracle之序列(主键自增)
- <谷歌如何测试> 翻译第七篇
- linux 7z
- 在校最后半年计划
- 大话session