本文开始第一篇,启动代码的编写,注意,仅仅是启动代码,并不是bootloader,因为只有boot,没有loader。

第一要明确:CPU上电之后,会从某个固定地址执行指令。ARM结构的CPU从地址0x00000000开始执行指令,MIPS结构的CPU将会从0XBFC00000取第一条指令并执行。(注意,这个地址是CPU的统一编址,需要把存储器件ROM或者flash映射到这个地址上

  
   
第二要知道启动代码需要做那些事情:

1、异常向量表

2、禁看门狗,禁中断

3、设置系统时钟

4、初始化存储控制器

5、设置各个模式下的堆栈

6、跳转到C环境执行

  
   
第三,要知道CPU的七种工作模式:

用户模式:程序正常运行的模式,不能直接从用户模式切换到其他模式

系统模式:支持操作系统的特权任务,与用户模式类似,但是可以直接切换到其他模式

管理模式:供操作系统使用的保护模式,只有在系统复位和软中断响应后,才能进入该模式

终止模式:用于虚拟内存和存储器保护的模式,对程序存储器或数据存储器访问失败时,进入此模式

未定义模式:只有在未定义指令异常响应时,才进入该模式

中断模式:在IRQ(普通中断)响应时,进入该模式

快速中断模式:在FIQ(快速中断)响应时,进入该模式。

  
   
 以上做一个简要的前提知识介绍,仅仅了解这些还不够,请自行查阅相关资料。下面我们来实现一个简单的boot代码,不懂汇编的,赶快去学
:-(

ARM上电后,从地址0x00000000取指并执行,但是从地址0x00000000开始一直到0x0000001c,都是异常向量表的位置,不要问我为什么,因为硬件是这么做的 :-(

[0x00000000] b ResetHandler  
 ;--CPU上电即在0地址执行这句跳转代码

[0x00000004] b UndHandler    
 ;--CPU遇到未定义指令时,跳转到此地址执行

[0x00000008] b SWIHandler    
 ;--CPU遇到软中断时,跳转到此地址执行

[0x0000000c] b PaAbort    
     
 ;--CPU取指令出错时,跳转到此地址执行

[0x00000010] b DaAbort    
     
;--CPU取数据出错时,跳转到该地址执行

[0x00000014] b 0x00000014;  
;--该地址保留,啥叫保留,就是占个位子,不使用....能否省略,写下句代码?答案是不行!

[0x00000018] b IRQHandler    
;--CPU碰到中断时,跳转到该地址执行

[0x0000001c] b FIQHandler    
;--CPU碰到快速中断时,跳转到该地址执行。

  
   
本文主要写管理模式的代码,其他模式暂时忽略,以后讨论。本文将点亮开发板上的LED4灯,其他三个LED是灭的。(我用的是OK6410的板子)

ResetHandler

ldr r0,=WTCON  
 ;禁止看门狗

ldr r1,=0x0

str r1,[r0]

ldr r0,=GPMCON

;从地板原理图看出四个LED灯接在GPM接口,那么我们就控制GPMCON寄存器即可,此处把GPMCON的地址写入r0寄存器

ldr r1,=0x111111  
  ;将数值0x111111

str r1,[r0]    
     
     
;向GPMCON寄存器中写入0x111111直,是的GPM口都作为数据输出口。

ldr r0,=GPMDAT  
  ;将GPMDAT寄存器地址写入r0

ldr r1,=~(1<<3)  
    ;向r1寄存器写入二进制 111值

str r1,[r0]    
     
   
 ;向GPMDAT寄存器写入111值,此时可以看到开发板的LED4亮,其他三个LED是灭的

b halt    
     
     
     ;进入死循环

halt

b halt

  
     
     
     
   
以下这些代码都是CPU其他工作模式下的代码,本文仅仅是做了一个简单的死循环处理,以后会讨论各种模式的使用方法。

HandlerUndef

b HandlerUndef

HandlerSWI

b HandlerSWI

HandlerPabort

b HandlerPabort

HandlerDabort

b HandlerDabort

HandlerIRQ

b HandlerIRQ

HandlerFIQ

b HandlerFIQ

注意,本文代码没有禁中断,没有设置各个模式的堆栈,没有初始化sdram,也没有跳转到C预言执行环境,仅仅是点亮了一盏led灯,是最简单的一个启动代码,在连接选项中要设置Robase
为0x0地址,映像文件入口地址为0x0,映像文件头为startup.o,section为Init。如下图:

一" />

一" />

一" />

  
     
   
 调试方法:使用J-link
v8进行调试,首先你得买j-link,Ok6410不带这个仿真器。然后装好驱动Setup_JLinkARM_V410i.zip,按照S3C6410的JLink的调试方法.pdf这个文档配置好开发环境,期间会提示缺少jlinkarm.dll,直接从j-link安装文件夹里把这个文件拷贝过去即可,然后使用axd进行调试。

S3C6410的启动代码分析&nbsp;一的更多相关文章

  1. STM32启动代码分析 IAR 比较好

    stm32启动代码分析 (2012-06-12 09:43:31) 转载▼     最近开始使用ST的stm32w108芯片(也是一款zigbee芯片).开始看他的启动代码看的晕晕呼呼呼的. 还好在c ...

  2. Linux内核启动代码分析二之开发板相关驱动程序加载分析

    Linux内核启动代码分析二之开发板相关驱动程序加载分析 1 从linux开始启动的函数start_kernel开始分析,该函数位于linux-2.6.22/init/main.c  start_ke ...

  3. ARM Linux启动代码分析

    前言 在学习.分析之前首先要弄明白一个问题:为什么要分析启动代码? 因为启动代码绝大部分都是用汇编语言写的,对于没学过或者不熟悉汇编语言的同学确实有一定难度,但是如果你想真正深入地学习Linux,那么 ...

  4. Cortex-M0(NXP LPC11C14)启动代码分析

    作者:刘老师,华清远见嵌入式学院讲师. 启动代码的一般作用 1.堆和栈的初始化: 2.向量表定义: 3.地址重映射及中断向量表的转移: 4.初始化有特殊要求的断口: 5.处理器模式: 6.进入C应用程 ...

  5. Android 4.2启动代码分析(一)

    Android系统启动过程分析 Android系统的框架架构图如下(来自网上):   Linux内核启动之后----->就到Android的Init进程 ----->进而启动Android ...

  6. STM32启动代码分析

    STM32启动文件简单分析(STM32F10x.s适用范围)定时器, 型号, 名字在<<STM32不完全手册里面>>,我们所有的例程都采用了一个叫STM32F10x.s的启动文 ...

  7. STM32启动代码分析及其汇编学习-ARM

    STM32 启动代码 Author By YuCloud 边看启动文件边学汇编 汇编 see ARM: Assembler User Guide see: https://blog.csdn.net/ ...

  8. MSVC CRT运行库启动代码分析

    原文链接:http://www.programlife.net/msvc-crt-startup.html 在程序进入main/WinMain函数之前,需要先进行C运行库的初始化操作,通过在Visua ...

  9. KEA128单片机启动代码分析

    ;/*****************************************************************************; * @file: startup_SK ...

随机推荐

  1. windows 改路径有小差异

    https://jingyan.baidu.com/article/5552ef473e2df6518ffbc916.html cmd是windows下一个非常常用的工具,但是它默认的地址却是不变的. ...

  2. Visual Studio 2013中用VSIX创建项目模版

    我会一步一步解释: 我的一个项目里有5个工程, 我想用其中的4个去创建一个新的工具模版,我还想把他们都放到一个文件夹下面当我用这个模版创建新的工程时.注意我的初始化项目,我想把他们转换成一个模版(我不 ...

  3. CentOS7 编译安装golang和rpm安装golang

    编译安装 1.下载golang二进制安装包: https://storage.googleapis.com/golang/go1.9.linux-amd64.tar.gz 2.解压安装包到指定目录,此 ...

  4. 在Linux上部署DotNet Core项目的时候发现Apache无法转发Kestrel的5000端口的问题

    CentOS服务器上使用Apache托管Dotnet Core2,服务启动了,端口也打开了.在本地使用curl命令可以访问5000端口的网页内容,但是访问Apache的端口却无法获取到网页的内容.想起 ...

  5. 前端之JavaScript 03

    window对象 所有浏览器都支持 window 对象.概念上讲.一个html文档对应一个window对象.功能上讲: 控制浏览器窗口的.使用上讲: window对象不需要创建对象,直接使用即可. W ...

  6. struts1和struts2原理解析

    1.struts1和struts2 是2个完全不同的框架 其实struts2核心就是 webwork框架 struts1以ActionServlet作为核心控制器,由ActionServlet负责拦截 ...

  7. 51nod 1012 最小公倍数LCM

    输入2个正整数A,B,求A与B的最小公倍数. 收起   输入 2个数A,B,中间用空格隔开.(1<= A,B <= 10^9) 输出 输出A与B的最小公倍数. 输入样例 30 105 输出 ...

  8. ES6常用知识总结(20%的知识占80%的份额)

    一.变量和常量 var的缺点:(1)var可以多次声明同一个变量:   (2)var会造成变量提升 (function rr() { if(true) { var a = 666; } console ...

  9. PHP Tools for VS2017 key/破解 [搬运]

    看看结果 搬运地址 :  (自己敲吧...) 这里面破解的只有一年 时间可以在文中提供的 ------------------------------------------------------- ...

  10. Javascript 原型链资料收集

    Javascript 原型链资料收集 先收集,后理解. 理解JavaScript的原型链和继承 https://blog.oyanglul.us/javascript/understand-proto ...