⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 init.s

📁 ucos移植在S3C44BOX上的源码
💻 S
📖 第 1 页 / 共 2 页
字号:
;**************************************************************************************************
;*
;* 作者: 胡翌博,浙江大学信电系电路与系统2001研
;*
;* 文件名:init.s 
;*
;* 版本: 5.2
;*
;* 功能描述:该汇编语言模块负责对硬件的基本初始化,包括:
;* --定义汇编程序入口,也是整个应用程序的入口
;* --存储系统重映射:给内部和外部的ROM/RAM分配地址空间
;* --设置堆栈:给各个模式下的堆栈指定堆栈初始指针
;* --装载异常向量表和异常处理程序
;* --设置CPSR:根据要求,使系统进入相应的工作模式,并打开或关闭IRQ/FIQ
;* --设置中断系统:根据要求打开或关闭相应的中断
;* --跳转到C应用程序的入口,即main()函数(注意:SDT中推荐C入口为C_Entry,而不是main())
;*
;* 本文件引用的文件列表:board.s
;*
;* 引用本文件的文件列表:no
;*
;* 版本更迭:
;*         日期         版本号      作者      备注               
;*      07-15-2003       1.0       胡翌博     --实验成功
;*
;*      07-20-2003       2.0       胡翌博     --修改了文本用户界面
;*
;*      07-27-2003       3.0       胡翌博     --加入构建中断向量和设置堆栈的操作
;*                                            --进一步修改了文本用户界面                                            
;*
;*      08-08-2003       4.0       胡翌博     --增加了基于-RO和-RW的Scatter load
;*                                            --更新了注释
;*                                            --将指令前TAB用四个空格来代替
;*
;*      08-06-2003       4.1       胡翌博     --增加了存储重映射和异常向量重装载
;*                                              重映射策略为:ISRAM(0~8K),SDRAM(8K~16M+8K),
;*                                              ROM0(16M+8K~17M+8K),ROM1(17M+8K~19M+8K)
;*                                            --修改了初始化模块编写指导
;*                                            --修正了错误的堆栈指针初始化指令序列
;*
;*      08-06-2003       4.2       胡翌博     --init.s中的异常向量表被转移到expDrv.s中
;*
;*      08-15-2003       5.0       胡翌博     --将版本4.0从SDT2.51开发环境移植到ADS1.2开发环境;
;*                                            --更新了注释,更详细;
;*                                            --标签vectorInitBlock更新为expVectors;
;*                                            --为将焦点集中在移植上,去除4.0版本中复杂的地址
;*                                              重映射,采用1.0版本的地址重映射策略;
;*                                            --为将焦点集中在移植上,去除了4.0版本中复杂的
;*                                              Scatter Load;
;*                                            --修改了错误的堆栈初始化指令序列,原来的指令
;*                                              序列少了一条BIC操作
;*      08-28-2003       5.1       胡翌博     --将跳转到C程序入口C_Entry的指令修改为跳转到__main
;*                                            --改版本未取得成功
;*      08-28-2003       5.2       胡翌博     --仍然采用C_Entry作为C程序入口,因此跳转到C
;*                                              入口的指令从跳转到__main修改为跳转到C_Entry
;*                                            --更新存储重映射,将SDRAM映射到0x0
;*                                            --增加了中断向量重装载和简单的Scatter load代码
;*                                            --修正了一个bug,在切换到SVC模式的代码序列遗漏了
;*                                              BIC r0, r0, #0x1F这句指令
;**************************************************************************************************
;**************************************************************************************************
;* 无OS应用的初始化程序编写指导:
;*     无论多么复杂的嵌入式应用,起始起入口点一定在初始化模块重,初始化模块是整个应用程序最先
;* 执行的代码。
;*     通常嵌入式操作系统会自带一些与硬件相关的程序,这些程序一般都用汇编书写,如初始化程序、
;* 异常向量和处理程序、某些设备驱动程序等等。这是嵌入式操作系统板级移植的两个主要的工作之一。
;* 这不属于本知道讨论的范畴。
;*     初始化程序的主要目的是在进入C语言应用程序和操作系统之前完成对系统的基本配置。
;*     初始化工作包括两类:硬件环境初始化(也称为执行环境初始化)、软件环境初始化(也称为C应
;* 用程序和运行库初始化)。
;*     这个初始化程序将完成上述两项工作。对最接近自己系统要求的初始化程序进行裁剪移植是个提高
;* 效率的好方法,因为绝大部分嵌入式系统的初始化工作都是类似的。
;* 初始化程序先完成硬件环境初始化,然后在进入C应用程序和操作系统之前完成软件环境初始化。具体
;* 步骤可参考如下指导。(注意:以下各项工作的先后关系只是一个参考,并非是固定的,可以根据自己
;* 的习惯和要求调整,也有一些工作的顺序是不能颠倒的,对于这些工作,我们会特别注明。)
;*
;* 硬件环境初始化:
;* --定义初始入口点和普通入口点:在ARM中,初始入口点是上电复位后,整个映像程序最初执行的那条
;*   指令;普通入口点则一般用于异常处理程序,以便保证连接器不会因为改异常程序未被显式调用而将
;*   其删除。普通入口点定义采用ENTRY汇编伪指令定义;整个映像程序中只有一个普通入口点时,连接
;*   器会自动将改普通入口点定义为初始入口点;当整个映像程序中有多个普通入口点时,需用连接命令
;*   选项-entry来显式地指明初始入口点。这项工作一定在初始化代码的最开头。
;*
;* --构建异常向量:虽然异常向量也可以安排在地址空间的高端,但是绝大部分应用都习惯地将其安排在
;*   低端,这样即使MPU存储映射的上限低于ARM核规定的异常向量高端入口时,异常驱动程序也能正常工
;*   根据ARM核的规定,作如果异常向量安排在低端,复位向量必需安排在0x0处,其他异常向量跟在后面;
;*   异常伺服程序可以安排在存储映射的其他地方;本初始化程序将异常向量和异常处理程序都安排在低
;*   端,低端采用系统中最快的存储器类型,如外部SDRAM或者内部SRAM。如果异常向量和异常处理程序单
;*   独构成文件。
;*
;* --前初始化代码:MPU进入监管模式、ARM状态,关闭FIQ和IRQ,禁止所有中断,以屏蔽干扰,初始化期
;*   间不应该有任何中断,即使偶然的也不可以。
;*
;* --存储系统重映射:通常上电的时候,MPU都有默认的存储空间映射(即给各个存储器分配地址空间),
;*   但是一般这种映像并不能满足我们的要求,因此需要重新设置存储映射。
;*
;* --堆栈系统初始化:尽量放到内部RAM,如果空间不够就放到外部RAM中。
;*
;* --切换工作模式和状态:根据应用程序运行的要求,将MPU切换到相应的运行模式和状态,一般应用程
;*   序都运行在用户态,如果初始化模块之后是操作系统或者需要享有特权,则可切换到监管模式。
;*
;* --切换中断使能:根据需要打开或关闭FIQ和IRQ,并使能相应的中断。
;*
;* 软件环境初始化:
;* --执行域装载:将各个执行域装载到连接器指定的存储空间,连接时连接器会产生一些符号指明这
;*   些存储空间,只要IMPORT这些符号,利用复制和零初始化例程就可以完成装载。执行域的装载主要
;*   是将代码、初始化和未初始化数据、零初始化数据装载到相应的存储空间中。虽然这部分代码在C
;*   运行库的__main()函数中有相应的代码,但是该代码需要做一些修改才能使用,因此本初始化程序
;*   自己编写了这部分代码。
;*
;* --C运行库初始化,这部分代码只有在使用C运行库中某些库函数时才需要,它的机制体现在C运行库
;*   中的__main()和__rt_entry()函数中,本程序没有做这部分工作。
;*
;* --流程跳转到C语言程序入口或操作系统,把系统控制权交给它们。
;*   
;**************************************************************************************************
;**************************************************************************************************
;* S3C4510B复位时的系统状态(由工作寄存器和专用寄存器定义):
;*
;* 程序状态寄存器:
;* --CPSR = 0x00000013
;*   即:ARM7TDMI核处于监管模式(SVC)
;*       ARM7TDMI核处于ARM状态
;*       ARM7TDMI核将IRQ和FIQ的总使能位关闭
;* 
;* 系统管理寄存器:
;* --SYSCFG(0x03FF0000)    = 0x37FFFF91    专用寄存器堆的默认起始地址为0x03FF0000,
;*                                         内部SRAM/Cache的默认起始地址为0x03FE0000
;* --CLKCON(0x03FF3000)    = 0
;* --EXDBWTH(0x03FF3010)   = 0             除了ROM0由外部引脚指定外,其余外部ROM和RAM堆都被禁止     
;* --ROMCON0(0x03FF3014)   = 0x20000060    ROM0处于地址空间的0x00000000处
;* --ROMCON1(0x03FF3018)   = 0x00000060
;* --ROMCON2(0x03FF301C)   = 0x00000060
;* --ROMCON3(0x03FF3020)   = 0x00000060
;* --ROMCON4(0x03FF3024)   = 0x00000060
;* --ROMCON5(0x03FF3028)   = 0x00000060
;* --DRAMCON0(0x03FF302c)  = 0
;* --DRAMCON1(0x03FF3030)  = 0
;* --DRAMCON2(0x03FF3034)  = 0
;* --DRAMCON3(0x03FF3038)  = 0
;* --REFEXTCON(0x03FF303c) = 0
;*
;* 中断控制寄存器:
;* --INTMOD(0x03FF4000)  = 0
;* --INTPND(0x03FF4004)  = 0
;* --INTMSK(0x03FF4008)  = 0x003FFFFF
;* --INTPRI0(0x03FF400C) = 0x03020100
;* --INTPRI1(0x03FF4010) = 0x07060504
;* --INTPRI2(0x03FF4014) = 0x0B0A0908
;* --INTPRI3(0x03FF4018) = 0x0F0E0D0C
;* --INTPRI4(0x03FF401C) = 0x13121110
;* --INTPRI5(0x03FF4020) = 0x00000014
;**************************************************************************************************



