s3c2440 启动代码

;******************************************************** ;S3C2440启动代码startup.s

;******************************************************** PRESERVE8

AREA START, CODE, READONLY

ENTRY

CODE32

GET 2440addr.inc

IMPORT InitPLL

IMPORT InitBank

IMPORT InitStack

IMPORT InitRORWZI

IMPORT IRQ_Dispatch

IMPORT Main

;异常向量表

LDR PC, =HANDLE_ResetInit ;复位异常

LDR PC, =HandlerUndef ;未定义指令异常

LDR PC, =HandlerSWI ;软中断异常

LDR PC, =HandlerPabort ;取指中止异常

LDR PC, =HandlerDabort ;数据中止异常

LDR PC, . ;保留

LDR PC, =HandlerIRQ ;IRQ中断异常

LDR PC, =HandlerFIQ ;FIQ中断异常

;******************************************************** ;复位异常处理函数

;处理系统的复位异常,初始化硬件系统环境,并调到c语言

;******************************************************** HANDLE_ResetInit

;关闭看门狗

LDR R0, =WTCON

LDR R1, =0X0

STR R1, [R0]

;屏蔽IRQ和FIQ中断位

MRS R0, CPSR

ORR R0, R0, #0xc0

MSR CPSR_c, R0

BL InitPLL ;配置MPLL和UPLL时钟

BL InitBank ;配置bank的参数

BL InitStack ;配置各种模式下的堆栈

BL InitRORWZI ;RW和ZI段的初始化

;开启IRQ和FIQ中断位

MRS R0, CPSR

AND R0, R0, #0x1F

MSR CPSR_c, R0

B Main

HandlerUndef;未定义指令异常处理函数(未实现) HandlerSWI;软中断处理函数(未实现) HandlerPabort ;指令终止异常处理函数(未实现) HandlerDabort;数据终止异常处理函数(未实现) HandlerIRQ;终端异常处理函数(未实现) SUB LR, LR, #4

STMFD SP!, {R0-R12, LR}

LDR LR, =RETURN_ADDR

LDR PC, =IRQ_Dispatch

RETURN_ADDR

LDMFD SP!, {R0-R12, PC}^

;SPSR复制到CPSR中

;是把R0到R7及其PC等十三个寄存器的值都恢复HandlerFIQ;快速中断异常处理函数(未实现) END

;************************************

;MPLL和UPLL参数配置

;***********************************

AREA PLL, CODE, READONLY

ENTRY

CODE32

GET 2440addr.inc

EXPORT InitPLL

;UPLL时钟配置,UPLL只能48MHz或48MHz

UPLL_MDIV_V AL EQU 0X38

UPLL_PDIV_V AL EQU 0X2

UPLL_SDIV_V AL EQU 0X2

UPLL_MDIV EQU (UPLL_MDIV_V AL << 12)

UPLL_PDIV EQU (UPLL_PDIV_V AL << 4)

UPLL_SDIV EQU (UPLL_SDIV_V AL << 0)

DIVN_UPLL EQU 0

;MPLL时钟配置,MPLL在200MHz-600MHz

MPLL_MDIV_V AL EQU 0X44

MPLL_PDIV_V AL EQU 1

MPLL_SDIV_V AL EQU 1

MPLL_MDIV EQU (MPLL_MDIV_V AL << 12)

MPLL_PDIV EQU (MPLL_PDIV_V AL << 4)

MPLL_SDIV EQU (MPLL_SDIV_V AL << 0)

HDIVN EQU 3

PDIVN EQU 1

UPLL_V AL EQU (UPLL_MDIV | UPLL_PDIV | UPLL_SDIV) MPLL_V AL EQU (MPLL_MDIV | MPLL_PDIV | MPLL_SDIV) CLKDIVN_V AL EQU ((DIVN_UPLL << 3) | (HDIVN << 1) | (PDIVN << 0)) ;以上配置产生的MPLL时钟频率如下

;FCLK EQU 304

;HCLK EQU 101

;PCLK EQU 50 ;系统时钟MPLL和UPLL配置

InitPLL

LDR R0, =LOCKTIME ;配置PLL的稳定周期时间

LDR R1, =0xFFFFFFFF

STR R1, [R0]

LDR R0, =CLKDIVN ;配置CLKDIVN时钟分频器

LDR R1, =CLKDIVN_V AL

STR R1, [R0]

mrc p15, 0, r0, c1, c0, 0 ;/*read ctrl register tekkaman*/ orr r0, r0, #0xc0000000 ;/*Asynchronous tekkaman*/

mcr p15, 0, r0, c1, c0, 0 ;/*write ctrl register tekkaman*/

LDR R0, =UPLLCON ;配置UPLL

LDR R1, =UPLL_V AL

STR R1, [R0]

NOP

NOP

;……(需要大于7个NOP的缓冲)

NOP

LDR R0, =MPLLCON ;配置MPLL

LDR R1, =MPLL_V AL

STR R1, [R0]

BX LR

;MOV PC, LR ;(这种方式比较不好)

END

;************************************ ;BANK参数配置

;*********************************** AREA BANK, CODE, READONLY

ENTRY

CODE32

GET 2440addr.inc

EXPORT InitBank

;BWSCON

DW8 EQU (0X0)

DW16 EQU (0X1)

DW32 EQU (0X2)

WAIT EQU (0X1 << 2)

UBLB EQU (0X1 << 3)

B0_BWS EQU (DW16 << 1)

B1_BWS EQU (DW32 << 4)

B2_BWS EQU (DW16 << 8)

B3_BWS EQU (DW16 << 12)

B4_BWS EQU (DW16 << 16)

B5_BWS EQU (DW16 << 20)

B6_BWS EQU (DW32 << 24)

B7_BWS EQU (DW32 << 28)

;BANK0配置参数

B0_Tacs EQU (0X0 << 13)

B0_Tcos EQU (0X0 << 11)

B0_Tacc EQU (0X7 << 8)

B0_tcoh EQU (0X0 << 6) B0_tah EQU (0X0 << 4)

B0_tacp EQU (0X0 << 2) B0_tPMC EQU (0X0 << 0)

;BANK1配置参数

B1_Tacs EQU (0X0 << 13) B1_Tcos EQU (0X0 << 11) B1_Tacc EQU (0X7 << 8)

