Chinaunix首页 | 论坛 | 博客
  • 博客访问: 116422
  • 博文数量: 43
  • 博客积分: 2500
  • 博客等级: 少校
  • 技术积分: 530
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-04 16:56
文章分类

全部博文(43)

文章存档

2011年(1)

2010年(2)

2008年(40)

我的朋友

分类:

2008-09-05 22:01:21

在程序启动的过程中要完成的任务:硬件初始化、系统存储配置、复制二级中断向量表。
硬件初始化:系统上电后,放置bootloader第一条指令b ResetHandler

程序入口:(ResetHandler)
   在程序一开始,首先进行的一些操作主要保证初始化程序能够顺利的运行, 因此主要包括关闭WDT、中断,配置锁相环时,初始化存储系统等。

配置memory接口
    memory接口是确保数据访问正确的基本保障,此处主要配置SFR寄存器中0x48000000开始的memory接口寄存器组,   确保每个bank的位宽、访问类型(waitable)以及时序参数正确。如果没有特别的要求,一般来说时序参数使用默认值即可。

初始化堆栈
    ARM有6种运行模式,必须为每一种模式提供独立的堆栈空间,在堆栈设置之前是不能进行C函数的调用的。ARM的堆栈模式 是从高地址递减的,我的所有代码统一将堆栈的首地址设在0x33ff8000处,往低依次为FIQ、IRQ、Abort、Undef、SVC,其中
   SVC和User模式不予区分。堆栈大小一般可在头文件或者当前文件中修改。

运行空间的初始化
    这段代码主要完成两个功能,一是将RW数据搬运到RW空间(我们生成ROM镜像时,RW数据是跟在RO数据之后的),二是 初始化ZI数据段。当然,这段代码存在的前提是代码的运行环境只是标准的两段式:一段RO空间和一段RW空间;并且在C程序
   入口时没有调用编译器的链接库(__main)。后者已经提供相应的功能,并且支持更加复杂的运行环境定义(使用SCF文件),
   (关于这一点,我在介绍ADS中C代码的启动模式时已经详细介绍)。

__rt_lib_init
    在ADS1.2的环境中,如果在C入口没有调用编译器的链接库(__main),那么在C程序一开始要调用该函数以初始化运行时的函数库,以保证对ADS提供的某些库函数能够正常调用。从这个函数开始,我们已经在C语言环境下了。

MMU初始化
    2410的MMU支持1级&2级地址映射,在我们目前大部分应用中均采用1级section模式的地址映射,一个section的大小为1M,也就是说从逻辑地址到物理地址的转变是这样的一个过程:
    一个32位的地址,高12位决定了该地址在页表中的index,这个index的内容决定了该逻辑section对应的物理section;   低20位决定了该地址在section中的偏移(index)。
    因此从0x0~0xffffffff的地址空间总共可以分成0x1000(4K)个section,页表中每项的大小为32个bit,因此页表的大小为0x4000(16K)。在我的代码中所有程序的页表统一存放在地址0x33ff8000。
    每个页表项的内容如下:
  
           bit: 31                               20 19      12 11   10 9 8           5   4   3   2   1   0
    content:   Section对应的物理地址      NULL      AP    0   Domain    1   C B   1   0
   
       最低两位(10)是section分页的标识。
       AP:Access Permission,区分只读、读写、SVC&其它模式。
    Domain:每个section都属于某个Domain,一个有16个Domain,每个Domain的属性由CP15的R3寄存器控制。 在我得所有程序中,都只包含两个Domain,一个是SFR地址以下(包括SFR)的空间,可访问;   另一个是SFR以上的空间,不可访问。
    C、B:这两位决定了该section的cache&write buffer属性,这与该段的用途(RO or RW)有密切关系。不同的用途要做不同的设置。

        C      B                          具体含义
         0     0    无cache,无写缓冲,任何对memory的读写都反映到ASB总线上。  

                    对 memory 的操作过程中CPU需要等待。
         0     1    无cache,有写缓冲,读操作直接反映到ASB总线上。写操作CPU将数据写

                    入 到写缓冲后继续运行,由写缓冲进行ASB操作。
        1     0     有cache,写通模式,读操作首先考虑cache hit;写操作时直接将数据写入

                    写缓冲,如果同时出现cache hit,那么也更新cache。
       1     1     有cache,写回模式,读操作首先考虑cache hit;写操作也首先考虑cache,

                   如果hit,则只修改cache,并将cache对应半行的dirty比特置位;如果miss,

                    则写入写缓冲,触发ASB总线操作。
               
             在我的程序中内存空间的分配统一采用了文末的MEMORY图。虽然MMU只是使用了逻辑地址到物理地址的linear transfer(值不改变),但是由于MMU能够引入cache&write buffer,因此系统性能有很大的提高!

配置时钟比、重新设置PLL
    2410内部有三个时钟:FCLK、HCLK、PCLK,分别供CPU、AHB总线和APB总线使用,为了降低功耗,一般都选择周期比为1:2:4的合理配置。 同时将PLL配置为运行环境时钟,一般都达到最高202M。


 

阅读(486) | 评论(0) | 转发(0) |
0

上一篇:pwm timer

下一篇: 满足

给主人留下些什么吧!~~