1、实验一 ARM汇编程序的编写以及启动代码的分析实验 ARM汇编程序的编写以及启动代码的分析一、实验目的:练习ARM汇编程序的编写,对提供的程序的启动代码进行分析,了解S3C2410初始化过程, 初始化代码主要是包含在start.s中。二、实验原理: 启动程序要完成的任务包括:硬件初始化,系统存储系统的配置,复制二级中断向量表。启动程序过程 系统硬件初始化 系统上电或复位后,程序从位于地址0x0的Reset Exception Vector处开始执行,因此需要在这里放置Bootloader的第一条指令:b ResetHandler,跳转到标号为ResetHandler处进行第一阶段的硬件初始化,
2、执行完,系统进行堆栈和存储器的初始化。使用了外设,则需要设置相关的寄存器,确定其刷新频率、总线宽度等信息。 代码段复制到RAM中运行 需要把系统的代码复制到RAM中运行。映像文件内部共有三种输出段:RO段、RW段和ZI段。ARMLink同时还产生了这三种输出段的起始和终止定位信息:Image$RO$Base、Image$RO$Limit、Image$RW$Base、Image$RW$Limit、Image$ZI$Base和Image$ZI$Limit。可以在程序中使用这些定位信息。将ROM中的代码和数据搬移到RAM中。 建立二级中断向量表 在ARM系统中,中断向量表位于0X0开始的地址处,意味
3、着无论运行什么样的上层软件,一旦发生中断,程序就得到Flash存储器中的中断向量表里去,降低系统的运行效率。因此在RAM中建立自己的二级中断向量表,当中断发生后,程序直接从RAM中取中断向量进入中断子程序。尤其是在中断频繁发生的系统里,这种方法可以大大提高系统的运行效率。三、实验内容:1运行一个简单的串口程序,单步执行初始化代码,观察寄存器变化。2分析系统上电后的初始化工作包括哪些内容。3分析中断的处理过程,包括中断向量表的建立、中断源的识别及中断IRQ服务程序是如何进入的。4分析应用程序的结构。四、实验代码:在系统上电后,初始化部分的工作注意包含以下部分:1、 关看门狗定时器2、 屏蔽所有中
4、断3、 设置CPU时钟频率。4、 设置存储器控制寄存器,对外部存储器的参数进行设置。5、 初始化各模式下的堆栈6、 建立IRQ中断的总的入口地址7、 初始化应用程序的执行环境8、 跳入Main函数,进入C程序;= ; NAME: 2410INIT.S ; DESC: C start up codes ; Configure memory, ISR ,stacks ; Initialize C-variables ; HISTORY: ; 2002.02.25:kwtark: ver 0.0 ; 2002.03.20:purnnamu: Add some functions for testin
5、g STOP,POWER_OFF mode ;= GET option.s ;GET相当INCLUDE 将一个源文件包含到当前源文件,这里表示包含option.s,并在当前位置进行汇编 GET memcfg.s GET 2410addr.s BIT_SELFREFRESH EQU (1 mrc p15,0,r0,c1,c0,0 DCD 0xe3800080 ;0xe3800080 = orr r0,r0,#0x80; /Big-endian DCD 0xee010f10 ;0xee010f10 = mcr p15,0,r0,c1,c0,0 ENTRY_BUS_WIDTH=16 ;if ENTR
6、Y_BUS_WIDTH=16 DCD 0x0f10ee11 DCD 0x0080e380 DCD 0x0f10ee01 ENTRY_BUS_WIDTH=8 ;if ENTRY_BUS_WIDTH=8 DCD 0x100f11ee DCD 0x800080e3 DCD 0x100f01ee DCD 0xffffffff ;swinv 0xffffff is similar with NOP and run well in both endian mode. DCD 0xffffffff DCD 0xffffffff DCD 0xffffffff DCD 0xffffffff b ResetHan
7、dler ;复位处理程式 ;Function for entering power down mode; 1. SDRAM should be in self-refresh mode.; 2. All interrupt should be maksked for SDRAM/DRAM self-refresh.; 3. LCD controller should be disabled for SDRAM/DRAM self-refresh.; 4. The I-cache may have to be turned on. ; 5. The location of the followi
8、ng code may have not to be changed. ;进入掉电模式功能; 1. SDRAM 必须在自刷新模式.; 2. 所有中断必须屏蔽 for SDRAM/DRAM self-refresh.; 3. LCD 关闭for SDRAM/DRAM self-refresh.; 4. The I-cache 可能需要开启. ; 5. The location of the following code may have not to be changed.;void EnterPWDN(int CLKCON); ;进入掉电模式 EnterPWDN mov r2,r0 ;r2=r
9、CLKCON CLKCON3掉电模式控制位 0:关闭 1:进入掉电模式 tst r0,#0x8 ; POWER_OFF mode?判断POWER_OFF 是否为0 。r0和#0X8相与,更新CPSR位 bne ENTER_POWER_OFF ;NE 不相等(则表示power_off不为O) 标志位Z=0 ENTER_STOP ;不进入掉电模式 ldr r0,=REFRESH ;0x48000024 ;DRAM/SDRAM refresh DRAM/SDRAM 刷新控制器,刷新DRAM/SDRAM ldr r3,r0 ;r3=rREFRESH mov r1, r3 ;r1=r3 orr r1,
10、r1, #BIT_SELFREFRESH ;BIT_SELFREFRESH EQU (1R0 Enable SDRAM self-refresh ;B是向后搜索局部标号, %F是向前搜索局部标号。 mov r1,#16 ;延时 wait until self-refresh is issued. may not be needed. 0 subs r1,r1,#1 ;0为局部标号(延时) bne %B0 ldr r0,=CLKCON ;enter STOP mode. CLKCON ;Clock generator control str r2,r0 mov r1,#32 0 subs r1,
11、r1,#1 ;1)延时 wait until the STOP mode is in effect. bne %B0 ;2) Or wait here until the CPU&Peripherals will be turned-off ; Entering POWER_OFF mode, only the reset by wake-up is available. ldr r0,=REFRESH ;exit from SDRAM self refresh mode. str r3,r0 MOV_PC_LR ;调用宏MOV_PC_LR ENTER_POWER_OFF ;进入掉电模式 ;N
12、OTE. ;1) rGSTATUS3 should have the return address after wake-up from POWER_OFF mode. ldr r0,=REFRESH ldr r1,r0 ;r1=rREFRESH orr r1, r1, #BIT_SELFREFRESH str r1, r0 ;Enable SDRAM self-refresh mov r1,#16 ;Wait until self-refresh is issued,which may not be needed. 0 subs r1,r1,#1 ;延时 bne %B0 ldr r1,=MISCCR ; ;Miscellaneous control,混杂控制模式 ldr r0,r1 orr r0,r0,#(70, SCL
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1