B1_tcoh EQU (0X0 << 6)

B1_tah EQU (0X0 << 4)

B1_tacp EQU (0X0 << 2)

B1_tPMC EQU (0X0 << 0)

;BANK2配置参数

B2_Tacs EQU (0X0 << 13) B2_Tcos EQU (0X0 << 11) B2_Tacc EQU (0X7 << 8)

B2_tcoh EQU (0X0 << 6)

B2_tah EQU (0X0 << 4)

B2_tacp EQU (0X0 << 2)

B2_tPMC EQU (0X0 << 0)

;BANK3配置参数

B3_Tacs EQU (0X0 << 13) B3_Tcos EQU (0X0 << 11) B3_Tacc EQU (0X7 << 8)

B3_tcoh EQU (0X0 << 6)

B3_tah EQU (0X0 << 4)

B3_tacp EQU (0X0 << 2)

B3_tPMC EQU (0X0 << 0)

;BANK4配置参数

B4_Tacs EQU (0X0 << 13)

B4_Tcos EQU (0X0 << 11)

B4_Tacc EQU (0X7 << 8)

B4_tcoh EQU (0X0 << 6)

B4_tah EQU (0X0 << 4)

B4_tacp EQU (0X0 << 2)

B4_tPMC EQU (0X0 << 0)

;BANK5配置参数

B5_Tacs EQU (0X0 << 13)

B5_Tcos EQU (0X0 << 11)

B5_Tacc EQU (0X7 << 8)

B5_tcoh EQU (0X0 << 6)

B5_tah EQU (0X0 << 4)

B5_tacp EQU (0X0 << 2)

B5_tPMC EQU (0X0 << 0)

;BANK6配置参数

B6_MT EQU (0X3 << 15) B6_Trcd EQU (0X1 << 2) B6_SCAN EQU (0X1 << 0)

;BANK7配置参数

B7_MT EQU (0X3 << 15) B7_Trcd EQU (0X1 << 2) B7_SCAN EQU (0X1 << 0)

;REFRESH参数

REFEN EQU (0X1 << 23) TREFMD EQU (0X0 << 22) Trp EQU (0X2 << 20)

Trc EQU (0X2 << 18)

Tchr EQU (0X2 << 16)

REFCET EQU (1653 << 0)

;参数配置组合

BWSCON_V AL EQU (B0_BWS|B1_BWS| B2_BWS | B3_BWS| B4_BWS | B5_BWS | B6_BWS | B7_BWS)

BANKCON0_V AL EQU (B0_Tacs | B0_Tcos | B0_Tacc | B0_tcoh | B0_tah | B0_tacp | B0_tPMC)

BANKCON1_V AL EQU (B1_Tacs | B1_Tcos | B1_Tacc | B1_tcoh | B1_tah | B1_tacp | B1_tPMC)

BANKCON2_V AL EQU (B2_Tacs | B2_Tcos | B2_Tacc | B2_tcoh | B2_tah | B2_tacp | B2_tPMC)

BANKCON3_V AL EQU (B3_Tacs | B3_Tcos | B3_Tacc | B3_tcoh | B3_tah | B3_tacp | B3_tPMC)

BANKCON4_V AL EQU (B4_Tacs | B4_Tcos | B4_Tacc | B4_tcoh | B4_tah | B4_tacp | B4_tPMC)

BANKCON5_V AL EQU (B5_Tacs | B5_Tcos | B5_Tacc | B5_tcoh | B5_tah | B5_tacp | B5_tPMC)

BANKCON6_V AL EQU (B6_MT | B6_Trcd | B6_SCAN)

BANKCON7_V AL EQU (B7_MT | B7_Trcd | B7_SCAN)

REFRESH_V AL EQU (REFEN| TREFMD | Trp | Trc | Tchr | REFCET)

BANKSIZE_V AL EQU (0X32)

MRSRB6_V AL EQU (0X30)

MRSRB7_V AL EQU (0X30)

;配置bank的参数

InitBank

;Set memory control registers

LDR R0,=L_BANK_CONF

LDR R1,=BWSCON ;BWSCON Address

ADD R2, R0, #52 ;End address of SMRDATA

LDR R3, [R0], #4

STR R3, [R1], #4

CMP R2, R0

BNE %B0

BX LR

;声明一个文字池的开始,文字池一般放置在一个代码段的最后面,或者一个文件的END前面。文字池的作用是在

;代码中分配一段存储空间来存放变量

LTORG

L_BANK_CONF DATA

;文字池的标号。在文字池用一个数据定义伪操"DCD",DCD用于分配一片连续的存储单元,

;并用指定的表达式对其进行初始化,表达式可以为程序标号或数字表达式。

DCD BWSCON_V AL ;4800 0000

DCD BANKCON0_V AL ;4800 0004 DCD BANKCON1_V AL ;4800 0008 DCD BANKCON2_V AL ;4800 000C DCD BANKCON3_V AL ;4800 0010 DCD BANKCON4_V AL ;4800 0014 DCD BANKCON5_V AL ;4800 0018 DCD BANKCON6_V AL ;4800 001C DCD BANKCON7_V AL ;4800 0020 DCD REFRESH_V AL ;4800 0024 DCD BANKSIZE_V AL ;4800 0028 DCD MRSRB6_V AL ;4800 002C DCD MRSRB7_V AL ;4800 0030

END

;************************************

;定义7中处理模式下的栈起始地址和大小

;SDRAM地址范围:0x30000000~0x33FFFFFF

;栈基址地址从0x33FFFFFF开始往后倒退

;***********************************

AREA STACK , CODE , READONLY

ENTRY

CODE32

GET 2440addr.inc

EXPORT InitStack

C_STACK_BASE EQU 0X33FF0000

C_USR_STACK_BASE EQU C_STACK_BASE

C_USR_STACK_SIZE EQU (10*1024)

C_SYS_STACK_BASE EQU C_USR_STACK_BASE- C_USR_STACK_SIZE C_SYS_STACK_SIZE EQU (10*1024)

C_SVC_STACK_BASE EQU C_SYS_STACK_BASE- C_SYS_STACK_SIZE C_SVC_STACK_SIZE EQU (10*1024)

C_IRQ_STACK_BASE EQU C_SVC_STACK_BASE- C_SVC_STACK_SIZE C_IRQ_STACK_SIZE EQU (10*1024)

C_FIQ_STACK_BASE EQU C_IRQ_STACK_BASE- C_IRQ_STACK_SIZE C_FIQ_STACK_SIZE EQU (1024)

C_ABT_STACK_BASE EQU C_FIQ_STACK_BASE- C_FIQ_STACK_SIZE C_ABT_STACK_SIZE EQU (128)

C_UND_STACK_BASE EQU C_ABT_STACK_BASE- C_ABT_STACK_SIZE C_UND_STACK_SIZE EQU (128)

;****************************************************************

;配置各种模式下的堆栈

;**************************************************************** InitStack

MRS R7 , CPSR ;备份处理器模式

MRS R0, CPSR

AND R0, R0, #0XFFFFFFE0

;配置SVC模式的堆栈

ORR R1, R0, #0X13

MSR CPSR_c, R1

LDR SP, =C_SVC_STACK_BASE

;配置IRQ模式的堆栈

ORR R1, R0, #0X12

MSR CPSR_c, R1

LDR SP, =C_IRQ_STACK_BASE

;配置FIQ模式的堆栈

ORR R1, R0, #0X11

MSR CPSR_c, R1

LDR SP, =C_FIQ_STACK_BASE

;配置UND模式的堆栈

ORR R1, R0, #0X1B

MSR CPSR_c, R1

LDR SP, =C_UND_STACK_BASE

;配置ABT模式的堆栈

ORR R1, R0, #0X17

MSR CPSR_c, R1

LDR SP, =C_ABT_STACK_BASE

;配置SYS模式的堆栈

ORR R1, R0, #0X1F

MSR CPSR_c, R1

LDR SP, =C_SYS_STACK_BASE

MSR CPSR_c, R7

BX LR

;MOV PC, LR ;事实上用下面这条指令也可以,但编译器会有一个warning END

;************************************

;RO、RW、ZI参数配置;***********************************

AREA RORWZI, CODE, READONLY

ENTRY

CODE32

GET 2440addr.inc

EXPORT InitRORWZI

IMPORT |Image$$RO$$Base|

IMPORT |Image$$RO$$Limit|

IMPORT |Image$$RW$$Base|

IMPORT |Image$$RW$$Limit|

IMPORT |Image$$ZI$$Base|

IMPORT |Image$$ZI$$Limit|

;RW和ZI段的初始化

InitRORWZI

STMFD SP!, {R0-R12, LR}

LDR R0, =|Image$$RO$$Limit|

LDR R1, =|Image$$RW$$Base| ; LDR R3, =|Image$$RW$$Limit| LDR R2, =|Image$$ZI$$Base| ; ADD R0, #1

;内存对齐

AND R6, R0, #3

CMP R6, #0

SUBNE R0, R0, R6

ADDNE R0, R0, #4

CMP R0, R1

BEQ %F2

1

;拷贝RW段

CMP R2, R1

BCC %F2

LDR R3, [R0], #4

STR R3, [R1], #4

B %B1

2

LDR R0, =|Image$$ZI$$Limit|

MOV R1, #0

CMP R0, R2

BCC %F3

STRB R1, [R2], #1

B %B2

3

LDMFD SP!, {R0-R12, PC}

END

移植u-boot-2012-10到tiny210v2(一)-----基本芯片介绍和启动流程介绍

移植u-boot-2012-10到tiny210v2(一)-----基本芯片介绍和 启动流程介绍 软硬件环境宿主机系统:Fedora10U-boot版本: U-boot-2012-10 板子芯片:S5PV210(Contex-A8),512M DDR2,512M SLC Nand交叉编译器: arm-linux-gcc-4.5.1-v6-vfp-20120301(支持armv7指令系统)1.写在前面的话Tiny210买回来好几个星期了,一直没有很认真的弄他,偶尔看看友善之臂提供的裸机程序。本来买板子回来是要跑android系统的,还没有真正跑到那一步。本来以为友善之臂会和mini2440一样提供U-boot源码,买回来发现啥都木有,只有一个superBoot。superBoot确实很美,可是不是我们自己的,总觉得有点遗憾。所以不想用superBoot来做Bootloader,想自己移植U-boot。搜索了网上的一些帖子和博客。对s5pv210的u-boot移植有两个人是连篇写的,写得也不错。一个是在别人移植到mini210的u-boot 基础上改的,一个是移植到qt210的。第一个是在别人修改的源码上修改的,没有了在原始代码上移植的滋味,并且我试过,我这边没法编译,悲催!第二个是在QT210上的,虽然芯片是一样的,可是按照他的步骤第一步我的程序就跑不起来。哎!算了吧,还是靠自己吧!!!移植之前首先要准备几样东西,下面列个清单:①U-boot-2012-10

的源代码,可以自行去http://ftp.denx.de/pub/u-boot/下载 ②arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz交叉编译器,友善之臂的光盘有提供③ S5PV210_iROM_ApplicationNote_Preliminary_20091126.pdf,这个是S5PV210的启动流程文档,友善的光盘有提供在光盘的\No OS(裸机程序)\reference下④ S5PV210_UM_REV1.1.pdf,S5PV210的datasheet,友善光盘有提供⑤s5pv210.h和mkv210_image.c,s5pv210.h是定义了s5pv210芯片地址的头文件,mkv210_image.c到我们制作spl的时候需要使用到。这两个文件可以在友善之臂提供的光盘中找到,具体位置在\No OS(裸机程序)\src\6.sdram\BL1中就有这两个文件⑥准备一张4G的可用的SD卡和一块tiny210开发板。在这一篇中不会涉及到U-boot的移植,只是做U-boot移植之前的一些基本前提知识的介绍,这样子我们进入U-boot的移植才会明白每一步是怎么走的,要不你总是拷贝别人的修改的代码来编译,就算能跑起来也不是你的。 2.S5PV210介绍 S5PV210是三星的Contex-A8系列的一块芯片,属于ARMV7架构,如果你想了解Context-A8是啥,那你就得来了解ARM 的发展历程。说起ARM那是一个大名鼎鼎的家伙,可能你们觉得手里拿着Iphone和IPad有多高级,可是别忘了,你拿着的这些东西的处理器都是ARM架构的,就算是Iphone5

