社区导航

 

搜索
查看: 7524|回复: 22

弱弱的问一个ARM启动代码的问题

[复制链接]

85

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2010-5-26 10:02 | 显示全部楼层 |阅读模式
以下是一级向量表
ResetEntry
    b ResetHandler             ;复位处理
    b HandlerUndef             ;未定义处理
    b HandlerSWI             ;SWI中断处理
    b HandlerPabort             ;指令中止处理
    b HandlerDabort             ;数据中止处理
    b .                ;保留
    b HandlerIRQ                         ;中断处理
    b HandlerFIQ                         ;快速中断处理
;------------------------------------------------------------------
VECTOR_BRANCH                            ;中断向量表
    ldr pc,=HandlerEINT0              ;mGA 0x20
    ldr pc,=HandlerEINT1              ;
    ldr pc,=HandlerEINT2              ;
    ldr pc,=HandlerEINT3              ;
    ldr pc,=HandlerEINT4567              ;
    ldr pc,=HandlerTICK               ;mGA 0x34
        b .
        b .
    ldr pc,=HandlerZDMA0              ;mGB 0x40
    ldr pc,=HandlerZDMA1              ;
    ldr pc,=HandlerBDMA0              ;
    ldr pc,=HandlerBDMA1              ;
    ldr pc,=HandlerWDT               ;
    ldr pc,=HandlerUERR01              ;mGB 0x54
    b .
    b .
    ldr pc,=HandlerTIMER0              ;mGC 0x60
    ldr pc,=HandlerTIMER1              ;
    ldr pc,=HandlerTIMER2              ;
    ldr pc,=HandlerTIMER3              ;
    ldr pc,=HandlerTIMER4              ;
    ldr pc,=HandlerTIMER5              ;mGC 0x74
    b .
    b .
    ldr pc,=HandlerURXD0              ;mGD 0x80
    ldr pc,=HandlerURXD1              ;
    ldr pc,=HandlerIIC               ;
    ldr pc,=HandlerSIO               ;
    ldr pc,=HandlerUTXD0              ;
    ldr pc,=HandlerUTXD1              ;mGD 0x94
    b .
    b .
    ldr pc,=HandlerRTC               ;mGKA 0xa0
    b .                           
    b .
    b .
    b .
    b .                   ;mGKA
    b .
    b .
    ldr pc,=HandlerADC                  ;mGKB 0xc0
    b .                   ;
    b .                   ;
    b .                   ;
    b .                   ;
    b .                   ;mGKB
    b .
    b .
///////////////////////////////////////////////////
$HandlerLabel HANDLER $HandleLabel   定义的宏

