主题 : 请教各位几个问题?谢谢啊 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 5195
精华: 0
发帖: 24
金钱: 140 两
威望: 52 点
综合积分: 48 分
注册时间: 2009-04-13
最后登录: 2014-04-30
楼主  发表于: 2011-03-29 15:17

 请教各位几个问题?谢谢啊

如题,有几个问题小弟一直很困惑,请各位赐教。(以下问题针对mrico2440电路板)
1.分散加载文件描叙了程序的装载区和运行区(可能还有其他的叫法都一样),装载区就理解成烧进flash的地址了,而运行区是指程序实际运行的地址。装载区和运行区的地址可能不一样,那么小弟一直不明白的是,既然是不一样,那么肯定涉及到把装载区的程序复制到运行区这个过程,请问这个过程是程序员写码完成的,还是“系统自己”完成的,我说“系统自己”是因为我也说不清是啥东西,或许是链接器,或许是内核本身,总之就不是人干的。还有请问如果我烧好了一个板子,这个过程是在程序跑启动代码之前完成的,还是之后完成的。

2.类似问题接上面,系统由NAND_flash启动时也要干复制代码这事,那么这事又是谁来干的,是在什么时候干的?

3.移植ucos时要用到swi异常,一句SWI 0x0跳到了SWI异常,然后友善提供的启动代码中,我指的代码是指友善提供的非操作系统工程的启动代码,而非ucos工程的启动代码,我不知道两者是不是一样的。到了pc=0x8位置SWI异常之后,这里是一句“HandlerSWI      HANDLER HandleSWI”,HANDLER 实际上是一个宏,型如:
     MACRO
$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
就是跳到HandleLabel去。这里参数HandleLabel实际上HandleSWI,是_ISR_STARTADDRESS(0x33FFFF00)处MAP的一段内存表。
这里我有两点不明白
1.宏的第一句话sub    sp,sp,#4是否应该是sub    lr,lr,#4,然后将lr入栈?减sp我不明白什么意思?
2.我重写了一个宏,专门用于SWI异常。0x8处也相应的改成了HandlerSWI      SWIHANDLER FONHandleSWI,FONHandleSWI是外部C里面的SWI异常服务程序。
     MACRO
$HandlerLabel SWIHANDLER $SWIHandleLabel
                    IMPORT     SWIHandleLabel
                    EXPORT    HandlerLabel
$HandlerLabel
                   SUB     LR, LR, #4                      
          STMFD   SP!, {R0-R3, R12, LR}    
          MRS     R3, SPSR                
          STMFD   SP, {R3,LR}^    
        
          BL  $SWIHandleLabel
                    LDMFD   SP, {R3,LR}^                
          LDMFD   SP!, {R0-R3, R12, PC}^      
                    MEND
我且不管这个宏跑得对还是不对,就一个最基本的,我既然是跳到外部的FONHandleSWI()函数去,那么这个地址应该就是0x000000xxx才对,因为在flash里面嘛,结果我仿真之后发现此处的跳转地址值依然是0x33FFFFxx,跟之前的宏那里的值一样,这是为啥?