把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
;------------

本文档详细解析了S3C2440A.S启动文件,涵盖ARM汇编语言,包括模式定义、栈配置、内存初始化、时钟与电源管理、存储控制器设置、I/O端口配置等内容,旨在帮助嵌入式初学者理解ARM启动过程。
最低0.47元/天 解锁文章
2335

被折叠的 条评论
为什么被折叠?



