历史上的今天

今天是:2024年11月18日(星期一)

正在发生

2019年11月18日 | S3C2440中断过程详解(ADS,TQ2440)

发布者:闪耀星空 来源: 51hei关键字:S3C2440  中断过程  ADS  TQ2440 手机看文章 扫描二维码
随时随地手机看文章

下面以串口UART0接收中断为例:


串口接收中断初始化时有这么一句:pISR_UART0=(unsigned)__irq UART0 _GetInt   /把 UART0 _GetInt这个中断服务子程序的入口地址放到pISR_TICK,
S3C2440addr.h中#define pISR_UART0  (*(unsigned *)(_ISR_STARTADDRESS+0x90)) 
option.inc中_ISR_STARTADDRESS EQU 0x33ffff00 //也就是中断服务子程序的入口地址放到0x33ffff00+0x90这个地址单元,即放入相应的中断向量表中,当中断发生时可通过查向量表(S3C2440addr.h最后有向量表,有这么一句HandleUART0  #   4,此处即放的UART0的中断入口地址)找到入口地址,执行中断服务子程序


再看S3C2440addr.h中下面几句指令,所在地址已标出,这些地址上的指令称为“异常向量”,当复位时,CPU进入系统模式,并跳到0x00地址执行, 再跳到ResetHandler   处执行相应的复位程序,其他异常也是一样的执行过程。


b ResetHandler    ;  @0x00
b HandlerUndef   ;  @0x04
b HandlerSWI       ;  @0x08
b HandlerPabort   ;  @0x0c
b HandlerDabort   ; @0x10
b .  ;reserved  ,保留@0x14
b HandlerIRQ         ;@0x18

b HandlerFIQ          ;@0x1c


言归正传,当中断(IRQ)发生时,CPU进入中断模式,并跳到0x18处执行b HandlerIRQ (在S3C2440addr.h中)这条指令,程序跳到HandlerIRQ HANDLER HandleIRQ(还在S3C2440addr.h中)处,此处将根据下面的宏定义展开:


$HandlerLabel HANDLER $HandleLabel

$HandlerLabel      ;相当于$HandleIRQ
sub sp,sp,#4  ;sp=sp-4

stmfd sp!,{r0} ; r0内容保存到sp对应的栈中,应为入在下边用到所以先保存起来

ldr     r0,=$HandleLabel;   把HandleLabel这个地址放r0
ldr     r0,[r0]  ;  把HandleLabel这个地址的内容放r0
str     r0,[sp,#4]      ;把r0保存到sp+4的栈中,中断函数首地址HandleLabel入栈
ldmfd   sp!,{r0,pc}     ;   把sp对应的内容出栈放r0,sp+4放PC中,即原来保存的r0回复到r0,程序跳到HandleLabel,即HandleIRQ

MEND


上边这段程序执行完了之后,程序跳到HandleIRQ处执行,再看下面一段程序(S3C2440addr.h中),

ldr r0,=HandleIRQ       ;This routine is needed
ldr r1,=IsrIRQ   ;if there is not 'subs pc,lr,#4' at 0x18, 0x1c
str r1,[r0]

2440启动时执行这段程序,此段程序即把IsrIRQ和HandleIRQ标号等价起来,接着上面,程序跳到HandleIRQ处执行即跳到IsrIRQ处,在看下面程序IsrIRQ(S3C2440addr.h中)查向量表找入口地址:


IsrIRQ
sub sp,sp,#4       ;给PC寄存器保留;reserved for PC
stmfd sp!,{r8-r9}; 把r8-r9压入栈

ldr r9,=INTOFFSET ;INTOFFSET的值在2440addr.inc中定义为0x4a000014,
                                 ; 把中断偏移INTOFFSET寄存器的地址装入r9

ldr r9,[r9]                    ;把中断偏移INTOFFSET寄存器内容装入r9,
ldr r8,=HandleEINT0; 这就是向量表的入口HandleEINT0装入r8,中断向量表的基址
add r8,r8,r9,lsl #2       ;R8=R8+(R9<<2) ,基址加变址得到中断向量表地址

ldr r8,[r8]    ; 装入中断服务程序的入口
str r8,[sp,#8]   ;把入口压入堆,

ldmfd sp!,{r8-r9,pc} ;出栈,入口地址给PC即跳到中断服务程序执行,

关于INTOFFSET看下面截图:


至此程序跳到C编写的中断服务程序中执行。

为什么上面都没讲到中断的现场保护和现场恢复,请看下面(摘抄):

中断服务函数往往带有__irq 这样的标识

关于__irq 的使用

__irq为一个标识,用来表示一个函数是否为中断函数。对于不同的编译器,__irq在函数名中的位置不一样,例如:


ADS编译器中 : void __irq IRQ_Eint0(void);
Keil编译器中 : void IRQ_Eint0(void) __irq;


但是其意义一样,它所完成的任务是标识该函数为中断函数,在编译器编译是调用此函数时,先保护函数入口现场,然后执行中断函数,函数执行完毕,恢复中断现场,这整个过程不需要用户重新编写代码来完成,由编译器自动完成。当然也可以自己编写现场保护和恢复现场的代码。


关键字:S3C2440  中断过程  ADS  TQ2440 引用地址:S3C2440中断过程详解(ADS,TQ2440)

上一篇:2440裸机编程之二 C语言调用汇编语言编程
下一篇:u-boot-1.3.4 移植到S3C2440

推荐阅读

  近日,神州控股旗下科捷物流在北京发布了“人机共舞2.0”立体高密度机器人智能仓,该技术采用“货到人”模式,将技术与现有物流业务流程充分融合,属国内首例。   神州控股科捷物流常务副总裁陈滔滔介绍,相较于业内传统地面机器人“货到人”系统,该机器人拣选系统运用天地轨运行自动控制技术,采取空中悬挂机器人模式,突破了传统机器人仅能在...
通用汽车公司的克鲁斯于今年六月宣布将推迟一项无人驾驶出租车服务的计划,此前该公司曾表示将于2019首次亮相。但这一挫折并没有阻止其超过1000名员工向公开发行的目标迈进。克鲁斯人工智能和机器学习部门负责人侯赛因·梅哈纳(Hussein Mehanna)表示,事实上,在接下来的几个月里,底层系统和基础设施的工作已经加速。“我们继续显示进展。在过去的六个...
据IC insights发布的《2020-2024年全球晶圆产能》报告提供的数据,未来几年10nm以下工艺的IC产能预计将进入快速增长期,并且到2024年,该制程的芯片将成为该行业月安装容量的最大占比。到2020年底,10nm以下的产能预计将占IC行业总晶圆产能的10%,预计到2022年将首次超过20%,并在2024年增加至全球产能的30%,如下图:芯片的制程越来越先进,随着IC设计制...
协作机器人 vs 传统机器人协作机器人旨在与人类一起工作,具有精确性、力量和速度,以实现高效率的生产。协作机器人在几个方面有别于工业机器人,例如在与人一起工作时没有“安全空间”、简化编程和缩短安装时间、集成自动减速和安全监控或距离传感器,以及在工人与协作机器人工作太近的情况下减少机动功率和力量的能力。协作机器人安全,操作方便,投资...

史海拾趣

小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved