基于mini2440 的 bootloader 设计 ---- 4、CPU核心初始化

来源:互联网 发布:java基础课程设计 编辑:程序博客网 时间:2024/05/16 08:34

 

开发环境:

               电脑系统:RedHat Enterprise Linux6   kernel version : linux-2.6.32

               交叉工具链:arm-linux-xxx4.3.2 

               开发板版本:mini2440 S3C2440处理器  64M SDRAM   256M nand flash

     

      根据 《基于mini2440 的 bootloader 设计 ---- 准备工作》的介绍,笔者bootloader 的前几个步骤为CPU的核心初始化,分别是:

      1、设置异常向量表
      2、设置cpu为svc32模式
      3、关闭看门狗
      4、关闭中断
      5、时钟初始化
      6、刷新I/D caches  (不做,因为下一步将要关闭caches 和MMU)
      7、关闭MMU和caches

    本文就介绍这几个步骤的相关背景知识以及代码实现。本文的代码均是代码片段,本工程的完整代码可到如下地址获得:点击打开链接

1、设置异常向量表

      背景知识:

              ARM核支持7种异常,所谓的异常笔者理解为一种异步动作(即当CPU在执行指令的时候,突然来了一个动作,需要CPU去处理该动作)。比如重启动作、硬件中           断、软件中断等等。

              ARM核支持的7种异常如下:


        由上图可以看出,这7种异常分别为:

                   1、reset                                   :重启机器引起

                   2、undefined instructions    :执行未知指令引起

                   3、swi                                      :执行软中断指令引起

                   4、prefetch abort                   :预取指错误引起

                   5、data abort                          :预取数据失败引起

                   6、irq                                       :发生中断引起

                   7、fiq                                       :发生快速中断引起

        每种异常的发生都会导致CPU进入某种工作模式,并且PC指针指向某个特定的地址。这些地址的集合就是一个异常向量表,也就是说我们要完成的就是建立这么一个表格,每个表项都是一个入口地址,同时每个表项都有自己的地址。从代码的角度来看,通常在该地址放一个跳转指令,让CPU在发生该异常后跳转到处理该异常的代码处。

      代码实现:




2、设置cpu到svc32模式

      背景知识:

      前面介绍过ARM处理器支持7种工作模式,这里再贴出来:


       CPU处于不同的工作模式下所能访问的寄存器和能够执行的指令是不同的,高级别的工作模式往往能访问更多的寄存器,能执行更多的指令。因为bootloader 就是一个初始化硬件的软件,因此需要比较高级别的工作模式,来完成硬件和软件的初始化。

       这里我们要设置CPU到svc模式,那么就要指定"Mode number" 为”0b10011“。这个字段实际上位于cpsr中。那么工作就很简单了,修改cpsr中的M[4:0] 字为”0b10011“。

     代码实现:



3、关闭看门狗

      背景知识:

      嵌入式系统经常工作在恶劣的工作环境,受到外界因素影响的几率比较大。当系统受到外界信号干扰时,往往会导致程序跑飞,因此我们需要一种机制来应对这种程序跑飞的情况。看门狗就是这一种硬件结构,当程序跑飞时,它就自动将系统重启。看门狗工作的过程大致如下: 首先给定时器装入一个数,然后定时器每隔一定时间自减1,当减到0时产生一个中断,引起系统复位。如果某种原因使得程序跑飞,那么必定会有减到0的时候,这时看门狗就会复位系统。由此看出,一但开启看门狗,就要在定时器减到0之前重新装值,俗称“喂狗”,否则系统就会复位。这在一般的程序设计中往往是一种累赘,因此索性把看门狗关了。

      看门狗的设置在S3C2440芯片手册中,搜索“watchdog”关键字,可以找到看门狗控制器"WTCON"。设置相关位就可以关闭看门狗。

      代码实现:



4、关闭中断

       背景知识:

       中断控制器是一个处理器的核心部件,但是在前期初始化阶段,我们往往把中断关了,防止核心初始化的代码被中断。

       中断控制事实上挺复杂的,但是要关闭中断就挺容易,找到中断屏蔽寄存器 INTMSK,设置好相应的位即可。

       实现代码:

  

5、时钟初始化

      背景知识

      CPU 一上电就运行在外部晶振的工作频率(12M),要想获得较高的工作频率,需要设置CPU内部的时钟控制器,让CPU内部的各个部件得到相应的高工作频率。

      先看S3C2440芯片的时钟系统:


      从上图可以看出,S3C2440里有两个锁相环(PLL)为整个系统提供脉冲信号,这两个PLL分别为MPLL、UPLL。外部晶振或者时钟源作为PLL的输入。MPLL输出Mpll,Mpll 最后经过分频成为FCLK、HCLK、PCLK,其中FCLK为核提供脉冲,HCLK为AHB BUS上的外设提供脉冲,PCLK 为APB BUS 上的外设提供脉冲。UPLL最后分成Upll,Upll最后分成UCLK时钟,UCLK 为USB BUS设备提供脉冲。

      时钟初始化要做的就是要设置好PLL的输出脉冲频率、设置好FCLK、设置好FCLK/HCLK/PCLK的比值。

通过阅读芯片手册,得到的代码如下:

      代码实现:




代码实际就需要做三件事:设置FCLK、HCLK、PCLK的比值,将CPU设置到异步模式,设置FCLK的时钟频率。

这里设置CPU到异步模式的原因是:由上图可知FCLK:HCLK=1:4,即CPU核与外设的时钟频率不同,因此需要设置CPU到异步模式,并且是在cp15的c1寄存器中设置。


6、关闭MMU和caches

      背景知识:

      ARM9核提供16K的指令缓存和16K的数据缓存,加大了处理器处理数据的速度。解决了cpu速度远高于内存速度引起的cpu等待的问题。但是在没有被治好缓存之前是不能使用的,因此在启动的初期需要先关闭caches(指令缓存可以不关)。MMU是memory management unit 的简称,完成物理内存的管理和虚拟地址与物理地址的转化,在初期也是不需要转化的,因此也要关闭。caches 和MMU的控制由CP15 的c1寄存器完成,操作该寄存器可以设置mmu和caches。

      实现代码:


        总结:到这里CPU 核的初始化就完成了,事实上这也是BOOTLOADER的核心初始化阶段。后面的初始化过程都需要基于这里的初始化。

工程完整代码地址:点击打开链接

0 0
原创粉丝点击