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
ARM初学引导_转的更多相关文章
- ARM核心板_迅为4418核心板_高稳定超轻薄_研发超灵感
ARM核心板_迅为4418核心板_三星四核S5P4418处理器 4418核心板正面: 4418核心板反面:4418核心板尺寸图:详情了解:https://item.taobao.com/item.ht ...
- ARM核心板_迅为imx6工控核心板_核心板中的小新潮
ARM核心板_迅为imx6工控核心板_核心板中的小新潮核心板参数 尺寸 51mm*61mm CPU Freescale Cortex-A9 四核 i.MX6Q,主频 1.2 GHz 内存 2GB DD ...
- ARM汇编指令集_学习笔记(1)
一.什么是ARM汇编? 运行在ARM处理器上的汇编语言就叫ARM汇编. C程序运行在X86平台,底层就是X86汇编:运行在ARM平台,底层就是ARM汇编.ARM汇编与X86汇编有显著区别. X86属于 ...
- ARM核心板_迅为4412核心板_核心板中的小新潮
iTOP-4412核心板是迅为电子推出的一款高端四核核心板,配备三星Exynos 4412四核处理器,主频为1.4GHz,内置8GB存储空间. 该板设计小巧.配备三星自家电源管理芯片,具有9路DC/D ...
- 制作支持 BIOS+UEFI 的 U 盘 grub2+bootmgr 引导 + deepin_recovery + deepin_iso + win_pe
网盘下载:https://pan.baidu.com/s/1c2GXPo0 U盘为 FAT32,MBR分区表 1.下载:U盘grub2+bootmgr引导2017.12.6.2.7z 2.解压到 U盘 ...
- 【嵌入式开发】 Bootloader 详解 ( 代码环境 | ARM 启动流程 | uboot 工作流程 | 架构设计)
作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42462795 转载请著名出处 相关资源下载 : -- u-boo ...
- Linux移植的一般过程
前一阵子在公司移植Linux2.6到一块ARM11的开发板上,下面粗略讲讲移植Linux的一般过程. 一开始的UBOOT的移植不多说了.UBOOT最后有两种方式进入Linux,一种是使用uImage, ...
- Linux系统组成
1 系统组成 BootLoader:操作系统引导程序 内核: 文件系统:应用程序(用户开发的.网上下载的) 2 安装USB驱动 dongry@d-linux:~$ insmod usb_dnw.ko ...
- 【2017.12.12】deepin安装U盘制作,支持 BIOS+UEFI,deepin_Recovery+Win PE
U盘要求为 FAT32,MBR分区表 如果需要放 4GB 大文件,可以分两个分区,第一分区FAT32格式,放启动相关文件,第二个分区用 NTFS 格式,放其它资料. 最新 Win10 支持显示 U盘 ...
随机推荐
- POJ 1990 MooFest(zkw线段树)
[题目链接] http://poj.org/problem?id=1990 [题目大意] 给出每头奶牛的位置和至少要多少分贝的音量才能听到谈话 现在求奶牛两两交流成功需要的分贝*距离的总和. [题解] ...
- yum安装openresty
在群里看到春哥发的,先记录下来.一切都以官网为准,以后安装部署生态会越来越完善的. OpenResty 官方现在开始维护自己的打包虚机集合了,新的 linux 包仓库正在陆续登陆 openresty. ...
- stage 3d学习笔记
1. texture不能实例化,要创建一个texture对象,需要调用Context3D实例的createTexture(width:int, height:int, format:String, o ...
- react.js Warning: Failed form propType: You provided a value prop to a form field without an onChange handler. This will render a read-only field.
错误信息: eact.js:20483 Warning: Failed form propType: You provided a value prop to a form field without ...
- session的作用范围(转)
session是在服务器端建立的,浏览器访问服务器会有一个jsessionid,浏览器端通过 jsessionid定位服务器端的session,session的创建和销毁由服务器端控制.当浏览器关闭后 ...
- iOS常用第三方库大全,史上最全第三方库收集
下拉刷新 EGOTableViewPullRefresh – 最早的下拉刷新控件. SVPullToRefresh – 下拉刷新控件. MJRefresh – 仅需一行代码就可以为UITableVie ...
- github 丢失的本地提交
open git bash git reflog git reset xxxxxxx
- C++ 模板应用 实现一个Queue 队列
#include<iostream> using namespace std; template <typename T> class Queue { public: Queu ...
- spring-hadoop-samples
官方的spring-hadoop-samples的demo 写的还是挺好的,值得学习. 官网地址: http://projects.spring.io/spring-hadoop/#quick-sta ...
- Spark map-side-join 关联优化
在spark中要进行join操作,如果在shuffle的时候进行join效率较低.如果满足 所需要join的表中有一张表较小,那么可以考虑在map端进行join操作. 转载:http://blog.c ...