ARM启动代码分析

本文档详细解析了S3C2440A.S启动文件,涵盖ARM汇编语言,包括模式定义、栈配置、内存初始化、时钟与电源管理、存储控制器设置、I/O端口配置等内容,旨在帮助嵌入式初学者理解ARM启动过程。
 ARM启动代码相当于我们电脑的BIOS,也就是ARM启动时对处理器的一些初始化及嵌入式系统硬件的一些初始化。由于它直接面对处理器内核和硬件控制器进行编程,一般都是用汇编语言。一般包括:中断向量表,初始化存储器系统,初始化堆栈,初始化有特殊要求的断口,设备初始化,变量初始化等。这几天对着RealView MDK-ARM中自带的启动代码研究了一下,遇到问题又对着数据手册和指令表看了一下,总算对S3C2440A的硬件有了一个大致的了解。学习嵌入式系统重在系统,学习ARM只是为学习嵌入式系统铺路,懒猫比较笨可能在上系统之前要裸奔几天以强化以下对S3C2440A内部结构的了解。

把MDK自带的S3C2440A.S文件的注释发一下,这些是懒猫结合数据手册与ARM指令表理解了,可能会有错误,放在这里只是引导一下像我一样还没有入门的兄弟们,希望你们不要害怕ARM害怕嵌入式,老毛他老人家说的对,世上无难事,只怕有心人,ARM指令就那么多,看一遍不会就多看几遍,还有一定要学习看软件自带的帮助文件.

;/*****************************************************************************/

;/* S3C2440.S: Startup file for Samsung S3C440 */

;/*****************************************************************************/

;/* <<< Use Configuration Wizard in Context Menu >>> */

;/*****************************************************************************/

;/* This file is part of the uVision/ARM development tools. */

;/* Copyright (c) 2005-2008 Keil Software. All rights reserved. */

;/* This software may only be used under the terms of a valid, current, */

;/* end user licence from KEIL for a compatible version of KEIL software */

;/* development tools. Nothing else gives you the right to use this software. */

;/*****************************************************************************/

;下面这些参数是与CPSR状态寄存器有关

;参数的由来:这里各个模式的参数是由寄存器CPSR的模式位设置M[4:0]得来的,

;比如这里的用户模式,CPSR的M[4:0]设置为10000就是0x10。

;

;Mode_USR -- 用户模式,正常程序执行模式,用于应用程序

;Mode_FIQ -- 快速中断模式,用于高速数据传输和通道处理。

;Mode_IRQ -- 外部中断模式,用于通用的中断处理。

;Mode_SVC -- 管理模式,使用的一种保护模式。

;Mode_ABT -- 数据访问中止模式,用于虚拟存储用存储保护

;Mode_UND -- 未定义指令中止模式,当未定义指令执行时进入此模式。

;Mode_SYS -- 系统模式,用于特权级的操作系统任务。

;I_Bit -- 如果I位被置1,则外部中断被禁止(IRQ is disabled)

;F_Bit -- 如果F位被置1,则快速中断被禁止(FIQ is disabled)

;

;----------------------------------------------------------------------

Mode_USR EQU 0x10

Mode_FIQ EQU 0x11

Mode_IRQ EQU 0x12

Mode_SVC EQU 0x13

Mode_ABT EQU 0x17

Mode_UND EQU 0x1B

Mode_SYS EQU 0x1F

I_Bit EQU 0x80 ; when I bit is set, IRQ is disabled

F_Bit EQU 0x40 ; when F bit is set, FIQ is disabled

;-----------------------------栈初始化定义-----------------------------------

;下面这些主要是栈配置,系统的栈空间设定

;

;UND_Stack_Size -- 未定义模式的栈大小

;SVC_Stack_Size -- 超级用户模式的栈大小

;ABT_Stack_Size -- 数据访问终止模式的栈大小

;FIQ_Stack_Size -- 快速中断模式的栈大小

;IRQ_Stack_Size -- 外部中断模式的栈大小

;USR_Stack_Size -- 用户模式的栈大小

;ISR_Stack_Size -- 总堆栈的大小,也就是也有模式下堆栈相加

;

;-----------------------------------------------------------------------