STM32启动文件详解

STM32启动文件详解 (2012-07-28 11:22:34) 转载▼ 分类:STM32 标签: stm32 启动 在<>,用的是STM32F103RBT6,所有的例程都采用了一个叫STM32F10x.s的启动文件,里面定义了STM32的堆栈大小以及各种中断的名字及入口函数名称,还有启动相关的汇编代码。STM32F10x.s是MDK提供的启动代码,从其里面的内容看来,它只定义了3个串口,4个定时器。实际上STM32的系列产品有5个串口的型号,也只有有2个串口的型号,定时器也是,做多的有8个定时器。比如,如果你用的 STM32F103ZET6,而启动文件用的是STM32F10x.s的话,你可以正常使用串口1~3的中断,而串口4和5的中断,则无**常使用。又比如,你TIM1~4的中断可以正常使用,而5~8的,则无法使用。 而在固件库里出现3个文件 startup_stm32f10x_ld.s startup_stm32f10x_md.s startup_stm32f10x_hd.s 其中,ld.s适用于小容量产品;md.s适用于中等容量产品;hd适用于大容量产品; 这里的容量是指FLASH的大小.判断方法如下: 小容量:FLASH≤32K 中容量:64K≤FLASH≤128K 大容量:256K≤FLASH ;******************** (C) COPYRIGHT 2011 STMicroelectronics ******************** ;* File Name : startup_stm32f10x_hd.s ;* Author : MCD Application Team ;* Version : V3.5.0 ;* Date : 11-March-2011 ;* Description : STM32F10x High Density Devices vector table for MDK-ARM ;* toolchain. ;* This module performs: ;* - Set the initial SP ;* - Set the initial PC == Reset_Handler ;* - Set the vector table entries with the exceptions ISR address ;* - Configure the clock system and also configure the external ;* SRAM mounted on STM3210E-EVAL board to be used as data ;* memory (optional, to be enabled by user) ;* - Branches to __main in the C library (which eventually ;* calls main()). ;* After Reset the CortexM3 processor is in Thread mode,

嵌入式Linux之我行——u-boot-2009_08在2440上的移植详解(六) - Bootloader移植篇 - hbhuanggang

嵌入式Linux之我行——u-boot-2009.08在2440上的移植 详解(六) 嵌入式Linux之我行,主要讲述和总结了本人在学习嵌入式linux中的每个步骤。一为总结经验, 二希望能给想入门嵌入式Linux的朋友提供方便。如有错误之处,谢请指正。 ?共享资源,欢迎转载:https://www.360docs.net/doc/f111532673.html, 一、移植环境 ?主机:VMWare--Fedora 9 ?开发板:Mini2440--64MB Nand,Kernel:2.6.30.4 ?编译器:arm-linux-gcc-4.3.2.tgz ?u-boot:u-boot-2009.08.tar.bz2 二、移植步骤 上接:u-boot-2009.08在2440上的移植详解(五) 10)u-boot利用tftp服务下载内核和利用nfs服务挂载nfs文件系统。 知识点: 1.tftp服务的安装与配置及测试; 2.nfs服务的安装与配置及测试; 3.u-boot到kernel的参数传递(重点)。 我们知道使用tftp下载内核和使用nfs挂载文件系统的好处是,当我们重新编译内核或文件系 统后不用重新把这些镜像文件再烧录到flash上,而是把这些镜像文件放到开发主机的tftp或nfs 服务的主目录下,通过网络来加载他们,不用频繁的往flash上烧,这样一可以保护flash的使用 寿命,二可以方便的调试内核或文件系统,提高开发效率。可见,让u-boot实现这个功能是一件很有意义的事情。 实现这样的功能很简单,网上也有很多资料。但有很多细节的东西如果稍不注意就导致失败,这里就结合本人实现的过程进行讲述和一些问题的分析。 ?tftp服务的安装与配置及测试 要使用tftp服务及测试它要安装两个软件包,一个就是tftp服务器,另外一个就是tftp客户端,这里安装客户端只是用于在主机本地测试tftp服务器是否正常运行的,来确保u-boot能够访 问tftp服务(u-boot中已有tftp客户端的功能,其实在前面几篇中都已经使用了tftp下载内核或 文件系统到开发板上,如果那里都做到了,这里就可以直接跳过)。 首先使用rpm命令查看你的主机上是否已经安装了tftp服务器和客户端,如果没有安装就去下 载这两个软件包进行安装或者可以使用yum命令进行在线安装,yum会自动的去搜索适合你主机平 台的最新软件包进行下载安装,如果主机已经安装了,则会提示软件包已经安装了最新的版本。如 下图所示:

基于S3C2440的U_Boot双启动实现

