ARM(44b0)初学者总结(转载)
以下我们来解决这几个问题:
了解这几个链接参数的意义后我们可以设置这几个参数了:对于我的44B0X板8M SDRAM在0XC00_0000.因此在开发时把ADS中的RO BASE的地址指定为0XC00_0000;置于RW,在程序完成前可以预先估计一下程序的体积有多大,需要用到的数据区有多大,避免数据区太小或代码区覆盖掉前面的数据区就是了,我用了0XC10_0000,1M的代码空间,其他作数据区。这样,我们编译出来的程序代码就是在0XC00_0000中,可以直接由仿真器写入RAM中运行仿真运行。此外,在linker-〉layout页有个object symbol和section的选项,要求你填入映像文件最开始的object文件名和段名,这两个参数在仿真时不填写也不会影响运行,因为仿真器会自动修改pc指针,但要建立能烧写的映像文件,则一定要填写好,具体填写什么后面分析程序时再讲。
AREA Init,CODE,READONLY
ENTRY
b ResetHandler ;for debug
b HandlerUndef ;handlerUndef
b HandlerSWI ;SWI interrupt handler
b HandlerPabort ;handlerPAbort
b HandlerDabort ;handlerDAbort
b . ;handlerReserved
b HandlerIRQ
关键字ENTRY告诉编译器保留这段代码。从代码看INIT段就是要写入0X0地址的原始中断向量,因此把这个文件编译生成的44BINIT.O和 INTT填入上面提到的LAYOUT页对应项中。这样编译器会把该段代码编译到0X0地址。(仿真时你可以试试别填这两个项目,看看ADX中的反汇编代码入口被放到哪里)。
这段代码里除了reset句外,有每句都有一个HandlerXXX的标号,这就是前面提到的中断处理程序的入口,它是由前面的一个宏来定义的:
MACRO
$HandlerLabel HANDLER $HandleLabel
$HandlerLabel
sub sp,sp,#4 ;decrement sp(to store jump address)
stmfd sp!,{r0}
;PUSH the work register to stack(lr doest push because it return to original address)
ldr r0,=$HandleLabel;load the address of HandleXXX to r0
ldr r0,[r0] ;load the contents(service routine start address) of HandleXXX
str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack
ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR)
MEND
这是ads输出的汇编代码,就是刚才的宏对应swi的一个实例,其中有两句
是把0x0c000600的内容载入r0,再把r0地址的ram单元载入r0.去看看0xc000600的内容,是0X0c7fff08,这是我设定的内存中的中断向量表地址之一,中断向量表的起始地址是0X0c7fff00,因此0X0c7fff08存放的刚好就是swi的isr地址。后面程序就跳到对应的ISR去了。(这段宏程序由于我不熟悉
ARM44b0初学者总 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)