ARM初学引导_转

一直都在听说ARM有多么好,有多神奇,有多难学。故学它时都兴奋加恐惧。呵呵,我刚好用ARM也有一段时间了。写点东西给ARM的初学者,希望能起到帮助作用。

1,记住:ARM很简单,就如从51转换到PIC或者转换到AVR一样简单。ARM的一个功能就如同掌握一个其他IC的使用一样,如时钟芯片,存在芯片,等等,甚至更简单。所以ARM的那些功能就可以忽略了。

2,和51系列相比,arm的寄存器不在存储空间之内,而且不分数据、程序空间。记住它的分配图。

3,ARM有多种处理器模式,每个模式都有自己的独立

记住表格

记住寄存器的使用

4,ARM的中断加强了,增加了软件中断,掌握swi

可以把处理器模式及异常看成都是中断的扩张,从这些方面去理解也许快些。

swi是嵌入式系统中任务切换的一个关键指令。故先有个心里准备。用法:swi 立即数。执行该指令时,程序会跑到swi中断处。立即数包含在该指令代码中,如果要根据立即数执行程序必须找出立即数。

5,ARM的启动程序及引导地址

你编写的代码启动时:ARM都是从0x00000000开始运行。

实际芯片运行时:ARM启动时,先根据硬件判断是否进入ISP还是进入程序运行。如进行程序运行,又会根据硬件判断会从0x00000000内部 flash空间,还是外部flash空间0x80000000处运行(此时芯片会自动改变映射,也就是将0x80000000映射到 0x00000000)

在ADS软件上:ADS软件会把ARM Linker-Layout-Place at beginning of image-Object/symbol中指明开始代码的文件。Section中指明代码开始的程序块。一般习惯Object/symbol中填写的是Startup.o。Section中填写Start。因为大家一般会将开始程序放在Startup文件中的Start段。

ADS软件知道了我们程序的开始地方,还不知道这个程序的开始地方放到实际芯片的那个地址,所以我们还要为ADS软件指明开始地址,ARM Linker-Option-Image entry point中指明就行了。

这样我们自己编写的代码、实际芯片、仿真器程序起始的关系就差不多明白了,然后记住下面中断向量表的代码。

6,地址重新映射

这是个新概念,但记住它的功能是存储器映射用于改变从0x00000000开始的中断向量的映射。记住1:是0x00000000开始的中断向量的映射;记住2:为什么要这样做是为了不管你这段程序放在芯片实际的那个可以开始放的地方,ARM内部都可以从0x00000000开始运行。

7,汇编语言与c语言的混合编程

如果你不会这个先最好了解一点概念

汇编与c的参数传递是靠R0,R1这些寄存器传递的。

函数的返回值也是靠R0。

汇编中的标号与函数名相当

c语言函数结束时实际上是汇编子程序的返回指令,故用汇编语言中用BL调用c的函数。否则就会返回出错。

8,汇编指令的记忆

多了几种寻址方式

先记住基本指令然后进行扩展,在记指令的执行条件,在搞懂特性符合的意义,如!,^等

我先是记住了以下几个指令:B、BX、BL、LDR、STR、LDM、STM、MOV、MRS、MSR、DCD、SWI、ADD、AND、CMP、MUL这些指令后,以后就边用边记。

9,ARM初始化要干些什么

ARM初始化灵活方式,很多功能都可以方便设置。故开始初始化的事情也是蛮的多,主要做那些呢

开始的中断向量表要做好吧。

每个处理器模式都有自己的SP,你要指明每个SP的开始地址,进行堆栈的初始化。

初始化外部总线控制

设置存储器加速模块

初始化时钟,初始化VIC等等,当然有很多你不必管,先拷贝

在网上找资料就行了。中断向量表与初始化堆栈一般如下

;中断向量表

Reset

LDR     PC, ResetAddr

LDR     PC, UndefinedAddr

LDR     PC, SWI_Addr

LDR     PC, PrefetchAddr

LDR     PC, DataAbortAddr

DCD     0xb9205f80           ;ARM保留位,使向量表所有数据32位累加和为0,才能脱机运行。

