1-5 核心初始化

来源:互联网 发布:禅道 专业版 源码 编辑:程序博客网 时间:2024/06/05 03:21

详细的实验代码请查看这里:

1.  设置中断向量表(可参考《ARM Architecture Reference Manual -A2.6》)

    1.1  异常(Exceptions)的概念:因为内部或外部的一些事件,导致处理器停下正在处理的工作,转而去处理发生的事情。

    1.2  种类                                        Mode            Addres

           Rest                                        svc               0x0000 0000

           Undefined Instruction              und              0x0000 0004               

           Software Interrupt(SWI)      svc               0x0000 0008

           Prefetch Abort                         abt               0x0000 000c

           Data Abort                               abt              0x0000 0010

           IRQ                                          irq               0x0000 0018

           FIQ                                          fiq               0x0000 001c

    1.3  异常向量的定义

        当某一种异常发生的时候,ARM处理器会跳转到对应该异常的固定地址去执行异常处理程序,该固定地址就是异常向量。

        异常向量表:

            0x0000 0000 : b rest

            0x0000 0004 : ldr pc, _undefined_instruction
            0x0000 0008 : ldr pc, _software_interrupt

            0x0000 000c : ldr pc, _prefetch_abort
            0x0000 0010 : ldr pc, _data_abort
            0x0000 0014 : ldr pc, _not_used 
            0x0000 0018 : ldr pc, _irq

            0x0000 001c : ldr pc, _fiq

    1.4  代码范例:

        start.S


.text
.global _start
_start:
b reset
ldr pc, _undefined_instruction
ldr pc, _software_interrupt
ldr pc, _prefetch_abort
ldr pc, _data_abort
ldr pc, _not_used
ldr pc, _irq
ldr pc, _fiq

_undefined_instruction: .word undefined_instruction
_software_interrupt:    .word software_interrupt
_prefetch_abort:         .word prefetch_abort
_data_abort:               .word data_abort
_not_used:                 .word not_used
_irq:                            .word irq
_fiq:                            .word fiq

undefined_instruction:
nop
software_interrupt:
nop
prefetch_abort:
nop
data_abort:
nop
not_used:
nop
irq:
nop
fiq:
nop


        gboot.lds


OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. = 0x30000000;

. = ALIGN(4);
.text :
{
start.o(.text)
*(.text)
}

. = ALIGN(4);
.data :
{
*(.data)
}

bss_start = .;
. = ALIGN(4);
.bss :
{
*(.bss)
}
bss_end = .;
}


        Makefile


all:start.o
arm-linux-ld -Tgboot.lds -o gboot.elf $^
arm-linux-objcopy -O binary gboot.elf gboot.bin

%.o:%.S
arm-linux-gcc -g -c $^

%.o:%.c
arm-linux-gcc -g -c $^

.PHONY:clean
clean:
rm *.elf *.o *.bin


2.  设置处理器为SVC模式(可参考《ARM Architecture Reference Manual -A2.2》)

    方法:u-boot和kernel一般工作在svc模式,可以通过设置cpsr进行改变。

    具体代码为:


set_svc:
mrs r0, cpsr
bic r0, r0, #0xff
orr r0, r0, #0xd3  // 1 1 0 1001

                                            // I  F T  svc  I置1,禁止IRQ,F置1,禁止FIQ,T置0,设置非Thumb指令 
msr cpsr, r0
mov pc, lr


3.  关闭看门狗(参考2440芯片手册里的 Watchdog Timer一节)

    3.1  看门狗(watch dog)作用:

        在系统死机时,实现系统的自动重启

    3.2  工作方式:

        watchdog一般是在硬件上实现的定时器功能,用户必须在计时结束前重新设置开始计时(喂狗),若超过时间没重新计时,系统将自动重启。

    WTCON R/W 0X5300 0000

    Rest enable [0] : 1 :Assert   0 : Disable

    Interrupt genernation[2] : 1:Enable  0 : Disable

    3.3  范例代码

        

#define pWTCON 0x53000000
disable_watchdog:
ldr r0, =pWTCON
mov r1,#0x0
str r1,[r0]
mov pc, lr


4.  关闭所有中断(参考2440芯片手册中的14章Interrupt Controller的14.1Interrupt Process Dragram)

    4.1  方法:设置中断屏蔽寄存器

    INTMSK R/W 0x4a00 0008  0:available  1:mask

    4.2  范例代码:


#define pINTMSK 0X4a000008
disable_interrupt:
ldr r0, =pINTMSK
mvn r1, #0x0
str r1, [r0]
mov pc, lr


5.  关闭mmu和cache

    5.1  Cache一般用来保存近期用到的存储器的数据拷贝

           I-Cache:用来存放指令(16k);

          D-Cache:用来存放数据(16k)。

    5.2  虚拟地址:程序使用的地址 ;

           物理地址:物理存储单元实际的地址;

           虚拟内存:让程序(进程)使用更大的空间,使得地址冲突得意解决。

           mmu的作用:实现从虚拟地址向物理地址的转化,在初始化阶段,并不对mmu和cache进行配置,打开却会影响程序运行,因此在初始化阶段须关闭mmu和cache。

    5.3  关闭方法:设置CP15的相应寄存器(参考ARM920T手册的2.3 map summary)

      5.3.1使得I/D Cache失效

      5.3.2  关闭I/D Cache和mmu

    5.4  范例代码:


disable_mmu:
mcr p15, 0, r0, c7, c7, 0
mrc p15, 0, r0, c1, c0, 0
bic r0, r0, #0x7
mcr p15, 0, r0, c1, c0, 0
mov pc, lr


0 0
原创粉丝点击