异常向量表:
异常:因为内部或者外部的一些事件,导致处理器停下正在处理的工作,转而去处理这些发生的事件。ARM Architecture Reference Manual p54页。
7种异常的类型:
Reset异常:突然按下重启键。
Undefined Instruction:未定义指令。()
software interrup:软中断()
Prefetch Abort (instruction fetch memory about):预取中止
Data Abort:提取数据失败。
IRQ:中断
FIQ:快速中断 (响应速度更快)
------------------------------------------------------
异常向量:(p54)
当一种异常发生的时候,ARM处理器会跳转到对应该异常的固定地址去执行异常处理程序,这个固定的地址,称之为异常向量。
-------------------------------------------
异常向量表:由七个异常向量及其处理函数跳转关系组成的表
0x0000000:b reset
0x0000004:ldr pc,_undefined_instruction
0x0000008:ldr pc,_software_interrupt
0x000000c:ldr pc,_prefetch_abort
0x0000010:ldr pc,_data_abort
0x0000014:ldr pc,_not_used //使用无用的指令占据这个地址
0x0000018:ldr pc,_irq
0x000001c:ldr pc,_fiq
在start.S中我们是可以看到这张表的。
------------------------------------------------
代码的编写(start.S,makefile,gboot.lds):
start.S
touch start.S
chmod 777 start.S
.text
.global_start
_start:
b reset
ldr pc,_undefined_instruction //
ldr pc,_software_interrupt
ldr pc,_data_abort
ldr pc,_not_used
ldr pc,_irq
ldr pc,_fiq //将_fiq中的值存放到pc中
_undefined_instruction:.word undefined_instruction
_software_interrupt:.word software_interrupt
_data_abort:.word data_abort
_not_used:.word not_used
_irq:.word irq
_fiq:.word fiq //_fiq中存放的地址为fiq

undefined_instruction:
nop
software_interrupt:
nop
data_abort:
nop
not_used:
nop
irq:
nop
fiq:
nop
reset:
nop
-----------------------------------------------------------
gboot.lds
touch gboot.lds
chmod 777 gboot.lds