收稿日期:2011-03-21 基金项目:中海油服企业发展基金资助项目(1017CS -A01C234)作者简介:高文辉(1987—),男,福建福清人,硕士研究生,主要研究方向为嵌入式系统的开发与设计。 基于S3C2440的U-Boot 双启动实现 高文辉,师奕兵,张 伟 (电子科技大学自动化工程学院,四川成都611731) 摘要:嵌入式处理器S3C2440同时支持Bootloader 从Nor Flash 和Nand Flash 启动,而U-Boot 默认的启动设备为Nor Flash 。为了使U-Boot 同时支持从Nor Flash 和Nand Flash 启动,根据U-Boot 在S3C2440处理器上的启动流程和U-Boot 从Nand Flash 和Nor Flash 启动过程的差异,添加了Nand Flash 读写驱 动,使其同时支持Nor Flash 和Nand Flash 启动,并在此基础上分析并实现了U-Boot 引导Linux 内核镜像的过程。实现的源代码在交叉编译环境中编译通过,可以同时支持Nor Flash 和Nand Flash 的启动并 能正确引导Linux 内核,在基于S3C2440处理器的硬件平台上稳定运行。 关键词:S3C2440;U-Boot ;双启动;Linux 内核中图分类号:TP311.1文献标识码:A 文章编号:1000-8829(2012)02-0087-05 Implementation of Double Boot in U-Boot Based on S 3C 2440 GAO Wen-hui,SHI Yi-bing,ZHANG Wei (School of Automation Engineering,University of Electronic and Technology of China,Chengdu 611731,China) Abstract:Embedded processor S3C2440supports bootloader boot from both Nand Flash and Nor Flash,but U-Boot's default booting device is Nor Flash.In order to support the boot from Nor Flash and Nand Flash in the U-Boot,according to the boot process of U-Boot in the S3C2440processor and the difference that U-Boot boots from Nor Flash and Nand Flash,the Nand Flash drive that it can support both Nor Flash and Nand Flash boot is added.Based on this,the process of U-Boot booting the Linux kernel is analyzed and finally implemented. The U-Boot source code is correctly compiled in the cross-compiler.It can support both Nor Flash and Nand Flash boot,properly boot the Linux kernel and run stably in the hardware platform based on S3C2440processor.Key words:S3C2440;U-Boot;double boot;Linux kernel 从软件的角度分析,嵌入式Linux 系统通常包括 引导加载程序、Linux 内核、文件系统和用户应用程序这4个层次[1] 。引导加载程序包括固化在固件(firm-ware )中的boot 代码(可选)和Bootloader 两大部分,而 在大多嵌入式系统中并没有固件, 因此整个系统的加载启动任务就完全由Bootloader 来完成。简单地说,Bootloader 就是在操作系统内核运行之前运行的一段小程序,它在系统上电时开始执行,初始化硬件设备、 准备好软件环境,最后调用操作系统内核[2] 。Boot-loader 的实现非常依赖于具体硬件,需要根据硬件配 置将Bootloader 移植到嵌入式系统中。U-Boot 是目前非常流行、功能强大的Bootloader ,是遵循GPL 条款的 开放源码项目。U-Boot 可以引导Linux 、VxWorks 等操作系统并支持多种体系结构的处理器。S3C2440支持 Nand Flash 和Nor Flash 这两种启动方式,而U-Boot 默认的启动方式为Nor Flash 启动。笔者在基于S3C2440的硬件平台上,分析了U-Boot 的启动流程并讨论通过对U-Boot 的修改使其支持Nor Flash 和Nand Flash 双启动的方法,在此基础上添加了zImage 格式Linux 内核镜像的支持并实现了U-Boot 引导zImage 格 式的Linux 内核镜像。 1硬件平台介绍 本文使用的硬件系统框图如图1所示,板上外设包括一块256MB 的Nand Flash 、一块2MB 的Nor Flash 、两块32MB 的SDRAM 、用于下载和调试的JTAG 接口和RS-232电平转换电路、以太网控制器、 LCD 接口、USB 接口和用于启动方式选择的开关等。采用的嵌入式微处理器是三星公司的ARM9芯片

电脑启动过程详解!!!

电脑启动过程详解 1.当按下电源开关时,电源就开始向主板和其它设备供电,这时电压还不太稳定,主板上的控制芯片组会向CPU发生并保持一个RESET(重置)信号,让CPU内部自动恢复到初始状态,但CPU在些刻不会马上执行指令,当芯片组检查到电源已经开始稳定供电了(当然从不稳定,到稳定的过程只是一瞬间的事情)它便撤去RESET信号(如果是手工按下电脑面板上的RESET按钮来重启机器,那么松开该按钮时芯片组就会撤去RESET信号)CPU马上从地址FFFF0H处开始执行指令,这个地址实际在系统BIOS的地址范围内, 无论是Award BIOS,还是AMI BIOS,在这里的只是一条跳转指令,跳到系统BIOS中真正的启动代码处。 2.系统BIOS的启动代码首先要做的事情就进行POST(Power-On Self Test,加电后自检),POST的主要任务是检查系统中一些关键设备是否存在和是否正常工作,例如内存和显卡等设备.由于POST是最早进行的检查过程,此时显卡还没有初始化,如果系统BIOS在进行POST的过程中发现了些致命错误,例如没有找到内存或内存有问题 (此时只会检查640KB常规内存),那么系统BIOS就会直接控制嗽叭发生声音来报告错误,声音的长短和次数代表了错误的类型.在正常情况下,POST过程进行的非常快,我们几乎无法感觉到它的存在,POST结束之后就会调用其它代码来进行更完整的硬件检测。 3.接下来系统BIOS将查找显卡的BIOS,前面说过,存放显卡BIOS的ROM芯片的超始地址通常设在 C0000H,系统BIOS在这个地方找到显卡BIOS之后就调用它的初始化代码来初始化显卡,此时多数显卡都在屏幕上显示出一些初始化信息,介绍生产厂商,图形芯片类型等内容,不过这个画面几乎是一闪而过,系统BIOS接着会查找其它设备的BIOS程序,找到之后同样会调用这些BIOS内部的初始化代码来初始化相关的设备。 4.查找完所有其它设备的BIOS之后,系统BIOS将显示出它自己的启动画面,其中包括有系统BISO的类型,序列号和版本号等内容. 5.接着系统BIOS将检查和显示CPU的类型和工作频率,然后开始测试所有RAM,并同时在屏莫显示内存测试的速度,用户可以在CMOS设置中自行决定使用简单耗时少或详细耗时多的测试方式. 6.内存测试通过之后,系统BIOS将开始检测系统中安装的一些标准硬件设备,包括硬盘,CD-ROM,串口,并口,软驱等设备,另外绝大数较新版本的系统BIOS在这一过程中还要自动检测和设置内存的定时参数,硬盘参数和访问模式等. 7.标准设备检查完毕后,系统BIOS内部的支持即插即用的代码将开始检测和配置系统中安装的的即插即用设备,每找到一个设备之后,系统BIOS都会在屏幕上显示出设备的名称和型号等信息,同时为该设备分配中断,DMA通道和I/O端口等资源。 8.到这一步为止,所有硬件都已经检测配置完毕了,多数系统BIOS会重新清屏并在屏幕上方显示出一个表格,其它概略地列出了系统中安装的各种标准硬件设备,以及它们使用的资源和一些相关工作参数。 9.接下来系统BIOS会更新ESCD(Extended system configuration data,扩展系统配置数据.)ESCD是系统BIOS用来与操作系统交换硬件配置信息的一种手段,这些数据被存放在CMOS之中,通常ESCD数据只在系统配置发生改变后才会更新,所以不是每次启动电脑时都能够看到"updata ESCD … Success"这样的信息, 不过某些主板的系统BIOS在保存ESCD数据时使用了与widnwos 9x不相同的数据格式,于是widnwos 9x在启动过程中会把ESCD数据修改成自己的格式,但在下一次启动时,既使硬件配置没有发生改变,系统BIOS也会把ESCD的数据格式修改回来,如此循环,将会导致在每次启动电脑时,系统BIOS都要更新一遍ESCD,这就是为什么有些机器在每次启动时都会显示出相关信息的原因。 10.ESCD更新完毕后,系统BIOS的启动代码将进行它的最后一项工作,即根据用户指定的启动顺序从软件,硬件或光驱启动,以从C盘启动为例,系统BIOS将读取并执行硬盘上的主引导记录,主引导记录接着从分区表中找到第一个活动分区,然后读取并执行这个活动分区的引导记录,而分区引导记录将负责读取并执行 IO.SYS这是DOS和widnows 9x的IO.SYS(或NT的NTLDR)首先要初始化一些重要的系统数据,然后将显示出我们熟悉的蓝天白云,在这幅画面之下,widnwos 将继续进行DOS部分和GUI(图形用户界面)部分的引导和初始化工作. 上面介绍的便是电脑在打开电源开关(或按RESET)进行冷启动时所要完成的各种初始化工作,如果在DOS 下按Ctrl Alt DEL组合键,(或从windows中选择重新启动电脑)来进行热启动,那么POST过程将被跳过去,