LDR     PC, [PC, #-0xff0]    ;

LDR     PC, FIQ_Addr

ResetAddr           DCD     ResetInit

UndefinedAddr       DCD     Undefined

SWI_Addr            DCD     SoftwareInterrupt

PrefetchAddr        DCD     PrefetchAbort

DataAbortAddr       DCD     DataAbort

Nouse               DCD     0  ;

IRQ_Addr            DCD     0  ;

FIQ_Addr            DCD     FIQ_Handler

;未定义指令

Undefined

B       Undefined

;软中断

SoftwareInterrupt

B       SoftwareInterrupt

;取指令中止

PrefetchAbort

B       PrefetchAbort

;取数据中止

DataAbort

B       DataAbort

;快速中断

FIQ_Handler

STMFD   SP!, {R0-R3, LR}

BL      FIQ_Exception

LDMFD   SP!, {R0-R3, LR}

SUBS    PC,  LR,  #4

;初始化堆栈

InitStack

MOV     R0, LR

;设置管理模式堆栈

MSR     CPSR_c, #0xd3

LDR     SP, StackSvc

;设置中断模式堆栈

MSR     CPSR_c, #0xd2

LDR     SP, StackIrq

;设置快速中断模式堆栈

MSR     CPSR_c, #0xd1

LDR     SP, StackFiq

;设置中止模式堆栈

MSR     CPSR_c, #0xd7

LDR     SP, StackAbt

;设置未定义模式堆栈

MSR     CPSR_c, #0xdb

LDR     SP, StackUnd

;设置系统模式堆栈

MSR     CPSR_c, #0xdf

LDR     SP, =StackUsr

MOV     PC, R0

StackSvc           DCD     SvcStackSpace + (SVC_STACK_LEGTH - 1)* 4  ;

StackIrq           DCD     IrqStackSpace + (IRQ_STACK_LEGTH - 1)* 4

StackFiq           DCD     FiqStackSpace + (FIQ_STACK_LEGTH - 1)* 4

StackAbt           DCD     AbtStackSpace + (ABT_STACK_LEGTH - 1)* 4

StackUnd           DCD     UndtStackSpace + (UND_STACK_LEGTH - 1)* 4

AREA    MyStacks, DATA, NOINIT, ALIGN=2

SvcStackSpace      SPACE   SVC_STACK_LEGTH * 4  ;管理模式堆栈空间

IrqStackSpace      SPACE   IRQ_STACK_LEGTH * 4  ;中断模式堆栈空间

FiqStackSpace      SPACE   FIQ_STACK_LEGTH * 4  ;快速中断模式堆栈空间

AbtStackSpace      SPACE   ABT_STACK_LEGTH * 4  ;中止义模式堆栈空间

UndtStackSpace     SPACE   UND_STACK_LEGTH * 4  ;未定义模式堆栈

10,边看书边实践,不断培养自己对ARM的兴趣,不断取得点成绩,别奢望一口吃成一个胖子,不断的给自己带来成功得快乐,我们都需要短期成绩的刺激才能长久的坚持。

11,做一个项目吧。否则永远也不能说你学会了。

12,本文给初学者指路用,背下本文,然后去看学习ARM的书籍,现在网上到处都有的ARM指令集,ARM的芯片资料,ARM应用系统开发详解,ADS-EasyJTAG,本篇宝典将是你学习ARM的加速器。

本文来自:proteus仿真论坛(http://proteus.5d6d.com),详细出处参考:http://proteus.5d6d.com/thread-1082-1-1.html

时间: 2024-12-21 23:11:09

ARM初学引导_转的相关文章

ARM核心板_迅为imx6工控核心板_核心板中的小新潮

ARM核心板_迅为imx6工控核心板_核心板中的小新潮核心板参数 尺寸 51mm*61mm CPU Freescale Cortex-A9 四核 i.MX6Q,主频 1.2 GHz 内存 2GB DDR3 存储 16GB EMMC 存储 EEPROM  4MB的EEPROM用来存储关键数据 电源管理 内部独立 工作电压 5V 系统支持 Linux-QT/Android/Ubuntu操作系统 引角扩展 引出脚多达320个,满足用户各类扩展需求 商业级运行温度 0℃到+70 ℃ 工业级运行温度 -4

CMOS无法识别硬盘导致的系统无法引导_排障过程

【嵌入式开发】 Bootloader 详解 ( 代码环境 | ARM 启动流程 | uboot 工作流程 | 架构设计)

作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42462795 转载请著名出处 相关资源下载 :  -- u-boot 源码 : http://download.csdn.net/detail/han1202012/8342761 -- S3C2440 文档 : http://download.csdn.net/detail/han1202012/8342701 -- S5PV210_iROM_Applicati

嵌入式启动之一:资源有限型系统启动

启动即是芯片上电复位要运行的程序,启动作为一个模块独立于操作系统而在,因为操作系统需要通过启动这个模块来加载和引导的.所以启动的英文术语是boot loader.我对boot loader的定义包括两部分:1.加载os 2. 为了让os能够正常运行所要做的硬件和软件初始化工作. 我们常常看到boot loader这个词语用于arm引导linux,X86引导windows等等.可见一般意义上,能用上boot loader都是一些计算能力强并外挂SDRAM的SOC方案.那我们咱们去理解内存资源有限型

Linux移植的一般过程

前一阵子在公司移植Linux2.6到一块ARM11的开发板上,下面粗略讲讲移植Linux的一般过程. 一开始的UBOOT的移植不多说了.UBOOT最后有两种方式进入Linux,一种是使用uImage,可以在引导时附加命令行参数,但操作起来比较麻烦.另一种较简单的是使用tftp将Linux内核加载到0x80008000(默认起始地址)的地方,然后使用go命令直接跳转.我使用的是第二种方式,其缺点是调整命令行参数的时候需要修改.config文件,然后强制重新编译setup.c(可以通过删除setup

启动嵌入式间:资源有限的系统启动

启动一个程序,它是在芯片上电复位,以执行,块独立于操作系统而在.由于操作系统须要通过启动这个模块来载入和引导的.所以启动的英文术语是boot loader.我对boot loader的定义包含两部分:1.载入os 2. 为了让os可以正常执行所要做的硬件和软件初始化工作. 我们经常看到boot loader这个词语用于arm引导linux,X86引导windows等等.可见一般意义上.能用上boot loader都是一些计算能力强并外挂SDRAM的SOC方案. 那我们咱们去理解内存资源有限型的嵌

学了5天Arm,今天谈谈初学感受 (转)

一.初探      4月1日入手友善mini2440.先看了下板子,感觉没什么稀奇的,s3c2440总线上外挂SDRAM(对这个不是很感冒,之前搞过一个FPGA的SDRAM控制器),NOR    .   flash,Nand Flash, Enternet PHY +MAC芯片.心里视乎有点数了--------程序烧在Flash里,上电后s2c2440把代码从Flash调入DRAM执行…..直觉上想.  .   到应该有一个程序来完成copy的事,但是这个程序本是如何被最先调入Dram的呢(后边

嵌入式开发板 迅为4412开发板 初学ARM开发板首选!提供教学视频!

选择迅为4412开发板无论是学习ARM技术还是开发产品都无须担心,迅为4412开发板提供了丰富的例程源码实例和视频,只需要你有C语言基础,就可以快速学习嵌入式高端技术开发! 搭载三星Exynos四核处理器,配备1GB内存,4GB固态硬盘EMMC存储,兼具快速读取与超大容量,纵使海量思考也能及时处理. 详情了解: http://topeetboard.com   更多了解:https://arm-board.taobao.com

嵌入式开发板 iTOP-4412开发板 初学ARM开发板首选!提供技术支持!

摘要: ARM开发板 迅为三星Exynos嵌入式开发平台超强GPS模块 iTOP-Exynos4412开发板采用 Exynos4412的主芯片,具有更高的主频和更丰富外设,配置 2GB 双通道 DDR3的内存及 16GB 存储,具有稳定性强.可靠性高,能适用于对性能和处理能力有更高要求的嵌入式系统应用场合. iTOP-Exynos4412开发板内置有无线 WIFI 模块.Bluetooth.GPS.Camera.3G等模组,支持 HDMI1.4(1080P/60Hz)显示,客户可以直接从开发平台