OUTPUT_ARCH(arm) @输出格式为arm
ENTRY(_start) @表明程序的路口处为:_start
SECTIONS{
. =0x50008000 @定义起始地址
. =ALIGN(4);
.text :
{start.o(.text) @代码段放的第一个文件。
*(.text)
}
. =ALIGN(4);
.data :
{
*(.data) @所有的数据
}
. =ALIGN(4);
bss_start = .;
.bss :
{
*(.bss)
}
bss_end = .;
}
-----------------------------------------------
touch Makefile
chmod 777 Makefile
all : %.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 : %.s
-----------------------------------------------
设置SVC模式:p 52页,49页M[0:4]设置模式(cpsr)
要让处理器工作在SVC模式就是要将程序状态寄存器cpsr的后五位设置为10011.
思路:先将这五位全部清理(bic指令)
置1的操作:orr(位或)
然后再加上mrs,msr指令。
首先我们应该是在开发板上电以后,然后来设置处理器的工作模式。所以:reset:
bl set_svc
set_svc:
mrs r0,cpsr //将状态寄存器中的值取出到通用寄存器中
bic r0,r0,#0x1f //将该值置0
orr r0,r0,#0xd3(或0x13) //位或操作,设置模式编号
msr cpsr,r0 //将该编号重新放到状态寄存器中。
------------------------------------------------------
关闭看门狗:
watchdog一般是一个硬件模块,其作用就是在系统死机时,帮助系统实现自动重新启动。
看门狗工作原理:watchdog在硬件上实现了计时功能,启动计时后,启动计时后,软件必须在计时结束前(5分钟或更久)重新开始计时,称为喂狗,如果到超时的时候还没有重新开始计时,那么它就认为系统死机了,就自动重新启动系统。
资料s3c6410page:1137图34-1
应为我们的bootloader比较简单,所以不需要看门狗:关闭。
如何关闭看门狗:通过prescaler(PCLK)这个寄存器来关闭。
控制寄存器:WTCON(watch timer control register):0x7E004000
reset:
bl set_svc
bl disable_watchdog
#define pWTCON 0x7E00400 //保存寄存器的地址
diable_watchdog:
ldr r0,=pWTCON //将立即数pWTCON中的内容装载到r0中
mov r1,#0x0 //r1寄存器中装入0x0
str r1,[r0] //将r1中的内容存储到r0中的有效地址
----------------------------------------------------------
关闭中断:
cpsr中N Z C V I F其中I位是控制中断的,F位是控制快速中断的。
分为两步:先将I,F位设置为1.在之前设置svc时已经设置好了
设置中断屏蔽寄存器ps3c2440 389,378
2440的操作:bl disable_interrupt
disable_interrupt:
mvn r1,#0x0
ldr r0,=0x4a000008
str r1,[r0]
6410一般采用的是向量中断的模式,更多的时候采用的是硬件中断。找到interrupt enable这个寄存器。p419页,需要关闭两个寄存器,VIC0INTENCLEAR(中断使能寄存器),VIC1INTRNCLEAR (关闭中断)。
disable_interrupt:
mvn r1,#0x0 //将0x0取反存放到r1中
ldr r0,=0x71200014 //将寄存器地址装载到r0中,相当与r0为该地址的替身。
str r1,[r0] //把r1中的值存放到r0中。
ldr r0,=0x71300014
str r1,[r0]
210则需关闭四个VICxINTENCLEAR.
----------------------------------------------------
关闭mmu和caches
ARM存储体系:处理器内部寄存器(通用,状态寄存器,速度快,数量少),TMC:紧耦合存储器(Cache,主存储器,容量大,速度稍慢),辅助存储器(Flash,SD等!)
cache:是一种容量小,但存取速度非常快的存储器,它保存最近用到的存储器中数据的拷贝。
按功能分:
I-Cache:指令Cache,用于存放指令.
D-Cache:数据Cache,用于存放数据.
mmu:将虚拟地址映射到物理地址。
虚拟地址:可以解决访问内存冲突,让进程使用更大的空间。
虚拟地址原理:用户指定了一个虚拟地址(4G),然后会通过映射将这些地址映射到不同的物理地址中。
因为使用mmu和cache需要一个正确的配置才能正常的使用。所以在这里我们先不使用,否则会导致意向不到的后果。
cache和mmu都是通过协处理器来控制的co-processor.
2440arm核手册p35 register control(read/write control register)先利用指令MRC p15,r0,c1,c0,0 把Register 1中的内容度到r0中,然后再修改r0中的值,在利用指令MRC p15,0,r0,c1,c0,0
Register1p36,看到第12位控制ICache,Cache disabled,第2位控制DCache,第0位控制mmu.
p41,还有一些数据我们需要设置,在Register7中是cache无效,invalidate cache。instruction:MCR p15,0,Rd,c7,c7,0
----------------------------------------------------
如何关闭cache//在arm11中操作是相同的。
1.使ICache和DCache失效。
2.关闭I/Dcache,关闭mmu
代码: bl disable_mmu
disable_mmu:
mcr p15,0,R0,c7,c7,0 //使I/Dcache失效。
mrc p15,0,r0,c1,c0,0
bic r0,r0,#0x00000007
mcr p15,0,r0,c1,c0,0
---------------------------------------------
最后再检查一遍:发现执行完每个bl之后没有返回,所以在每个bl所跳转的程序完成之后,需要加上一个mov pc,lr