mini2440启动代码分析

Mini2440启动代码分析 嵌入式_WK 2010年11月22日分析 ;========================================= ;分析注释字体颜色:颜色 ;代码中宏变量颜色:颜色 定义的常量的颜色:颜色 ;代码中关键字颜色:颜色 其中一段代码用“=====“分隔开 ;========================================= ; NAME: 2440INIT.S ; DESC: C start up codes ; Configure memory, ISR ,stacks 配置内存,中断,堆载 ; Initialize C-variables 设定 C-变数初值 ; HISTORY: ; 2002.02.25:kwtark: ver 0.0 ; 2002.03.20:purnnamu: Add some functions for testing STOP, Sleep mode;为测试停止增加一些功能,睡眠模态 ; 2003.03.14:DonGo: Modified for 2440. ;========================================= ;GET类似于C语言的include,option.inc文件内定义了一些全局变量,memcfg.inc文件内定义了关于内存bank的符号和数字常量,2440addr.inc文件内定义了用于汇编的s3c2440寄存器变量和地址,用GET来引入一些头文件 GET option.inc GET memcfg.inc ;内存的配置 GET 2440addr.inc ;2440中地址的配置 ;========================================= ;内存的刷新格式 BIT_SELFREFRESH EQU(1<<22) ;========================================= ;定义的一些模式 ;Pre-defined constants USERMODE EQU 0x10 用户模式 FIQMODE EQU 0x11 快速中断模式 IRQMODE EQU 0x12 中断模式 SVCMODE EQU 0x13 管理模式 ABORTMODE EQU 0x17 终止模式 UNDEFMODE EQU 0x1b 未定义模式 MODEMASK EQU 0x1f ;相关掩码CPSR中的I位和F位置1,表示禁止任何中断 NOINT EQU 0xc0

keil下C51启动代码详解

由于CPU和程序启动代码文件STARTUP.a51的重要性,一些8051派生的CPU产品要求初始化CPU来满足设计中的相应的硬件,因此,有时候用户需要对STARTUP.a51进行修改,所以进行注释一下: ;--------------------------------------------------- ;startup.A51: 用户上电初始化程序 ;---------------------------------------------------- ; ;使用以下EQU命令可定义在CPU复位时需要用0进行初始化的内存空间 ; ;IDA TA存储器的空间的绝对起始地址总是零 IDA TALEN EQU 80H ;需用0进行初始化的IDA TA存储器空间的字节数 ; XDA TASTART EQU 0H ;XDA TA存储器空间的绝对起始地址 XDA TALEN EQU 0H ;需用0进行初始化的XDA TA存储器的空间字节数 ; PDA TASTART EQU 0H ;PDA TA存储器的空间的绝对起始地址 PDA TALEN EQU 0H ;需用0进行初始化的PDA TA存储器的空间字节数 ;注意:IDA TA存储器的空间在物理上包括了8051单片机的DA TA和BIT存储空间 ;至少要保证与C51编译器运行库有关的存储器的空间进行0初始化 ; ;再入函数模拟初始化 ;----------------------------------------------------------- ;以下用EQU指令定义了再入函数模拟堆栈指针的初始化 ; ;使用SMALL存储器模式时再入函数的堆栈空间 IBPSACK EQU 0 ;使用SMALL存储器模式再入函数时将其设置成1 IBPSTACKTOP EQU 0FFH+1 ;将堆栈顶设置为最高地址加1 ; ;使用LARGE存储器模式时再入函数的堆栈空间 XBPSTACK EQU 0 ;使用LARGE存储器模式再入函数时将其设置成1 XBPSTACKTOP WQU 0FFFFH+1 ;将堆栈顶设置为最高地址加1 ; ;使用COMPACT存储器模式时再入函数的堆栈空间 PBPSTACK EQU 0 ; 使用COMPACT存储器模式再入函数时将其设置成1 PBPSTACKTOP WQU 0FFFFH+1 ;将堆栈顶设置为最高地址加1 ;;---------------------------------------------------- ;使用COMPACT存储器模式时,64KB X DA TA存储器空间的分页定义 ; ;以下用EQU指令定义PDA TA类型变量在XDA TA存储器空间的页地址 ;使用EQU指令定义PFAGE时必须与L51连接定位器PDA TA指令的控制参数一致 ; PPAGEENABLE EQU 0 ;使用PDA TA类型变量时将其设置成1 PPAGE EQU 0 ;定义页号 ; ;------------------------------------------------ NAME ? C_STARTUP ;模块名为? C_STARTUP ? C_51STARTUP SEGMENT CODE ;代码段 ? STACK SEGMENT IDA TA;堆栈段 RSEG ? STACK ;堆栈 DS 1 EXTRN COE(? C_START) ;程序开始地址