;**************************************************************************************************
;* AREA定义:
;*     AREA是ARM汇编代码最小的可编译模块,它也是连接器进行连接以生成镜像文件时的输入段。通常
;* 不同功能的模块放在不同的AREA中。
;*     AREA有名称和属性。相同属性(如都为READONLY)的AREA被连接器安排在连续的字节块中,构成一
;* 个输出段。若干地址连续的输出段构成一个域。
;*     当程序被烧录到存储器中,但是尚未执行的时候,程序所占据的存储空间被称为装载域;当程序开
;* 始执行的时候,所占据的存储空间被称为执行域。
;*     装载域和执行域的地址映射可以相同,也可以不同。如果相同,这样的域被称为根域或固定域;如
;* 果不同,则通常需要将代码和数据重新装载到执行域规定的地址空间中。
;*     装载域和执行域的地址映射是由连接器生成的,生成方法有两种:
;*     对于至多两个装载域,两个执行域,每个域中不超过三个输出段(RO、RW、ZI),这时可以用连接
;* 器命令选项-ro-base,-rw-base,-split,-ropi,-rwpi来指定装载域和执行域地址。若只有一个装载
;* 域,-ro-base就是装载域地址,同时也是第一个执行域地址,-rw-base就是第二个执行域地址;若有两
;* 个装载域,则-ro-base是第一个装载域地址,同时也是第一个执行域地址;-rw-base就是第二个装载域
;* 地址,同时也是第二个执行域地址。
;*     对于装载域超过两个,或者执行域超过两个,或者装载域和执行域中输出段和输入段的安排有特殊
;* 要求的情况,则属于比较复杂的镜像文件结构。其装载域和执行域的地址由连接器根据Scatter Load 
;* Description文件生成。
;*     实际上,连接器生成的是一些地址符号,程序员可以IMPORT这些地址符号,以便编写重装载执行域
;* 的代码序列。
;*     ADS C库中__main()暗含了一些代码,它们根据连接器提供的布局符,完成程序代码和数据的装载,
;* 但是需要裁剪以后才能使用。本程序自己编写了执行域重装载的程序。注意,SDT中不会自动产生这些
;* 装载代码,需要手工硬编码。
;*     关于镜像文件、执行域和装载域的详细信息,请参见ADS提供的连接器指南。
;**************************************************************************************************
    AREA    Init, CODE, READONLY



