OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4598|回复: 0

mini2440启动代码分析之第五篇(中断向量表)

[复制链接]

79

主题

394

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1714
金钱
1714
注册时间
2015-9-21
在线时间
529 小时
发表于 2021-11-24 18:01:39 | 显示全部楼层 |阅读模式
;中断向量表一般位于启动代码的开始部分,它是用户程序与启动代码之间以及启动代码的各部分之间联系的纽带。它由一个一个的跳转函数组成,它就象一个普通的散转函数,只不过散转的过程中有硬件机制参与,当系统发生异常时,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个部分来看:
如下:  1void (*)(int)        2:0x20        3clkcon)
其中(clkcon)是函数的参数,对照着看就知道了;0x20是要转换的函数的入口地址;着重看(void (*)(int),这部分作为一个整体,描述了转换后的函数的类型,即无返回值,带一个整形参数。而中间那个“(*)”,表示是要转换成一个函数,类比一下就像我们平常用的强制类型转换一样,(int)temp,只不过这里是将一个数转换为另一类型,而咱们刚说的是将一个地址转换为一个函数。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-6-9 01:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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