一步一步摸索在MDK下进行S3C2440的开发

第1步: 在MDK下建立一个最简单的基本S3C2440的点亮LED工程,启动代码采用MDK自带的。 编写代码控制TQ2400板子上的一个LED灯闪烁,结合TQ2440底板可找到LED连接在GPB5~GPB8。 具体代码如下: #include #define LED1 (1<<5) #define LED2 (1<<6) #define LED3 (1<<7) #define LED4 (1<<8) void Delay(void) { int i,j; for(i=0; i<1000; i++) { for(j=0; j<1000; j++); } } int main() { GPBCON = 0x15555; while(1) { GPBDAT &= ~LED1; //LED1闪一下 Delay(); GPBDAT |= LED1; Delay(); GPBDAT &= ~LED2; //LED2闪一下 Delay(); GPBDAT |= LED2; Delay();

GPBDAT &= ~LED3; //LED3闪一下 Delay(); GPBDAT |= LED3; Delay(); GPBDAT &= ~LED4; //LED4闪一下 Delay(); GPBDAT |= LED4; Delay(); } } 第2步: 对工程进行初步的配置。为避免工程文件目录中文件比较乱,要对工程的输出文件和连接文件各单独建立一个文件夹,让它们在各自文件夹内。 点击“Select Folder For Objects”,新建一个名为out的文件夹,然后双击打开并点击OK,这样所有的输出文件就会放在这个文件夹内。

mini2440使用uboot(详细)

mini2440使用uboot(详细) 文章出处:https://www.360docs.net/doc/f111532673.html,/swgshj/archive/2010/04/20/5502121.aspx 文章写于2010.4.17,总结了友善之臂的mini2440开发板使用自带uboot的具体方法,希望能对正在使用mini2440开发板,而且又想使用uboot引导系统的朋友们有所帮助。Google一下会发现网上类似的帖子不少,但是对mini2440开发板是哪一个版本都没有具体的说明,个人感觉mini2440开发板的版本是经常更新的,可能不同的版本的开发板在移植uboot时会稍有不同,因此这里我把自己使用的开发板的详细信息都罗列一下,希望网友少走弯路。 另外,要感谢illidan和Martin两位的文章: https://www.360docs.net/doc/f111532673.html,/2009/05/mini2440使用u-boot/ https://www.360docs.net/doc/f111532673.html,/bbs/viewthread.php?tid=14 使用的mini2440开发板的详细信息: kernel:linux-2.6.29-mini2440-20090708.tgz gcc:arm-linux-gcc-4.3.2.tgz uboot:bootloader.tgz(该压缩包内含有u-boot-1.1.6) roots:root_qtopia-64M.img 问题源于: (1)使用128M NAND Flash mini2440开发板的用户都知道,此时开发板附带的supervivi-64M和supervivi-128M都不再支持“空格”进入supervivi的menu菜单,而是改成了使用开发板上的k1~k6任何一个按键触发进入menu(而我需要空格键触发menu的方式); (2)开发板附带的supervivi不支持网络下载kernel和root(文件系统)。 具体的修改步骤如下: 注1:arm-linux-gcc的安装方法见《mini2440-um-20090817.pdf》第5.3小节。 注2:mini2440开发板附带的uboot源码已经是经过移植的,适用s3c2440处理器,我们只需要修改一些uboot参数即可。 一、修改uboot源码 (1)解压出源码 创建工作目录 mkdir /tmp/workspace cd /tmp/workspace 解压mini2440开发板光盘附带的uboot源码,bootloader.tgz同时包含了u-boot-1.1.6和vivi 的源码 tar -xvf bootloader.tgz cd u-boot-1.1.6 (2)修改u-boot-1.1.6/include/configs/open24x0.h文件 修改NAND FLASH MTD分区表: 56 /* 57 #define MTDPARTS_DEFAULT "mtdparts=nandflash0:2m@0(kernel)," \ 58 "8m(jffs2)," \

keil下的s3c2440启动代码分析

由于片面问题,所以可能会看起来不太美观,可以看附件中的内容。 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, curren t, */ ;/* end user licence from KEIL for a compatible version of KEIL softwar e */ ;/* development tools. Nothing else gives you the right to use this softwa re. */ ;/*****************************************************************************/ ;下面这些参数是与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) ;

电脑启动过程详解

电脑从按完开关加电开始直到进入到系统桌面的整个过程详解本文以Windows2000/xp和Windows Vista/7两个内核做讲解 电脑从加电到进桌面可以分为两大部分: 无论是Windows2000/XP还是Windows Vista/7,在硬件自检方面都是想同的,不同的是在系统加截。 硬件部分: 在讲解前,我们先来了解几个概念: BIOS:即“Basic Input/Output System”(基本输入输出系统),它是一组被“固化”在计算机主板上的一块 ROM 中直接关联硬件的程序,保存着计算机最重要的基本输入输出的程序、系统设置信息、开机后自检程序和系统自启动程序,其主要功能是为计算机提供最底层的、最直接的硬件设置和控制,它包括系统 BIOS(主板 BIOS).其它设备 BIOS(例如 IDE 控制器 BIOS、显卡 BIOS 等)其中系统 BIOS 占据了主导地位.计算机启动过程中各个 BIOS 的启动都是在它的控制下进行的。 CMOS:即“Complementary Metal-Oxide-Semiconductor”(互补金属氧化物半导体),它本是计算机系统内一种重要的芯片,保存了系统引导最基本的资料。 内存地址:我们知道,内存空间的最基本单位是位,8 位视为一个字节,即我们常用的单位 B,内存中的每一个字节都占有一个地址(地址是为了让 CPU 识别这些空间,是按照 16 进制表示的),而最早的 8086 处理器只能识别 1MB(2 的 20 次方 B)的空间,这 1MB 内存中低端(即最后面)的 640KB 就被称为基本内存,而剩下的内存(所有的)则是扩展内存。这 640KB 的空间分别由显存和各 BIOS 所得。 我们来看一下硬件部分的流程图:

嵌入式Linux之我行——S3C2440上Flash驱动实例开发讲解(to_be_continue)

