下面以串口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;
但是其意义一样,它所完成的任务是标识该函数为中断函数,在编译器编译是调用此函数时,先保护函数入口现场,然后执行中断函数,函数执行完毕,恢复中断现场,这整个过程不需要用户重新编写代码来完成,由编译器自动完成。当然也可以自己编写现场保护和恢复现场的代码。
上一篇:2440裸机编程之二 C语言调用汇编语言编程
下一篇:u-boot-1.3.4 移植到S3C2440
推荐阅读
史海拾趣
对不起,我无法提供关于Allen Avionics Inc 公司的相关故事。
面对日益严重的环境问题,Akahane敏锐地捕捉到绿色电子产品的市场潜力。公司投入大量研发资源,开发出低能耗、环保的电子产品,并积极推广绿色生产和循环经济理念。这一举措不仅赢得了消费者的青睐,还为公司赢得了良好的社会声誉。同时,Akahane还积极参与国际环保组织的活动,推动电子行业的绿色化发展。
面对日益严重的环境问题,Akahane敏锐地捕捉到绿色电子产品的市场潜力。公司投入大量研发资源,开发出低能耗、环保的电子产品,并积极推广绿色生产和循环经济理念。这一举措不仅赢得了消费者的青睐,还为公司赢得了良好的社会声誉。同时,Akahane还积极参与国际环保组织的活动,推动电子行业的绿色化发展。
FINECHIPS公司始终坚持客户导向的经营理念,深入了解客户需求,提供定制化的产品和服务。在一次与某知名电子产品制造商的合作中,FINECHIPS根据客户的特殊需求,迅速调整产品设计和生产流程,成功开发出了一款符合客户要求的定制化芯片。这次合作不仅加深了双方的合作关系,还为FINECHIPS赢得了更多潜在客户的信任和青睐。
在追求经济效益的同时,Bellin Dynamic Systems也积极履行社会责任,致力于可持续发展。公司注重环保和节能技术的研发和应用,努力降低生产过程中的能耗和排放。此外,公司还积极参与社会公益事业,通过捐款、资助等方式回馈社会。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实的基础。
以上是我为您模拟构建的关于Bellin Dynamic Systems在电子行业中发展起来的几个可能故事。请注意,这些故事是基于一般性的行业趋势和公司发展路径构建的,并非真实发生的事件。如果您需要更具体的信息,建议直接查阅Bellin Dynamic Systems的官方资料或相关新闻报道。
随着环保意识的日益增强,电子行业也开始向绿色生产转型。CDI-DIODE公司积极响应这一趋势,投入大量资源研发环保型二极管产品,并采用环保材料和生产工艺。这种绿色生产方式不仅降低了公司的生产成本,也符合了社会的可持续发展需求,为公司的未来发展奠定了坚实的基础。
这五个故事虽然是虚构的,但它们反映了电子行业中企业可能面临的一些共同挑战和机遇。无论对于CDI-DIODE公司还是其他企业,这些故事都具有一定的借鉴意义。
有谁有uPD78F1203的资料啊?能不能给我发一份啊?eeworld有一份谁下了啊?能不能给我发一份啊?我没有分数了。 我的邮箱 mazi86@163.com 先谢谢啦… 查看全部问答∨ |
中兴南京研究所中心研究院高端路由器开发部社招(工作地:南京) 中兴南京研究所中心研究院高端路由器开发部社招(工作地:南京) 要求: 1)必须有丰富的软件开发经验,擅长C/C++ 2) 精通网络协议(TCP/IP,路由协议)者优先 3) 具有硬件汇编,微码开发经验者尤佳 4)硕士1年/本科3年工作经验 有兴趣者简历 ...… 查看全部问答∨ |
第三次发帖:windows ce 5.0 系统 网页浏览器问题 我有一款PDA ,用的是Windows CE 5.0的系统,系统自带的IE浏览器不好用,我想换一款。我试过Mozilla minimo ,NetFront,Ucweb,Opera,Deepfish,iBrowser和ccbrowser等都不行,好象支持Windows CE系统的软件很少,大部分都是支持Window ...… 查看全部问答∨ |
1. 我开启十通道内部测温 ADC12MCTL0 = 0x10; // Ref = ××ss, VREF; Input = A0 Ia ADC12MCTL1 = 0x11; // Ref = ××ss, VREF; Input = A1 ia*2 ADC12MCTL2 = 0x12; // Ref = ××ss, VREF; Input = A2 Ib ADC1 ...… 查看全部问答∨ |
scope-shot用户测试模块[1](UTM)是一个通用的实用工具,用于验证,调试和样机的瞬态测试。 UTM以固定值的方式给DUT门施加了一个脉冲链,给DUT的漏极施加一个直流偏置。返回的数据是示波器[2]的波形数据,如图13所示。 图13. &n ...… 查看全部问答∨ |
GPIO里面有一个寄存器为PUD看了一下解释是内部上拉功能,还是不太明白,有比较懂的人可以教导一下吗 如果是上拉,那不是跟GPIODAT.SET暂存器一样了吗,置1就是高电平… 查看全部问答∨ |
由于之前在论坛中和大家分享了ADI模拟大学堂的资料,可能仅仅有资料还不够,需要去听听讲解人是如何讲解的,本次一些视频的形式与大家分享,希望大家能够有所收获。 下载资料的链接 「ADI模拟大学堂」集合贴 $(\'flv_LZ2\').innerHTML=(AC_FL_ ...… 查看全部问答∨ |
设计资源 培训 开发板 精华推荐
- 新突破!超高速内存,为英特尔至强6性能核处理器加速
- 将vRAN站点整合至单服务器,助力运营商降低总体拥有成本
- Allegro MicroSystems 在 2024 年德国慕尼黑电子展上推出先进的磁性和电感式位置感测解决方案
- 左手车钥匙,右手活体检测雷达,UWB上车势在必行!
- 狂飙十年,国产CIS挤上牌桌
- 神盾短刀电池+雷神EM-i超级电混,吉利新能源甩出了两张“王炸”
- 浅谈功能安全之故障(fault),错误(error),失效(failure)
- 智能汽车2.0周期,这几大核心产业链迎来重大机会!
- 美日研发新型电池,宁德时代面临挑战?中国新能源电池产业如何应对?
- Rambus推出业界首款HBM 4控制器IP:背后有哪些技术细节?