找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3169|回复: 0
打印 上一主题 下一主题
收起左侧

keil下的s3c2440启动代码分析(共68页pdf)

[复制链接]
跳转到指定楼层
楼主
ID:406592 发表于 2018-10-8 16:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
由于片面问题,所以可能会看起来不太美观,可以看附件中的内容。
        ARM启动代码相当于我们电脑的BIOS, 也就是 ARM启动时对处理器的一些初始化及嵌入式系统硬件的一些初始化。由于它直接面对处理器内核和硬件控制器进行编程,一般都是用汇编语言。一般包括:中断向量表,初始化存储器系统,初始化堆栈,初始化有特殊要求的断口,设备初始化,变量初始化等。这几天对着 RealView MDK-ARM中自带的启动代码研究了一下,遇到问题又对着数据手册和指令表看了一下,总算对S3C2440A 的硬件有了一个大致的了解。学习嵌入式系统重在系统,学习ARM只是为学习嵌入式系统铺路,懒猫比较笨可能在上系统之前要裸奔几天以强化以下对S3C2440A 内部结构的了解。
       把 MDK 自带的 S3C2440A.S 文件的注释发一下,这些是懒猫结合数据手册与ARM指令表理解了,可能会有错误,放在这里只是引导一下像我一样还没有入门的兄弟们,希望你们不要害怕ARM害怕嵌入式,老毛他老人家说的对,世上无难事,只怕有心人,ARM指令就那么多,看一遍不会就多看几遍,还有一定要学习看软件自带的帮助文件.
;下面这些参数是与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_St
ack_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
;-----------------------------------------------------------------------
  
WT_BASE          EQU      0x53000000       ; Watchdog Timer Base Address
WTCON_OFS      EQU      0x00      ; Watchdog Timer Control Register Offse
t
WTDAT_OFS      EQU       0x04       ; Watchdog Timer Data Register     Offs
et
WTCNT_OFS       EQU      0x08       ; Watchdog Timer Count Register    Offs
et
  
WT_SETUP          EQU      0
WTCON_Val         EQU      0x00000000
WTDAT_Val        EQU      0x00008000
  

完整的pdf格式文档51黑下载地址(共68页):
keil下的s3c2440启动代码分析.pdf (1.08 MB, 下载次数: 39)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表