u-boot核心初始化的更多相关文章

  1. Spring Boot 核心注解与配置文件

    @SpringBootApplication注解 Spring Boot项目有一个入口类 (*Application) 在这个类中有一个main 方法,是运行该项目的切入点.而@SpringBootA ...

  2. 【SpringBoot】15. Spring Boot核心注解

    Spring Boot核心注解 1 @SpringBootApplication 代表是Spring Boot启动的类 2 @SpringBootConfiguration 通过bean对象来获取配置 ...

  3. Spring Boot 核心配置文件 bootstrap & application

    Spring Boot 核心配置文件 bootstrap & application 1.SpringBoot bootstrap配置文件不生效问题 2.bootstrap/ applicat ...

  4. 3个Spring Boot核心注解,你知道几个?

    Spring Boot 核心注解讲解 Spring Boot 最大的特点是无需 XML 配置文件,能自动扫描包路径装载并注入对象,并能做到根据 classpath 下的 jar 包自动配置. 所以 S ...

  5. Spring Boot核心原理

    Spring Boot核心原理 spring-boot-starter-xxx  方便开发和配置 1.没有depoy setup tomcat 2.xml文件里面的没有没有了 @SpringBootA ...

  6. Spring Boot 项目初始化

    Spring Boot 项目创建 File->New->New Project->Spring Initializr 勾选 Web Spring Boot 版本选择稳定版,本文选择 ...

  7. Feign源码解析系列-核心初始化

    开始 初始化Feign客户端当然是整个过程中的核心部分,毕竟初始化完毕就等着调用了,初始化时候准备的什么,流程就走什么. 内容 从上一篇中,我们已经知道,对于扫描到的每一个有@FeignClient, ...

  8. Spring Boot核心配置

    启动类 在包根目录下添加启动类,必须包含main方法,再添加Spring Boot启动方法: SpringApplication.run(SampleController.class, args); ...

  9. Spring Boot之初始化项目

    最简单的从Spring官网下载 :地址 https://start.spring.io/ 下拉选择需要的Spring Boot版本 修改Group和Artifact  直接点击Generate Pro ...

  10. 深入了解Spring Boot 核心注解原理

    SpringBoot目前是如火如荼,所以今天就跟大家来探讨下SpringBoot的核心注解@SpringBootApplication以及run方法,理解下springBoot为什么不需要XML,达到 ...

随机推荐

  1. 《JavaScript设计模式与开发实践》知识点笔记

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px "PingFang SC" } p.p2 { margin: 0.0px ...

  2. HDU 4034 Graph(Floyd变形——逆向判断)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4034 Problem Description Everyone knows how to calcu ...

  3. C++异常层次结构

    #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; class MyArray { publi ...

  4. IDC服务器的六大基础知识

    无论企业或个人来说,一个是否适合自己的IDC运营商对于业务发展是至关重要的.然而很多用户对IDC行业一知半解,不太了解服务器的种类,更不知道选择什么样的服务器更适合自己了.今天编辑汇总了一些IDC所需 ...

  5. WIN2016安装织梦没写入权限怎么办听语音

    配置好了WINSERVER2016环境,一切看起来都弄得差不多了,可是安装织梦的时候提示我没有写入权限,不能继续安装,于是我很郁闷,开始寻求解决办法. 工具/原料 WINSERVER2016 织梦5. ...

  6. HTML面试

    ------------------------------------------------------- 行列 td tr ol -------------------------------- ...

  7. 利用mk-table-checksum监测Mysql主从数据一致性操作记录

    前面已经提到了mysql主从环境下数据一致性检查:mysql主从同步(3)-percona-toolkit工具(数据一致性监测.延迟监控)使用梳理今天这里再介绍另一种Mysql数据一致性自动检测工具: ...

  8. Linux 查找命令汇总

    linux下查找命令挺多,本文以列表方式说明which.whereis.locate.find命令的区别: 命令 概述 语法 示例 适用OS 搜索结果 which 在PATH变量指定的路径中,搜索某个 ...

  9. Tomcat对Struts中的Action进行授权利

    .应用的意义 在某些应用下,如果Action类执行的功能比较重要,可以对该Action类进行授权利以实现只有特定角色的用户能够访问,此时可以在struts-config.xml文件中进行配置   2. ...

  10. robotframework安装及入门指南

    将很久之前自己在本地记录的一些笔记发表到随笔来,希望能够帮到一些童鞋~ robotframework安装及入门指南 本文主要介绍robotframework在windows环境的安装过程! 安装步骤 ...