;**************************************************************************************************
;* 指明是ARM代码还是THUMB代码:
;* 该汇编伪指令指示汇编器将后续代码解析称32位ARM指令,
;* 同时指示汇编器,如果必要的话,填充0到3个字节,以保证程序段4字节对准。
;*************************************************************************************************
    CODE32
    
    
    
;**************************************************************************************************
;* 包含一些常量定义:
;* 该汇编伪指令指示汇编器包含一些文件进来,其实就是在汇编本文件余下的代码前,先汇编包含
;* 进来的子文件;这个子文件完成汇编后,再从GET指令的下一条汇编语句开始汇编。
;* INCLUDE伪指令与GET指令具有完全一样的功能,文件名中可以包括路径;默认路径是父文件所在
;* 路径;这两个伪指令可以嵌套,即子文件可以再包含孙文件。
;* s3c4510Def.s是ARM-Powered MPU的配置定义文件,其中定义了一些符号,从而更加清晰的说明
;* 和使用这款MPU的配置
;**************************************************************************************************    
    GET s3c4510bDef.s		



;**************************************************************************************************
;* 定义初始化程序的入口:
;* 一般,初始化程序的入口也是整个应用程序的初始入口,
;* ARM应用程序中只能有一个初始入口,但是可以有多个普通入口。
;* 一个汇编语言源文件中只能有一个普通入口,但是允许不同汇编语言文件中有各自的普通入口,
;**************************************************************************************************	
    ENTRY



;**************************************************************************************************
;* 构建异常向量表(Remap之前):
;* 异常处理程序在expDrv.s文件中
;**************************************************************************************************
    IMPORT undefinedHandler
    IMPORT swiHandler
    IMPORT prefetchHandler
    IMPORT dataHandler
    IMPORT irqHandler
    IMPORT fiqHandler

expVectors
    LDR PC, resetAddr                    ;LDR有这种用法吗
    LDR PC, undefinedAddr
    LDR PC, swiAddr
    LDR PC, prefetchAddr
    LDR PC, dataAddr
    NOP				         ;保留向量
    LDR PC, irqAddr
    LDR PC, fiqAddr

resetAddr     DCD resetHandler
undefinedAddr DCD undefinedHandler
swiAddr       DCD swiHandler
prefetchAddr  DCD prefetchHandler
dataAddr      DCD dataHandler
              DCD 0			 ;保留向量

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -