buf

BE something YOU love and understand
posts - 94, comments - 35, trackbacks - 0, articles - 2
   :: 首页 :: 新随笔 :: 联系 ::  :: 管理

这中断跳转的路线真够长的

Posted on 2007-11-21 13:41 buf 阅读(402) 评论(0)  编辑 收藏 引用 所属分类: Embedded

先来看看这条路线吧,还是以SWI异常为例:
address               instruction                                             
------------------------------------------------------------------------------------------
0x0000_0008      ldr pc, 0x0c00_0008                         
...                        ...
0x0c00_0008      0xea00_1ffe -> b 0x0c00_8008
...                        ...
0x0c00_8008      b =HandlerSWI
...
HandlerSWI   Handler   HandleSWI
// in HandlerSWI, load pc the content of word at HanleSWI
...
MAP   _ISR_STARTADDRESS // 0x0c7ff_ff00
...
Handle   #   4
...


这下很清楚了,不过我还是说明一下:发生SWI异常后,由cpu的硬件逻辑跳转到0x0000_0008处,这是ROM中bootloader的代码区,而u-boot不做任何处理,只是简单的把控制权交给用户:跳转到0x0c00_0008处,剩下的事你自己看着办吧,呵呵。用户代码中的isr_init()在这里又写了一条branch指令,跳转到0x0c00_8008处。因为我们使用u-boot把用户程序下载到0x0c00_0000处开始的SDRAM,入口是44binit.S,最初的一段代码也是一系列的跳转,真正的ISR入口地址存放于SDRAM的高端区域。这下,各个环节终于串起来了,yeah。不过,第一感觉,费那多事干啥呢?

于是尝试了修改了/u-boot/cpu/s3c44b0/start.S,当发生异常/中断时直接从SDRAM的高端加载ISR入口地址到pc(使用44binit.s中于Handler类似的macro),成功了。不过又觉得,这样u-boot是不是做的太多了,毕竟异常/中断的处理应该是用户程序的事情。

P.S.
今天看到一篇U-Boot-1.1.6 基于S3C44B0的移植,挺不错的,打算也在自己的板子上实验一下。然后注意到从00ic买的板子就是北京恒丰瑞科的那种,倒。另外,介绍S3C44B0中断的文章,有位大哥写的挺清晰的,推荐一下:关于S3C44b启动代码中中断初始化部分的讨论和问题
只有注册用户登录后才能发表评论。