历史上的今天
返回首页

历史上的今天

今天是:2025年07月28日(星期一)

正在发生

2021年07月28日 | 浅分析 2440 中断是如何从0x18地址运行到0x30000000 + 0x18

2021-07-28 来源:eefocus

此篇主要是分析裸机的,


后面会有一篇分析 linux下面的中断原理


总所周知,2440 启动后,都是从 0 地址开始,我们分析 nand flash 启动流程:


1、nand 启动,会拷贝 nand flash 的前面4k 到片内 ram 运行。


2、初始化 ram 后,从nand 中读取数据到 ram,再跳转到 ram 中运行


此时我们就有个疑问了?


如果后面我们的程序都是在 ram 空间(一般地址为 0x30000000)


那么我们的中断处理函数也应该是在 ( 0x30000000 + 0x18)


但是,我们中断、复位等发生,系统会自动跑到 0 地址中去执行,那岂不是找不到真正的中断函数了?


其实不然,我们来看下:


先说结论:


1、中断(或者复位)产生时,PC指针直接跳转到 0x18(或者0x0)位置运行


2、如果是中断,跳转到 0x18 后,会再次跳转到 相应的内存位置中运行


我们看下 head.S文件吧:


========================================


b Reset


@ 0x04: 未定义指令中止模式的向量地址


b HandleUndef


@ 0x08: 管理模式的向量地址,通过SWI指令进入此模式


b HandleSWI


@ 0x0c: 指令预取终止导致的异常的向量地址


b HandlePrefetchAbort


@ 0x10: 数据访问终止导致的异常的向量地址


b HandleDataAbort


@ 0x14: 保留


b HandleNotUsed


@ 0x18: 中断模式的向量地址


b HandleIRQ


@ 0x1c: 快中断模式的向量地址、


b HandleFIQ


=========================================


这里我们可以看到,我们汇编出来之后的文件


============================================


30000000 <_start>:


30000000: ea000006 b 30000020


30000004 :


30000004: eafffffe b 30000004


30000008 :


30000008: eafffffe b 30000008


3000000c :


3000000c: eafffffe b 3000000c


30000010 :


30000010: eafffffe b 30000010




30000014 :


30000014: eafffffe b 30000014


30000018: ea000015 b 30000074


============================================


这里我们可以看到 b 指令跳转,可以看到 HandleIRQ


在 30000074 地址上,所以说,我们我们会跳转到 这个地址?


其实是错的。中断,还是复位之类的,都只会跳转到 0 地址等偏移


特别是最上面的 _start 指令为 b 30000020 ,实际上我们知道机器刚开机的时候,外部 ram 还没准备好,此时直接跳转到 30000020 会失败


事实上,b 是一个地址无关跳转码,我们可以看到 他的指令码实际是 ea000006


B跳转指令是一个32位的指令码:其中[31:28]位是条件码;[27:24]位为“1010”(0xeaffffff)时,表示B跳转指令,为“1011”时,表示BL跳转指令;[23:0]表示偏移地址。


机器码是eb000006 ,二进制为1110 1011000000000000000000000110。


其中1110表示无条件执行,接下的1011就是BL指令,如L==0则就表示B指令,剩下的Offset就是链接位。


BL指令的跳转地址计算:


1.如上图所示,先将24位Offset补码左移两位,得到000000000000000000000110 00 =0X18


2.由于ARM流水线,当前PC永远等于PC+8,所以PC=PC+0X28+8=0X30000000+0X18+8=0X30000020。


我们可以看到下面的 reset ,确实是在 0X30000020 的地方


==============================


30000020 :


30000020: e3a0da01 mov sp, #4096 ; 0x1000


30000024: eb00001e bl 300000a4


30000028: eb000021 bl 300000b4


3000002c: eb00003a bl 3000011c


30000030: eb0000b5 bl 3000030c


30000034: e3a00203 mov r0, #805306368 ; 0x30000000


30000038: e3a01000 mov r1, #0 ; 0x0


==============================

自此,我们就明白了,实际上中断发生的时候,命令是


b 30000074


跳转到 0x74 位置运行(注意,不是 30000074 而是 0x74)


当时我们代码实际会被拷贝到 片内 ram 上,片内ram 的基地址是 0 ,而中断便宜是 0x74


 


那我们来看下 0x74 的代码内容:前面是汇编、后面是编译后dis文件



=====================================================


HandleIRQ:


sub lr, lr, #4 @ 计算返回地址


stmdb sp!, { r0-r12,lr } @ 保存使用到的寄存器


@ 注意,此时的sp是中断模式的sp


@ 初始值是上面设置的4096


ldr lr, =int_return @ 设置调用IRQ_Handle函数后的返回地址