$HandlerLabel                           
    sub     sp,sp,#4            ;
    stmfd   sp!,{r0}            ;
    ldr     r0,=$HandleLabel          ;
    ldr     r0,[r0]             ;
    str     r0,[sp,#4]            ;                        
    ldmfd   sp!,{r0,pc}
    MEND
/////////////////////////////////////////
HandlerFIQ  HANDLER HandleFIQ;
HandlerIRQ  HANDLER HandleIRQ
HandlerUndef HANDLER HandleUndef
HandlerSWI  HANDLER HandleSWI
HandlerDabort HANDLER HandleDabort
HandlerPabort HANDLER HandlePabort

HandlerADC  HANDLER HandleADC
HandlerRTC  HANDLER HandleRTC
HandlerUTXD1 HANDLER HandleUTXD1
HandlerUTXD0 HANDLER HandleUTXD0
HandlerSIO  HANDLER HandleSIO
HandlerIIC  HANDLER HandleIIC
HandlerURXD1 HANDLER HandleURXD1
HandlerURXD0 HANDLER HandleURXD0
HandlerTIMER5 HANDLER HandleTIMER5
HandlerTIMER4 HANDLER HandleTIMER4
HandlerTIMER3 HANDLER HandleTIMER3
HandlerTIMER2 HANDLER HandleTIMER2
HandlerTIMER1 HANDLER HandleTIMER1
HandlerTIMER0 HANDLER HandleTIMER0
HandlerUERR01 HANDLER HandleUERR01
HandlerWDT  HANDLER HandleWDT
HandlerBDMA1 HANDLER HandleBDMA1
HandlerBDMA0 HANDLER HandleBDMA0
HandlerZDMA1 HANDLER HandleZDMA1
HandlerZDMA0 HANDLER HandleZDMA0
HandlerTICK  HANDLER HandleTICK
HandlerEINT4567 HANDLER HandleEINT4567
HandlerEINT3 HANDLER HandleEINT3
HandlerEINT2 HANDLER HandleEINT2
////////////////////////////////////////////////
^ _ISR_STARTADDRESS;定义的二级中断向量表放在RAM里了
HandleReset  # 4
HandleUndef  # 4
HandleSWI  # 4
HandlePabort # 4
HandleDabort # 4
HandleReserved # 4
HandleIRQ  # 4
HandleFIQ  # 4

HandleADC  # 4
HandleRTC  # 4
HandleUTXD1  # 4
HandleUTXD0  # 4
HandleSIO  # 4
HandleIIC  # 4
HandleURXD1  # 4
HandleURXD0  # 4
HandleTIMER5 # 4
HandleTIMER4 # 4
HandleTIMER3 # 4
HandleTIMER2 # 4
HandleTIMER1 # 4
HandleTIMER0 # 4
HandleUERR01 # 4
HandleWDT  # 4
HandleBDMA1  # 4
HandleBDMA0  # 4
HandleZDMA1  # 4
HandleZDMA0  # 4
HandleTICK  # 4
HandleEINT4567 # 4
HandleEINT3  # 4
HandleEINT2  # 4
HandleEINT1  # 4
HandleEINT0  # 4
设中断模式为向量中断,假设EINT0发生,pC通过硬件逻辑跳到第一级中断向量表并执行ldr pc,=HandlerEINT0 跳到定义的宏里,而宏的功能仅是一个简单的二次跳转,跳到RAM里二级向量表中HandleEINT0处。问题来了,既然用LDR pc =XXXX这伪指令为什么中断来后不直接从一级向量表跳到二级向量表,而是进宏,来了个二次跳转呢?一次跳转不行吗?
有劳前辈略加分析
此帖出自ARM技术论坛

111

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2010-5-26 11:03 | 显示全部楼层
只是看了一下启动代码的流程,没有细细的研读过,只能帮顶,因为帖子已经掉到第二页了。。。。

回复

使用道具 举报

118

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2010-5-26 11:25 | 显示全部楼层
太感谢了,帮顶是美德

回复

使用道具 举报

96

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2010-5-26 11:53 | 显示全部楼层
哈哈,本人是来中华民族传统美德 的,哈哈。
以前一直没有想过这个问题,所以,我也去网上看了下资料,发现有位兄台是这样写的:

现在有个问题是理论上在最开始的异常向量入口处就可以跳转到中断程序的地方,为何还要多跳转一次呢?这样还使跳转程序稍有延迟。

         这应该是因为ARM指令固定为32位,然而一个绝对地址的长度也为32位,如果只用一条指令是没有办法跳转到任意位置的。而中断程序可以在4G的地址空间内的任意位置,为了兼容,就每个中断都单独用一个字长(32位)的存储位置来存储中断程序的入口地址。

       如果在开始用 B 进行中断程序跳转的话也是可以的。但是B指令的寻址范围是负32M到正的32M范围。而中断程序也许不在这个范围内,因此一般不直接用B指令跳转。

     也可以用MOV PC,#Immediate 跳转,虽然这个立即数可以是32位数,但是由于必须是8 位图立即数(这也是指令长度的限制,不可能把32 位立即数放在32 位的指令中.),也不能跳转到任意位置。

     用LDR PC,[PC,#OFFSET] 则可以任意跳转。LDR将存储于向量表附近的中断程序入口地址从存储器装载到PC。该入口地址是一个32位的绝对地址,因此可以跳到程序的任何位置。

地址是:http://hi.baidu.com/xqgoth/blog/item/4be10851dd06a4898c54309e.html

楼主可以去看看。呵呵



回复

使用道具 举报

108

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2010-5-26 12:05 | 显示全部楼层
非常感谢Peasant_Lee,不过正如你所说LDR伪指令的确可大范围跳转,问题就在这了,请看一级向量表,向量中断入口处的跳转方式都是用LDR伪指令实现跳转的,因此是没有范围限制的,那为何不能从这一次跳转到二级向量表表呢?而是必须先跳转到宏,然后再跳二级向量表

回复

使用道具 举报

97

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2010-5-26 12:28 | 显示全部楼层
http://hi.baidu.com/xqgoth/blog/item/4be10851dd06a4898c54309e.html 里面用的是LDR指令为ARM指令非伪指令,因此对于操作数为立即数的要求就比较苛刻了,虽然最高可支持32位立即数,但这个立即数必须靠偶数次移位获得,若要装一个地址则寻址范围只限4k以内。在上面向量表用的是伪指令LDR XXXX,=XXXXX 跳转无任何限制。还是有些疑惑,不过非常感谢两位

回复

使用道具 举报

96

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2010-5-26 12:36 | 显示全部楼层
mark mark

回复

使用道具 举报

102

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2010-5-26 12:38 | 显示全部楼层
THANKS

回复

使用道具 举报

102

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2010-5-26 13:41 | 显示全部楼层
这边宏定义只是为了保护现场,异常处理结束以后返回啊。
没有这个就出不来了。

回复

使用道具 举报

99

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2010-5-26 13:53 | 显示全部楼层
路过~~~~~~~~~~·顶之

回复

使用道具 举报

104

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2010-5-26 14:03 | 显示全部楼层
对于LDR伪指令来说,加载的Lable地址必须在相对PC的4K范围内,在第一级跳转时HandlerEINT0的地址应该是在4K范围,但是#HandleEINT0的地址在RAM中,有可能已经超过了4K的范围。所以应该使用2次跳转吧。
一般来说BootLoader的RO部分都是小于4K的吧,但是WR部分可以放在比较远的地址。

回复

使用道具 举报

114

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2010-5-26 14:04 | 显示全部楼层
设中断模式为向量中断,假设EINT0发生,pC通过硬件逻辑跳到第一级中断向量表并执行ldr pc,=HandlerEINT0 跳到定义的宏里,而宏的功能仅是一个简单的二次跳转,跳到RAM里二级向量表中HandleEINT0处。问题来了,既然用LDR pc =XXXX这伪指令为什么中断来后不直接从一级向量表跳到二级向量表,而是进宏,来了个二次跳转呢?一次跳转不行吗?
有劳前辈略加分析


楼主,代码我没看,我就看了你这段话,明白你要表达的意思了:
我打个比喻,现在一个中国人他环球旅行家人联系不到了立即卫星定位(相当于大范围地址跳转4G  ldr pc,=HandlerEINT0 )
通过卫星定位发现了他在亚马逊的某镇,接下来就用该镇的市话来找人就可以了
(相当于将HandlerEINT0 处理程序放在内部RAM的某个区域 小范围寻址速度快哦)

打了个乱78遭的比方。。汗~~~



回复

使用道具 举报

115

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2010-5-26 15:07 | 显示全部楼层
小范围寻址速度快哦 谢谢 hexian288 你这句话提醒了我,宏的作用可能的确与优化速度有关,因外一级表要跳到RAM里的二级表一次确实有点长,暂时这样理解

回复

使用道具 举报

132

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2010-5-26 15:29 | 显示全部楼层
呵呵~~这是我的理解,HandlerEINT0确实是在一个在启动代码映射后的地址4K范围内的一个固定地址,是相对寻址,其实直接寻址未必不行,并且速度更快,但是代码的可读性,理解都难多了

回复

使用道具 举报

94

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2010-5-26 16:00 | 显示全部楼层
中断发生--------->>PC进入中断向量表(硬件)--------->>ldr pc,*****(软件)

我画的图是不是你描述的模型??
是的话,继续往下看,如果不是,当我在放屁。

中断信号发生之后,环境符合要求(优先级,允许中断),那么下条指令程序进入中断向量,即特定的地址。
这个是硬件完成的。你是问为什么不直接在这里就处理掉中断过程,而要再次软件跳转是吧?因为,这里的地址空间只够一条跳转指令的,多了不够。这条指令的下条指令已经是其他的中断入口地址了(向量),所以,只能安排一个跳转指令跳到一个平常的地址去运行中断处理过程。在那里,不收代码空间的限制。

甚至,有的时候,跳转到****之后,上下文保护之后,又有来个weak调用,方便程序员管理中断。





回复

使用道具 举报

96

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2010-5-26 16:30 | 显示全部楼层
关于这个4K地址的问题,我仔细看了下对LDR伪指令的介绍,LDR RN,=DATA 可用一条汇编指令替代LDR RN, [PC,#OFFSET TO LITTERAL POOL]
这条伪指令的特点就是若给的立即数,或地址值不而且值若不能通过偶数次移位获得(即非法立即数),那么就需要在与当前指针最大偏移不超过4k的地方放一个文子池(程序员放),来存放这个地址或立即数(DCD 一个空间),执行LDR伪指令时从这个空间把数取出来,而这个数是32位的,故跳转距离以M为单位没问题的,可以实现任意单位的跳转,不止4K

回复

使用道具 举报

98

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2010-5-26 16:40 | 显示全部楼层
有篇文章挺详细
http://www.52rd.com/Blog/Detail_RD.Blog_hecrics_14830.html

回复

使用道具 举报

119

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2010-5-26 17:54 | 显示全部楼层
呵呵,终于有结果了吧。。。。。。

回复

使用道具 举报

111

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2010-5-26 18:10 | 显示全部楼层
嘿嘿,讨论半天还没我也没法推翻我的假设,可能我太菜 ,理解的有问题,讨论终归是讨论,调一下看看,这贴我晚点再结,分会给你们,谢谢大家

回复

使用道具 举报

110

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2010-5-26 18:22 | 显示全部楼层
哈哈,期待收获的季节,哈哈!

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 1/7 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

词云| Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-7-13 23:22 , Processed in 0.558795 second(s), 40 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表