UND_Stack_Size EQU 0x00000000

SVC_Stack_Size EQU 0x00000008

ABT_Stack_Size EQU 0x00000000

FIQ_Stack_Size EQU 0x00000000

IRQ_Stack_Size EQU 0x00000080

USR_Stack_Size EQU 0x00000400

ISR_Stack_Size EQU (UND_Stack_Size + SVC_Stack_Size + ABT_Stack_Size + \

FIQ_Stack_Size + IRQ_Stack_Size)

;-----------------------------------------------------------------------

;AREA -- 是一个伪指令,用于段定义。ARM的汇编程序由段组成,段是相对独立

; 的指令或数据单位,每个段由AREA伪指令定义,并定义段的属性。

; STACK -- AREA指令的一个参数,定义段名称

; NOINIT -- AREA指令的一个参数,指定本数据段仅仅保留了内在单元,而

; 将句初始值写入内存单元,也即将内存单元值初始化为0

; READWRITE -- 指定本段为可读可写,数据段默认为READWRITE。

; READWRITE(读写)、READONLY(只读)

;ALIGN -- 也是一个伪指令,指定对齐方式。ALIGN n 指令的对齐值有两种方案

; 即n 或2^n,这里采用第二种方案即指定后面的指令8字节对齐。

;

;下面这句话的意思是:

;开辟一个堆栈段,段名字为STACK,定义为可读可写,将内存单元初始化为0,

;-----------------------------------------------------------------------

AREA STACK, NOINIT, READWRITE, ALIGN=3

;-----------------------------------------------------------------------

;SPACE -- 伪指令,用于分配一块内存单元,并用0初始化,与%同义

;其指令格式为:

; {lable} SPACE expr

;lable -- 内存起始地址标号 expr -- 所要分配的内存字节数

;-----------------------------------------------------------------------

Stack_Mem SPACE USR_Stack_Size ;堆栈内存起始地址标号

__initial_sp SPACE ISR_Stack_Size ;汇编代码的地址标号

Stack_Top ;堆栈段内容结束,在这里放个标号,用来获得堆栈顶部地址

Heap_Size EQU 0x00000000 ;定义堆大小设置

;开辟一个名字为HEAP可读可写,不初始化内存单的内存单元。

AREA HEAP, NOINIT, READWRITE, ALIGN=3

__heap_base ;堆的基址

Heap_Mem SPACE Heap_Size ;堆内存起始地址标号

__heap_limit ;堆结束

;----------------------------内存初始化定义-----------------------------

;在一些应用系统中除了扩展Flash,RAM挂接在外部存储器接口上外,可能还有其它

;的外设挂接在外部存储器接口上,不同外设的操作时序什么的都是不一样的,所以

;在使用这些外设之前必须初始化连接这些外设存储器接口。这里因为没扩展,所以

;只定义一个片上内存基地址。

;-----------------------------------------------------------------------

IRAM_BASE EQU 0x40000000 ;片上SRAM的基地址,即内存基地址

;-------------------------看门狗初始化定义------------------------------

;看门狗在防止程序跑飞,进入无限死循环时起着重要作用。有些应用可能用不上

;看门狗功能,也可能有些应用会用到外部看门狗。在这个时候内部看门狗必须禁

;止,所以有时候会在初始化时将内部看门狗禁止,当以后应用用到时再开启它。

;看门狗定时器包括三个寄存器:

;WTCON -- 看门狗控制寄存器,设定看门狗定时器模式

;WTDAT -- 看门狗数据寄存器,用于设定超时宽度

;WTCNT -- 看门狗计数寄存器,里面存放的是看门狗定时器当前值

;

;WT_BASE -- 看门狗定时器基地址

;WTCON_OFS -- 看门狗控制寄存器偏移地址,相对于基址

;WTDAT_OFS -- 看门狗数据寄存器偏移地址,相对于基址

;WTCNT_OFS -- 看门狗计数寄存器偏移地址,相对于基址

;WT_SETUP -- 看门狗设置

;WTCON_Val -- 看门狗控制寄存器设置,关闭看门狗

;WTDAT_Val -- 看门狗数据寄存器设置,初始值即为0x8000

;------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值