历史上的今天
今天是:2024年12月19日(星期四)
2018年12月19日 | 关于ARM中断的具体的启动代码解释
2018-12-19 来源:eefocus
关于中断的具体的启动代码解释:
可以这么理解,44B0 中断系统中有两张中断转移表,经过二重转移才跳到中断处理程序。第一张中断向量表由硬件决定,所在区域为ROM(flash),地址空间从0X00开始,其中0X00-0X 1C为异常向量入口地址,0X20-0XC0为中断向量入口地址。另一张中断向量表在RAM 中,可以随便改,其位置在程序连接后才定。由于 RAM 放在地址空间的高端(距离中断向量超过了 32M),为了从第一张中断向量表跳到第二张中断向量表,故在第一张中断向量表对应位置上写上 ldr PC,# interrupt_service 如:ldr PC,=HandlerEINT4567。
(1) 一级中断向量表
以下为汇编代码片断,详见44B0数据手册11章——中断控制器)
AREA Init,CODE,READONLY
b ResetHandler ;复位异常 0x0000 0000 VECTOR_BRANCH …… b . LTORG 通过这段代码,就在44B0的ROM中以0x00为起始地址的地方建立起了一张中断向量表,而且这个表的顺序完全符合44B0数据手册中对中断向量地址的定义要求。 |
2、二级中断向量表
^ _ISR_STARTADDRESS ;一般为 #define _ISR_STARTADDRESS 0xc7fff00 HandleReset # 4 HandleUndef # 4 HandleSWI # 4 HandlePabort # 4 HandleDabort # 4 HandleReserved # 4 HandleIRQ # 4 HandleFIQ # 4 ;Do not use the label 'IntVectorTable', ;because armasm.exe can not recognize this label correctly. ;the value is different with an address you think it may be. ;IntVectorTable HandleADC # 4 HandleRTC # 4 …… …… HandleEINT2 # 4 HandleEINT1 # 4 HandleEINT0 # 4 ;0xc1(c7)fff84 END
这段第一行 “^” 符号表示在RAM区开辟空间,就是伪代码中的MAP。 ^ _ISR_STARTADDRESS 表示在RAM的_ISR_STARTADDRESS处开辟一段空间。这里开辟的空间是用来存放中断服务程序及其他异常处理程序地址的。每个中断或其他异常都开辟4个字节的空间,这是因为RAM区的程序地址要4个字节才能放得下。而中断程序的地址是应用程序在使用这个中断时,将中断服务程序的地址存入这对应的空间内。
|
3、 中断向量表最终指向
一般在44B.H等头文件能找到对应于二级中断向量表的宏定义:片断如下 #define pISR_RESET (*(unsigned *)(_ISR_STARTADDRESS+0x0)) #define pISR_UNDEF (*(unsigned *)(_ISR_STARTADDRESS+0x4)) #define pISR_SWI (*(unsigned *)(_ISR_STARTADDRESS+0x8)) #define pISR_PABORT (*(unsigned *)(_ISR_STARTADDRESS+0xc)) #define pISR_DABORT (*(unsigned *)(_ISR_STARTADDRESS+0x10)) #define pISR_RESERVED (*(unsigned *)(_ISR_STARTADDRESS+0x14)) #define pISR_IRQ (*(unsigned *)(_ISR_STARTADDRESS+0x18)) #define pISR_FIQ (*(unsigned *)(_ISR_STARTADDRESS+0x1c)) #define pISR_ADC (*(unsigned *)(_ISR_STARTADDRESS+0x20)) #define pISR_RTC (*(unsigned *)(_ISR_STARTADDRESS+0x24)) #define pISR_UTXD1 (*(unsigned *)(_ISR_STARTADDRESS+0x28)) #define pISR_UTXD0 (*(unsigned *)(_ISR_STARTADDRESS+0x2c)) …… …… #define pISR_EINT2 (*(unsigned *)(_ISR_STARTADDRESS+0x7c)) #define pISR_EINT1 (*(unsigned *)(_ISR_STARTADDRESS+0x80)) #define pISR_EINT0 (*(unsigned *)(_ISR_STARTADDRESS+0x84))
一般在C文件中将自定义的中断服务子程序地址放进对应宏中,如: pISR_TIMER0 = (int) time_interrupt() |
史海拾趣
|
本帖最后由 paulhyde 于 2014-9-15 09:16 编辑 有谁画过高频类的PCB板并且性能稳定,我以前画的总是干扰太大,网上的一些抗干扰的方法说的又比较抽象,没有具体实物 请画过的帮忙传一份上来吧,小弟下回去研究研究。最好能有一些注释说明的 ...… 查看全部问答> |
|
我们公司要招一名Linux下的蓝牙开发工程师。公司地址在上海中山公园附近。薪资待遇1万/月。 职位要求: 1、精通LINUX系统以及C/C++编程(必须)。 2、熟悉嵌入式系统、单片机的开发。 3、精通蓝牙协议、蓝牙应用开发(必须)。 4、至少三年以 ...… 查看全部问答> |
|
CS8900、CS8900A芯片是Cirrus Logic公司生产的一种局域网处理芯片,在嵌入式领域中使用非常常见。它的封装是100-pin TQFP,内部集成了在片RAM、10BASE-T收发滤波器,并且提供8位和16位两种接口,一般在单片机中,使用了CS8900的8位 ...… 查看全部问答> |
|
最近也在学习C2000,如果用库的话可以在controlSTIUE的例程的目录中,复制一个,然后在其工程中编制自己的程序。其好处是可以在FLASH中运行。 但我看坛子里的童鞋都用非库。所以我也看看非库但非库只能在RAM中运行。至于怎么在FLASH ...… 查看全部问答> |