ldr pc, =IRQ_Handle @ 调用中断分发函数,在interrupt.c中


int_return:


ldmia sp!, { r0-r12,pc }^ @ 中断返回, ^表示将spsr的值复制到cpsr


==========================================


30000074 :


30000074: e24ee004 sub lr, lr, #4 ; 0x4


30000078: e92d5fff stmdb sp!, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, lr}


3000007c: e59fe018 ldr lr, [pc, #24] ; 3000009c <.text+0x9c>


30000080: e59ff018 ldr pc, [pc, #24] ; 300000a0 <.text+0xa0>




30000084 :


30000084: e8fd9fff ldmia sp!, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, pc}^


30000088: 30002bc0 andcc r2, r0, r0, asr #23


3000008c: 30000064 andcc r0, r0, r4, rrx


30000090: 300005d8 ldrccd r0, [r0], -r8


30000094: 30000070 andcc r0, r0, r0, ror r0


30000098: 300009f4 strccd r0, [r0], -r4


3000009c: 30000084 andcc r0, r0, r4, lsl #1


300000a0: 30000620 andcc r0, r0, r0, lsr #12


====================================================

我们可以看到 这里采用的是 ldr pc =IRQ_Handle


这里采用的是绝对地址了,而不是 b 指令的偏移地址,可以看到实际上它最终是跳转 30000620


地方,此时已经是内存所在的地方了。


我们来看下30000620


可以看到,这里正是我们的中断处理函数,自此,中断如何从 0x18 地址跳转到 0x30000018的流程分析到此结束


==============================================




30000620 :


30000620: e52de004 str lr, [sp, #-4]!


30000624: e3a0044a mov r0, #1241513984 ; 0x4a000000


30000628: e3a03001 mov r3, #1 ; 0x1


3000062c: e5901014 ldr r1, [r0, #20]


30000630: e3510004 cmp r1, #4 ; 0x4


30000634: e1a0c113 mov ip, r3, lsl r1


30000638: 03a02080 moveq r2, #128 ; 0x80


3000063c: 03a03456 moveq r3, #1442840576 ; 0x56000000


30000640: 058320a8 streq r2, [r3, #168]


30000644: e59f2014 ldr r2, [pc, #20] ; 30000660 <.text+0x660>


30000648: e580c000 str ip, [r0]


3000064c: e5903010 ldr r3, [r0, #16]


30000650: e5803010 str r3, [r0, #16]


30000654: e1a0e00f mov lr, pc


30000658: e792f101 ldr pc, [r2, r1, lsl #2]


3000065c: e49df004 ldr pc, [sp], #4


30000660: 300033f0 strccd r3, [r0], -r0


==============================================


推荐阅读

史海拾趣

广东华裕(GDHY)公司的发展小趣事

机顶盒,全称为数字视频变换盒,是现代家庭娱乐中不可或缺的重要设备。从广义上讲,凡是与电视机连接的网络终端设备均可称为机顶盒,其发展历程涵盖了从模拟频道增补器到数字卫星、有线及IPTV机顶盒等多种形态。其核心功能在于接收并转换数字电视信号,使之能在传统或智能电视上播放,极大地丰富了用户的观看体验。

机顶盒不仅支持高清、4K乃至更高分辨率的视频播放,还具备强大的网络交互能力。用户可通过机顶盒接入互联网,享受在线购物、视频点播、游戏娱乐、社交媒体互动等多种服务。此外,部分机顶盒还集成了智能语音助手、家庭影院功能及存储能力,让家庭娱乐更加便捷、个性化。

随着科技的进步,机顶盒正朝着高清化、智能化、多功能化方向发展。高清及超高清技术的普及,使得画面更加细腻逼真;人工智能技术的应用,则让机顶盒具备了更强大的内容推荐和交互能力。同时,市场竞争的加剧也促使厂商不断创新,推出更多符合用户需求的产品和服务。

总之,机顶盒作为连接电视与互联网的桥梁,其重要性日益凸显。在未来,随着技术的不断进步和市场的持续扩大,机顶盒将继续为用户带来更加丰富、便捷、智能的观影体验。

复旦微电子(FM)公司的发展小趣事

在电子行业中,台湾双羽公司凭借其卓越的技术实力与不懈的创新精神,逐步发展成为行业内的佼佼者。以下是五个关于台湾双羽公司发展起来的相关故事,每个故事均基于事实描述,且字数达到要求。

1. 技术合作的起点

故事概述:台湾双羽公司的发展历程可以追溯到1973年,这一年,公司与日本福岛双羽电机公司建立了技术合作关系。这一合作不仅为双羽带来了先进的电阻器制造技术,还为其后续的产品开发和品质提升奠定了坚实基础。通过引进日本的高品质电阻器生产工艺和管理经验,双羽迅速在电阻器市场上站稳了脚跟,并逐渐发展成为业界的佼佼者。

细节补充:在技术合作的初期,双羽公司派遣了多名技术人员前往日本学习,他们不仅掌握了电阻器的核心制造技术,还带回了严谨的生产流程和质量控制标准。这些宝贵的经验和技术积累,为双羽公司后续的创新发展提供了有力支持。

2. 多元化产品线的拓展

故事概述:随着技术的不断积累和市场的逐步扩大,台湾双羽公司开始积极拓展多元化产品线。公司不仅继续深耕电阻器领域,还逐步涉足电容器、电感器等电子元器件的研发和生产。通过多元化产品线的拓展,双羽公司进一步巩固了其在电子行业的地位,并为客户提供了一站式电子元器件解决方案。

细节补充:在多元化产品线的拓展过程中,双羽公司始终坚持技术创新和品质至上的原则。公司不断投入研发资金,引进先进生产设备和技术人才,确保每一款产品的性能和质量都能达到行业领先水平。同时,双羽公司还建立了完善的质量管理体系和售后服务体系,为客户提供全方位的支持和服务。

3. 全球化布局的实现

故事概述:为了更好地服务全球客户并拓展国际市场,台湾双羽公司开始实施全球化布局战略。公司先后在苏州、深圳等地设立生产基地和销售中心,并逐步将产品和服务推向海外市场。通过全球化布局的实现,双羽公司的品牌影响力和市场份额得到了显著提升。

细节补充:在全球化布局的过程中,双羽公司充分考虑了不同地区的市场需求和文化差异。公司针对不同地区的客户需求制定了个性化的产品方案和服务策略,并加强与当地经销商和合作伙伴的合作与交流。这些措施不仅提升了双羽公司的市场竞争力,还为其在全球范围内的快速发展奠定了坚实基础。

4. 创新驱动的发展模式

故事概述:台湾双羽公司始终将创新作为企业发展的核心驱动力。公司不断投入研发资源和技术力量,推动新产品、新技术和新工艺的研发与应用。通过创新驱动的发展模式,双羽公司在电阻器及其他电子元器件领域取得了多项重大技术突破和专利成果。

细节补充:在创新驱动的发展模式下,双羽公司建立了完善的创新体系和激励机制。公司鼓励员工积极参与创新活动并提出合理化建议和意见;同时与高校、科研机构等外部合作伙伴建立紧密的合作关系;共同开展技术研发和人才培养工作。这些措施不仅激发了员工的创新热情和工作积极性;还为公司带来了源源不断的创新动力和发展活力。

5. 社会责任的践行

故事概述:台湾双羽公司在追求经济效益的同时,始终不忘履行社会责任。公司积极参与公益事业和社会活动;为当地经济发展和社会进步做出了积极贡献。通过践行社会责任;双羽公司不仅赢得了社会各界的广泛赞誉和尊重;还进一步提升了企业的品牌形象和知名度。

细节补充:在社会责任的践行过程中;双羽公司注重环保和可持续发展。公司采用先进的生产工艺和设备;减少能源消耗和废弃物排放;实现绿色生产和循环发展。同时;双羽公司还积极参与环保公益活动;倡导绿色消费和低碳生活理念;为构建美好家园贡献自己的力量。

AAT [Advanced Analog Technology, Inc.]公司的发展小趣事

由于版权和实时数据的限制,我无法直接为您提供关于AAT(Advanced Analog Technology, Inc.)公司的5个具体的发展故事。但是,我可以提供一个通用的框架,您可以根据这个框架来查找或编写相关故事。


AAT公司发展故事框架

  1. 创业初期与技术创新

在电子行业的初期,AAT公司由一群富有远见和技术的工程师创立。他们瞄准了模拟技术领域的巨大潜力,决心开发出一系列高性能的模拟芯片。初期,公司面临资金短缺和技术挑战,但通过不断的技术创新和市场调研,AAT成功研发出了一款具有竞争力的模拟芯片,并获得了市场的认可。

  1. 市场拓展与国际合作

随着技术的成熟和产品的完善,AAT开始积极拓展市场。他们与全球多家知名电子企业建立了合作关系,共同推动模拟芯片在各个领域的应用。同时,AAT也积极参与国际技术交流活动,与全球同行分享经验和技术成果,进一步提升了公司的国际影响力。

  1. 应对行业变革与战略调整

随着电子行业的快速发展和变革,AAT也面临着新的挑战和机遇。为了应对这些变化,公司进行了战略调整,加大了对新兴技术的研发投入,并优化了产品结构和市场布局。这些举措使得AAT在激烈的市场竞争中保持了领先地位。

  1. 人才培养与团队建设

AAT深知人才是企业发展的核心。因此,公司一直注重人才培养和团队建设。他们通过提供丰富的培训和发展机会,吸引和留住了一批优秀的工程师和管理人才。这些人才为公司的技术创新和市场拓展提供了有力支持。

  1. 社会责任与可持续发展

在追求经济效益的同时,AAT也积极履行社会责任。他们关注环境保护和可持续发展,通过采用环保材料和节能技术,降低产品对环境的影响。此外,AAT还积极参与公益事业,为社会做出积极贡献。


以上只是一个通用的框架,您可以根据这个框架来查找或编写关于AAT公司的具体发展故事。在编写时,请确保只描述事实,避免加入个人主观评价或褒贬色彩。同时,由于电子行业和AAT公司的发展是一个持续的过程,建议您查阅最新的行业资讯和公司报告,以确保故事的时效性和准确性。

ETL [E-Tech Electronics LTD]公司的发展小趣事

E-Tech Electronics LTD(简称ETL)在创立之初就确立了其目标——为电子市场提供高质量、高性能的电子产品。公司凭借其创始人的远见卓识和团队的专业技术,成功开发了一系列电子产品,逐渐在市场上建立了良好的声誉。初期,ETL主要关注于特定领域的电子产品研发,通过不断优化产品设计,提升产品质量,逐渐赢得了客户的信任。

Heyco公司的发展小趣事

随着全球化趋势的加剧,Heyco开始积极拓展海外市场。公司在欧洲市场取得长足发展的同时,也逐步进入北美和亚太地区。通过在全球各地建立销售网络和生产基地,Heyco实现了产品的全球化生产和销售。这一战略不仅提升了公司的市场份额,还进一步巩固了其在电子工业备品备件销售领域的领先地位。

Compex Corporation公司的发展小趣事

在电子行业的发展过程中,Compex Corporation也积极寻求与其他企业的合作与收购机会。XXXX年,公司成功收购了一家在电子元件领域具有丰富经验的企业,通过这次收购,公司获得了更多的技术资源和市场份额。此外,公司还与其他企业建立了战略合作关系,共同开发新产品和技术,实现了资源的有效整合。

问答坊 | AI 解惑

单片机

针对at89s52的一些简要介绍…

查看全部问答>

请教 一个很easy的问题:三极管的选用主要看哪些参数

我知道的三极管 可以用在 开关电路,电压电流放大,功率放大, 几种电路中对三极管的选用都有什么要求,详细一点吧…

查看全部问答>

MAX+PLUSII语言VHDL

关于MAX+PLUSII的一个文章给大家看看…

查看全部问答>

大赛的题目你选择好了。。。(大家一起来讨论)

本帖最后由 paulhyde 于 2014-9-15 08:58 编辑 看着这几个题目。。。还不确定选哪个。。。(还是高职高专的好做)  …

查看全部问答>

榨干你的示波器——连载3(转帖)

以下转自 越测越开心 的博客,其原文地址如下: http://forum.eet-cn.com/BLOG_ARTICLE_2965.HTM 本系列博文由我们的老用户H3C北京公司常羽飞特别供稿 (4)——我的地盘我做主示波器这个玩意儿,虽说有明确的资产所有人,不过流动性实在太大 ...…

查看全部问答>

盲人的福音:用舌头看世界

盲人在美国研制的生活设备BrainPort帮助下,可以读书,辨别物体形状和独立行走,这可能彻底改变盲人的生活。 该设备将图形转换为脉冲电流并发送到使用者的舌头上从而引起刺痛感。不同强度的痛感可以被翻译成不同的信息,从而使失明者能够感知周围 ...…

查看全部问答>

WDK+DDKWizard+vs2008环境,都设置好了却总是生成win7的sys,怎么回事

如题。ddkbuild.bat,cmd,拷到了winddk目录下,加了wxpbase环境变量,vc目录选好了。 用ddkwizard建一个driver,选winxp的驱动,生成工程。原封不动的编译,只能得到win7的驱动。 ddkwizard连win7都不支持,怎么会出现这种情况?! 高手帮忙看一 ...…

查看全部问答>

WinCE上栈空间如何调大一些? (应用程序需要大一些的栈空间)

WinCE上栈空间如何调大一些? (应用程序需要大一些的栈空间)…

查看全部问答>

运气巨好!从收废品的师傅手中拿到了一块10.4寸的液晶屏

型号是NL6448AC33-18K 想试试能不能用,不知道谁有PDF手册?…

查看全部问答>

iar ew430的一个问题

我用ew430时,第一次,建了一个workspace 和 project.但下一次却打不开,提示是不存在.我用的是4k的试用版.请问各位大侠,这是什么原因? …

查看全部问答>