Chinaunix首页 | 论坛 | 博客
  • 博客访问: 91217
  • 博文数量: 33
  • 博客积分: 1490
  • 博客等级: 上尉
  • 技术积分: 305
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-06 21:42
文章分类

全部博文(33)

文章存档

2011年(3)

2010年(2)

2009年(23)

2008年(5)

我的朋友

分类:

2009-04-15 16:42:43

真实很激动,经过了好久的调试程序终于可以从flash启动那个然后拷贝到sdram里面执行了。在这个过程中说实话真实花费了很多时间,最开始时看到88trulyboy写的一些总结,就是用scf文件的方式,我也看了一下arm体系结构与编程(个人感觉跟adspdf文档差不多)里面关于这部分的讲解,还是没有理解太深,所以,研究了一周多时间也没搞明白,后来就放下了。等到最近又有了这方面的需求,就是液晶屏幕在仿真的时候ok的,但是烧到flash里面总会出现各种问题,比如水纹现象很严重。于是又找了些资料看了一下,看了支持ropiapcs的东西,于是开始从这方面入手,可是调了两天也没成功,最后突然想到是否可以用下面的方法呢:

       首先编写一个只有启动代码的工程,这个启动代码实现传统启动代码的功能之外,还实现把flash里面的程序拷贝到sdram里面,在原来启动代bl main的位置改为ldr pc,=0xc008000,这样就从flash启动后跳转到了sdram里面,在这个位置执行的只是bl main,然后跳转到main函数开始执行了。这些实际的应用程序是哪里来的呢?我们可以建立一个工程,里面是我们需要执行的程序,但是这个程序的ro base设置的就是0xc008000rw base就是0xc5f0000,编译好之后,生成了一个供烧写的也就是二进制文件。把这个二进制文件拷贝到只含有启动代码的二进制文件的后面,合成一个文件进行烧写。当然重点就在我们要知道准备拷贝到sdram里面的的程序在bin文件中的位置,长度,rw区的位置和长度,zi区的位置和长度,然后再编写bootloader的时候要精确位置。具体程序的解释在下面:

    ;********************************************************

    ;*    Copy and paste RW data/zero initialized data     *

    ;********************************************************

    LDR           r0, =0x5200; bin文件中的RW Base Get pointer to ROM data

    LDR           r1, =0xc5f0000; sdram中运行的时候的地址and RAM copy

    LDR           r3, =0xc5f000c;ZI区在sdram运行时候的地址

       ;Zero init base => top of initialised data

                    

    CMP           r0, r1          ; Check that they are different

    BEQ     %F1

0           

    CMP           r1, r3          ; Copy init data

    LDRCC   r2, [r0], #4    ;--> LDRCC r2, [r0] + ADD r0, r0, #4          

    STRCC   r2, [r1], #4    ;--> STRCC r2, [r1] + ADD r1, r1, #4

    BCC     %B0

1           

    LDR           r1, =0xc5f007c;ZI区在sdram中的尾地址 Top of zero init segment

    MOV          r2, #0

2           

    CMP           r3, r1          ; Zero init

    STRCC   r2, [r3], #4

    BCC     %B2

   

      LDR  r0, =0x0828;ROflash中的首地址,不足828的话用0补齐

    LDR  r1, =0x5200;ROflash中的尾地址

    LDR  r3, =0xc008000;ROsdram运行时候的首地址

 

 

0     CMP      r0, r1

      LDRCC   r2, [r0], #4

      STRCC   r2, [r3], #4

      BCC     %B0

           

;--------Now we enter the C code

    [ :LNOT:THUMBCODE   ;if(!thumbcode) arm state;

       ;BL Main               ;Don't' use main() because ......

       ldr pc, =0xc008000;             ;跳转到sdram中程序执行的首地址开始在sdram运行

       B     .                                        

    ];

 

    [ THUMBCODE                ;for start-up code for Thumb mode;

       orr     lr,pc,#1

       bx      lr

       CODE16

       ;BL      Main          ;Don't 'use main() because ......

       ldr pc, =0xc008000;

       b       .

       CODE32

   ]

阅读(1364) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~