找到了一些当初学习嵌入式linux时的资料,现在共享出来。方便大家学习之用,无所谓原创,无非就是在前人的基础上,进行了系统化的分析和综合而已。不过,还是加入了不少个人学习的思路跟方法,我觉得这才是最重要的。
最近在学习嵌入式软件,现分享自己部分成果。平台:s3c2440 mcu
;=========================================
; NAME: 2440INIT.S
; DESC: C start up codes
; Configure memory, ISR ,stacks
;Initialize C-variables
;=========================================
;注意:axd调试时,可以看到 指令pc地址从0x30000000开始,这是因为ram的起始地址是0x30000000.
;并且如果从nand启动,则处理器自动把nand首部的4k字节,复制到ram中,然后pc跳到0x30000000,开始执行。
;此源文件通常包含一些宏定义和常量定义
;通用的《启动流程图》:
;入口->屏蔽所有中断,禁止看门狗->根据工作频率设置PLL寄存器->初始化存储控制相关寄存器->初始化各模式下的栈指针
;->设置缺省中断处理函数->将数据拷贝到RAM中,数据段清零->跳转到C语言main入口函数中
;GET伪指令用于将一个源文件包含到当前源文件中,并将被包含文件在当前位置进行汇编处理,类似于c的include指令
;GET INLCUDE伪指令不能 用来包含目标文件,INCBIN伪指令 可以包含目标文件,
;被INCBIN伪指令包含的文件, 不 进行汇编处理,该执行文件或数据直接放入当前文件,编译器从INCBIN后边开始继续处理
;区分GET,INCLUDE,INCBIN的用法和作用
GEToption.inc ;定义芯片相关配置
GETmemcfg.inc ;定义存储器配置
GET2440addr.inc ;定义寄存器符号
;REFRESH寄存器[22]bit :SDRAM刷新模式 0- auto refresh; 1 - self refresh
;用于节电模式中,SDRAM自动刷新
BIT_SELFREFRESH EQU (1<<22)
;Pre-defined constants
;模式预定义常量,给cpsr【4-0】赋值,改变运行模式
USERMODE EQU 0x10
FIQMODE EQU 0x11
IRQMODE EQU 0x12
SVCMODE EQU 0x13
ABORTMODE EQU 0x17
UNDEFMODE EQU 0x1b
MODEMASK EQU 0x1f ;模式屏蔽位
NOINT EQU 0xc0 ;1100 0000,中断屏蔽掩码
;The location of stacks
;0x30000000 = 768M
;定义各模式下的堆栈常量,是一个递减栈,后边标上了各个栈的大小
UserStack EQU (_STACK_BASEADDRESS-0x3800) ; ~ 0x33ff4800 大小不定,跟堆大小相对应。毕竟是用户态栈
SVCStack EQU (_STACK_BASEADDRESS-0x2800) ; ~ 0x33ff5800 4M
UndefStack EQU (_STACK_BASEADDRESS-0x2400) ; ~ 0x33ff5c00 1M
AbortStack EQU (_STACK_BASEADDRESS-0x2000) ; ~ 0x33ff6000 1M
IRQStack EQU (_STACK_BASEADDRESS-0x1000) ; ~ 0x33ff7000 4M
FIQStack EQU (_STACK_BASEADDRESS-0x0) ; ~ 0x33ff8000 4M
;处理器分为16位 32位两种工作状态 程序的编译器也是分16位和32两种编译方式 下面程序根据处理器工作状态确定编译器编译方式
;code16伪指令指示汇编编译器后面的指令为16位的thumb指令
;code32伪指令指示汇编编译器后面的指令为32位的arm指令
;Arm上电时处于ARM状态,故无论指令为ARM集或Thumb集,都先强制成ARM集,待init.s初始化完成后
;再根据用户的编译配置转换成相应的指令模式。为此,定义变量THUMBCODE作为指示,跳转到main之前
;根据其值切换指令模式
;Check if tasm.exe(armasm -16 ...@ADS 1.0)is used.
;检测工作模式,根据CONFIG的数值,确定工作模式
;{CONFIG}应该来自于ADS环境,在本环境中设置是进入时在ARM环境下,没有设置ARM/THUMB混合环境
;关于是否设置混合编程,在环境设置选项里的ARM Assembler 选项下,由ATPCS -> ARM/Thumb interworking选项负责
;IF ELSE ENDIF指令
GBLL THUMBCODE
[{CONFIG} = 16
THUMBCODE SETL {TRUE} ;如果设置了config,则允许thumb指令,但THUMBCODE为真并不表明以下就是thumb指令,只是允许