嵌入式Linux之我行,主要讲述和总结了本人在学习嵌入式linux中的每个步骤。一为总结经验,二希望能给想入门嵌入式Linux的朋友提供方便。如有错误之处,谢请指正。 共享资源,欢迎转载:https://www.360docs.net/doc/f111532673.html, 一、Linux中Flash硬件知识 1.Flash用途和分类: 在嵌入式系统开发设计中,存储模块是不可缺少的重要部分,而 Flash是目前市场上主要的非易失闪存技术,他主要分为:Nor Flash和Nand Flash两种。那么他们有什么区别呢? 简单的讲:Nor Flash容量小,价格高,写速度慢但随机读速度快,所以较适合存储少量的程序代码,比如u-boot启动代码;而Nand Flash则容量大,价格低,写速度快但读速度 慢,所以他相当于PC上的硬盘用于存储大量的数据。Nor Flash与Nand Flash更详细区别如下表: 2.Flash在硬件设计中的应用: 以Mini2440开发板为例:该开发板上带有一块2M的Nor Flash和一块64M的Nand Flash。下面先看看他们是怎样被应用于嵌入式Linux的。Nor Flash和Nand Flash电路原理图分别如下:(由mini2440提供)

从原理图上可以看到,Nor Flash内部提供的是有类似于DRam之类的地址总线,可以直接与CPU相连,CPU可以直接通过地址总线对Nor Flash进行访问;而Nand Flash没有这类的总线,其内部只提供IO接口,因此只能通过IO接口发送命令和地址,对Nand Flash内部数据进行访问。这可以说是二者最大的区别了,也说明了二者读写速度不同的所在。因此,各有各的优点,Nor Flash访问快,Nand Flash简化了电路。注意:电路原理图中字母上面有一横杠的表示该引脚是低电平有效,没有的是默认的高电平。 二、Linux中Flash软件知识 1.Linux MTD子系统: 在Linux系统中,提供了MTD(内存技术设备)子系统来建立Flash针对Linux的统一、抽象的接口。MTD子系统将上层文件系统与底层 Flash硬件进行了隔离,使Flash驱动开发者无需再关心Flash作为字符设备或者块设备与Linux内核的接口。MTD将Linux系统 Flash设备驱动及接口分成了4个层次,如图所示,从上往下分别为:设备节点、MTD设备层、MTD原始设备层和Flash硬件驱动层。

GRUB2启动代码详解

GRUB2的介绍 目前Grub1已经停止开发了,不再增加新的功能,所有的开发都转移到Grub2上了,Grub 2 是新一代的Grub,它实现了一些Grub中所没有的功能:1.模块化设计 不同于Grub的单一内核结构,Grub 2 的功能分布在很多的小模块中,并且能在运行时动态装载和卸除。 2.支持多体系结构Grub 2可支持PC(i386), MAC(powerpc)等不同的体系结构,而且支持最新的EFI架构。 3.国际化的支持Grub 2 可以支持非英语的语言。 4.内存管理Grub 2 有真正的内存管理系统。 5.脚本语言Grub 2 可以支持脚本语言,例如条件,循环,变量,函数等。 当然,Grub 2正处在开发阶段,因此以上的某些功能可能现阶段还不是很完善。 如果你熟悉Grub2,应该可以看明白里面的内容。要注意的是: a、timeout, default等参数用变量来储存 b、菜单项由menuentry定义 c、第1个分区是(hd0,1)而不是(hd0,0) 理论的东西说多了大家估计也晕,举个简单的例子:在grub1中,要改变启动背景的时候只能选择支持640X480分辨率并且格式也只能是.xpm的图片,分辨率稍微大点的图就显示不出来了,但grub2不存在这个问题,它有更绚丽的菜单界面,grub2默认.png .tga .jpeg等很多种格式的图片都支持,而且支持的图片分辨率也更大。

GRUB2启动代码分析 # # DO NOT EDIT THIS FILE # # It is automatically generated by /usr/sbin/grub-mkconfig using templates # from /etc/grub.d and settings from /etc/default/grub # ### BEGIN /etc/grub.d/00_header ### if [ -s $prefix/grubenv ]; then #如果“$prefix/grubenv”目录不为空 load_env #从grubenv文件中加载环境变量 fi set default="0" #启动第1项# if [ ${prev_saved_entry} ]; then #如果prev_saved_entry的值不为空 set saved_entry=${prev_saved_entry} #将saved_entry的值设置成变量prev_saved_entry的值。 save_env saved_entry #将变量saved_entry保存到grubenv文件中。 set prev_saved_entry= #将prev_saved_entry的值设置为空 save_env prev_saved_entry #将prev_saved_entry保存到grubenv文件中 set boot_once=true #将boot_once的值设置为真(貌似是为了标志已经设置过启动的相关环境变量了)fi function savedefault {

启动代码txt

要是早看了下面的两篇文章,呵呵,学习进度应该能快很多吧,文章分享了,大家自己看啊。周立功lpc21xx/lpc22xx系列ARM7启动代码分析摘自搜狐博客技术为王博友 网上已经有人做了一个周立功lpc2000(ARM7TDMI)启动代码分析的文章, 我本来想做一个s3c2410(ARM920T)的启动代码分析的, 但是看来了一下2410的启动代码,发现有些东西还不是理解的很清楚, 我ARM9的经验比较少. 所以还是做一个ARM7的启动代码分析吧, 网上那一份相比,我这个主要关注startup.s文件.网上那个startup.s几乎是一笔带过的. 红色标记的是源码. SVC_STACK_LEGTH EQU 0 FIQ_STACK_LEGTH EQU 0 IRQ_STACK_LEGTH EQU 256 ABT_STACK_LEGTH EQU 0 UND_STACK_LEGTH EQU 0 NoInt EQU 0x80 USR32Mode EQU 0x10 SVC32Mode EQU 0x13 SYS32Mode EQU 0x1f IRQ32Mode EQU 0x12 FIQ32Mode EQU 0x11 上面几行代码,不用过多分析, 定义几个符号而已, 把EQU想像成C中的#define就可以了. 具体定义的数值,下面的代码用到我再解释. IMPORT __use_no_semihosting_swi 上面这一句的作用是在代码中禁用 semihosting 机制. 到底什么是semihostiong这里不多说, 网上有很多. 这里只说明Semihosting主要用来调试, 在release版本的代码中一般是要禁用的.

相关文档
最新文档