Chinaunix首页 | 论坛 | 博客
  • 博客访问: 111666
  • 博文数量: 6
  • 博客积分: 2000
  • 博客等级: 大尉
  • 技术积分: 360
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-28 10:01
文章分类

全部博文(6)

文章存档

2011年(1)

2008年(5)

我的朋友

分类:

2008-03-13 22:41:18

;对上次的step1进行了修改,差不多已经能够通过ADS的编译了,可是,有一个问题迟迟得不到解决,编译器总是说BaseOfROM,TopOfROM,BaseOfBSS,BaseOfZero,EndOfBSS这四个地址Undefined,据我所知,这五个变量应该是编译器定义的啊:
;BaseOfROM DCD |Image$$RO$$Base|
;TopOfROM DCD |Image$$RO$$Limit|
;BaseOfBSS DCD |Image$$RW$$Base|
;BaseOfZero DCD |Image$$ZI$$Base|
;EndOfBSS DCD |Image$$ZI$$Limit|
可是为什么会找不到呢?我尝试了很多办法,总以失败结束……无语了……
 
 GET define.inc ;包含一些基本的常量定义
 GET Memcfg.inc ;包含一些RAM控制的常量的定义
 AREA |.text|, CODE, READONLY
 IMPORT Main
 
SMRDATA DATA
 DCD (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))
 DCD ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))   ;GCS0
 DCD ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))   ;GCS1
 DCD ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))   ;GCS2
 DCD ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))   ;GCS3
 DCD ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))   ;GCS4
 DCD ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))   ;GCS5
 DCD ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))    ;GCS6
 DCD ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))    ;GCS7
 DCD ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Tsrc<<18)+(Tchr<<16)+REFCNT)
 DCD 0x32     ;SCLK power saving mode, BANKSIZE 128M/128M
 DCD 0x30     ;MRSR6 CL=3clk
 DCD 0x30     ;MRSR7 CL=3clk
 
 ALIGN
Bootloader
step1
 ldr r0, =0x4a000008 ;rINTMSK中断
 ldr r1, =0xffffffff ;禁止所有中断
 str r1, [r0]
 ldr r0, =0x53000000 ;rWTCON 关闭看门狗
 ldr r1, =0x0
 str r1, [r0]
 
 
;设置CPU的速度和频率
 ldr r0, =0x4c000000 ;rLOCKTIME锁定时间计数值寄存器,地址为0x01d8000c
 ldr r1, =0xfff ;初始值
 str r1, [r0]
 
;设定系统主时钟频率 
;设置 MPLL
 ldr r0,=0x4c000004 ;rMPLLCON
 ldr r1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV)  ;Fin=16.9344MHz
 str r1,[r0]
 str r1, [r0]
 ldr r0, =0x4c00000c ;rCLKCON时钟控制寄存器,地址为0x01d80004
 ldr r1, =0x7ff8;关闭一些时钟外围设备而保留一些必须的,节省资源
;初始化堆栈,要对所有不同的模式进行分别初始化,因为对于不同的模式sp寄存器是不同的
 mrs r0, cpsr;读取cpsr的状态
 bic r0, r0, #MODEMASK ;
 orr r1, r0, #UNDEFMODE|NOINT ;UNDEFMODE: 0x1b NOINT: 0xc0, 设为未定义指令终止模式禁止FIQ和IRQ中断
 msr cpsr_cxsf, r1
 ldr sp, =UndefStack ;0xc7ffb00
 orr r1, r0, #ABORTMODE|NOINT
 msr cpsr_cxsf, r1 ;数据访问终止模式
 ldr sp, =AbortStack ;0xc7ffd00
 orr r1, r0, #IRQMODE|NOINT
 msr cpsr_cxsf, r1 ;外部中断模式
 ldr sp, =IRQStack ;0xc7ffe00
 orr r1, r0, #FIQMODE|NOINT
 msr cpsr_cxsf, r1 ;快速中断模式
 ldr sp, =FIQStack ;0xc7fff00
 bic r0, r0, #MODEMASK|NOINT
 orr r1, r0, #SVCMODE
 msr cpsr_cxsf, r1 ;管理模式
 ldr sp, =SVCStack ;0xc7ffb00
 ;RAM初始化
;包括正确地设置系统内存控制器的功能寄存器以及各内存库控制器等共13个需要初始设置的寄存器?
 ldr r0, =SMRDATA ;取得这13个寄存器的初始设置段地址
 ldmia r0, {r1-r13} ;将13个初始值推入r1-r13中
 ldr r0, =0x48000000 ;将r0指向rBWSCON, 地址为0x48000000,
 stmia r0, {r1-r13} ;将初始值填入这13个寄存器
;从SMRDATA标号开始的一段连续的地址中存放了这13个寄存器的初始化数据。
;为stage2准备RAM空间
;BaseOfROM DCD |Image$$RO$$Base|
;TopOfROM DCD |Image$$RO$$Limit|
;BaseOfBSS DCD |Image$$RW$$Base|
;BaseOfZero DCD |Image$$ZI$$Base|
;EndOfBSS DCD |Image$$ZI$$Limit|
0
 ldr r2, BaseOfBSS ;BaseOfBSS ;数据段基地址
 ldr r3, BaseOfZero ;BaseOfZero ;未初始化的数据段基地址0
 cmp r2, r3 ;比较r2,r3的值
 ldrcc r1, [r0], #4 ;r2 strcc r1, [r2], #4 ;r2 bcc %B0 ;跳回标号0处执行,直到r2=r3
 mov r0, #0 ;将0装入r0
1
 cmp r2, r3 ;比较r2和r3,此时r2值为BaseOfZero
 strcc r0, [r2], #4 ;r2 bcc %B1 ;跳回标号1处执行,直到r2=r3
 
;拷贝stage2到RAM
 ldr r0, Main
 ldr r2, BaseOfROM ;BaseOfROM
 ldr r3, TopOfROM ;TopOfROM
;这是一个取ROM上的数据,然后不断向RAM搬移的过程 
0
 ldmia r0!, {r4-r7}
    stmia r2!, {r4-r7}
 cmp r2, r3
 bcc  %B0;无符号数小于
;因为是三个寄存器一组,所以,很可能r2的值会在一次操作后比r3大
;此时,r0正好也相差了那么多,所以从r0中减去这些差,就正好了
    sub r2, r2, r3 ; r2 超出r3
   sub r0, r0, r2 ;确保取得RW区精确起始地址
;初始化SDRAM,将RW段拷贝到SDRAM
    ldr r2, |Image$$RW$$Base| ;BaseOfBSS
    ldr r3, |Image$$ZI$$Base| ;BaseOfZero
0
    cmp r2, r3
    ldrcc r1, [r0], #4
    strcc r1, [r2], #4
    bcc %B0
;对SDRAM ZI段清零
    mov r0, #0
    ldr r3, EndOfBSS
1
 cmp r2, r3
 strcc r0, [r2], #4
    bcc %B1
Lable
 bl Main ;从汇编进入C语言代码空间
 b Lable
 END
阅读(1750) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2008-08-21 19:03:56

把ldr r0, =SMRDATA 换成 adr r0, SMRDATA试试!

chinaunix网友2008-03-21 23:11:18

ADS,LINKER中LAYOUT设置