如题,有几个问题小弟一直很困惑,请各位赐教。(以下问题针对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,跟之前的宏那里的值一样,这是为啥?