历史上的今天
返回首页

历史上的今天

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

正在发生

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

2019-11-18 来源:51hei

下面以串口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;


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


推荐阅读

史海拾趣

Dytran Instruments Inc公司的发展小趣事

尽管已经被收购并进行了业务整合,但Dytran并没有停止其创新的步伐。公司继续加大研发投入,推动传感器技术的不断创新和升级。同时,Dytran还积极探索新的应用领域和市场空间,以满足不断变化的客户需求。

在未来,Dytran将继续致力于为客户提供高质量、高性能的传感器产品和解决方案。同时,公司还将积极参与国际竞争和合作,推动传感器技术的国际化和标准化进程。通过不断创新和发展,Dytran有望在电子行业中继续保持其领先地位并实现更加辉煌的未来。

以上五个故事框架概述了Dytran Instruments Inc.公司在电子行业中的发展历程、技术创新、市场拓展、被收购与业务整合以及未来展望等方面的重要事件和里程碑。这些故事展示了Dytran如何凭借其技术实力和市场洞察力在竞争激烈的电子行业中脱颖而出并实现持续发展。

GainSpan ( Telit)公司的发展小趣事

风华高科自成立以来,一直注重技术创新和产品多元化发展。公司不断投入研发资源,成功开发出多种新型电子元器件和电子材料,如片式电阻器、片式电感器、超小型铝电解电容器等。这些产品广泛应用于通讯、消费、计算机、汽车电子等领域,满足了市场多样化的需求。同时,公司还建立了完善的质量管理体系,确保产品质量符合国际标准。

常忆科技(CHINGIS)公司的发展小趣事

为了满足不断增长的市场需求,常忆科技积极拓展国内外市场。公司通过与全球知名的电子产品制造商建立合作关系,成功将产品打入国际市场。同时,常忆科技还积极参加各类国际电子展会和技术交流活动,展示其最新的技术和产品,吸引了众多国际客户的关注。

随着国际化战略的深入实施,常忆科技的产品逐渐在全球范围内得到应用。这不仅提升了公司的品牌知名度和影响力,也为公司带来了丰厚的经济回报。

AUK Contractors Co Ltd公司的发展小趣事

在追求经济效益的同时,AUK Contractors Co Ltd也积极履行企业社会责任。公司不仅严格遵守环保法规,还积极参与公益事业,为社会做出贡献。此外,公司还注重可持续发展,通过节能减排、循环利用等方式降低对环境的影响,实现了经济效益与社会效益的双赢。

这些故事虽然基于虚构,但反映了电子行业公司可能经历的典型情境和挑战。希望这些故事能够为您提供一些启发和参考。

Amphenol Aerospace公司的发展小趣事

随着公司业务的不断扩展,AUK Contractors Co Ltd意识到单一市场已无法满足其增长需求。于是,公司积极寻求国际合作,与多个国家的电子企业建立了战略伙伴关系。通过技术交流和资源共享,公司成功打开了新的市场,实现了业务的快速增长。

德芯半导体(Doeshare)公司的发展小趣事

德芯半导体在发展过程中,积极拓展合作伙伴关系。公司与国内外多家知名企业建立了长期稳定的合作关系,共同开展技术研发和市场推广。这些合作伙伴不仅为公司提供了技术支持和市场渠道,还为公司带来了更多的商业机会和发展空间。通过与合作伙伴的紧密合作,德芯半导体在半导体行业中树立了良好的口碑和形象。

问答坊 | AI 解惑

第十届深圳国际汽车展览会

展会名称: 第十届深圳国际汽车展览会 开展日期: 2006-8-9 结束日期: 2006-8-13  展览场馆: 深圳会展中心  举办单位: 中国机械设备集团公司   展览产品范围: 汽车 ...…

查看全部问答>

开关集成电路TL494

开关集成电路TL494 中文资料…

查看全部问答>

纠结的国内医疗电子

医疗电子,对于具体测产品来说。大体分为两类:大型医疗仪器(CT、MRI、断层扫描等单价都百万以上的)和小型医疗仪器(监护仪、血氧仪之类的)。      大型医疗仪器。涉及生物医学前沿研究成果、材料学、物理学、电子、机械等 ...…

查看全部问答>

<计算机组成原理>小弟问一个DRAM存储器的问题

题目:说明1M×1位DRAM片子的刷新方法,刷新周期定为8ms。 解答:如果选择一个行地址进行刷新,刷新地址为A0——A8,因此这一行上的2048个存储元同时进行刷新,即在8ms内进行512个周期的刷新。按照这个周期数,512×2048=1048567,即对1M位的存 ...…

查看全部问答>

K9F1208U0B与K9F1208U0C有什么区别么?

我的平台上用的NAND FLASH,型号是K9F1208U0B,我想更换为U0C,不知两者有何区别。…

查看全部问答>

急!!!!求救

那位好心人有HEW的使用说明什么的。我以前没用过这个编译器。 誰知道怎么用阿。谢谢阿~~~~万分感激。。。…

查看全部问答>

写一下雕刻机制作的思路,抛砖引玉邀您一起参与

很高兴看到回复已经有6页之多了,说明这个帖子还是引起了大家的某些关注,不管是哪方面来说,我的用意没有白费。 下面逐步简单的说下我的思路和要考虑的方面,当然希望有兴趣且有能力的朋友参与到我们其中来。 简述如下 起因:本人大猫奔走 ...…

查看全部问答>

TIVA C Launchpad第五周的心得---USB CDC mode

程序内容:将Launchpad的USB设置成虚拟串口 同PC进行通讯。 根据以前学习的方法导入存在的工程文件C:\\ti\\TivaWare_C_Series-1.1\\examples\\boards\\ek-tm4c123gxl\\usb_dev_serial,将PC端的串口程序波特率设置为115200 , 8,n,1, 根据程序 ...…

查看全部问答>

新人想自学DSP

新人想自学DSP,大神们推荐几本书和学习版,还有DSP和STM32哪个相对好用点 …

查看全部问答>

求个关于比较器和51单片机组成的电容式触摸按键

我想做个电容式触摸按键,但是我没学过类似于ATMEGA88的单片机。…

查看全部问答>