原创 LPC2114启动代码分析

2008-3-9 21:53 3876 14 19 分类: MCU/ 嵌入式

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 


    启动代码是芯片复位后进入C语言的main()函数前执行的一段代码,主要为运行C语言程序提供基本运行环境。启动代码可划分为四个文件:startup.sstack.sheap.starget.c。其中startup.s包含异常向量表和系统初始化代码,stack.sheap.s保存C语言使用的堆和栈的开始位置,target.c包括异常处理程序和目标板特殊的代码。


 


1、异常向量表(代码位于startup.s中,无需修改)


 


   异常是有内部或外部源产生的,以引起处理器处理的一个事件,异常出现后,CPU强制从异常类型对应的固定存储地址开始执行程序。这个固定的地址称为异常向量。如当IRQ中断产生后,CPU强制跳转到0x00000018处执行代码,我们要做的就是在这个代码地址处编写相应的指令,让它顺利执行IRQ中断程序.通常我们会在这里放置一条转移指令,因为0x00000018只给你一个字的编程空间.


异常向量表代码如下:


Reset
                      LDR     PC, ResetAddr
                    LDR     PC, UndefinedAddr
                    LDR     PC, SWI_Addr
                    LDR     PC, PrefetchAddr
                    LDR     PC, DataAbortAddr
                    DCD     0xb<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />9205f80
                    LDR     PC, [PC, #-0xff0]
                    LDR     PC, FIQ_Addr


 


ResetAddr           DCD     ResetInit
UndefinedAddr     DCD     Undefined
SWI_Addr           DCD     SoftwareInterrupt
PrefetchAddr       DCD     PrefetchAbort
DataAbortAddr    DCD     DataAbort
Nouse                DCD      0
IRQ_Addr            DCD     0
FIQ_Addr            DCD     FIQ_Handler


 


2、系统初始化代码(代码位于startup.s中,无需修改)


 


ResetInit
                BL      InitStack                ;
初始化堆栈     


            BL      TargetResetInit         ;目标板基本初始化          


              B       __main               ;跳转到c语言入口


 


当系统复位后,程序跳转到0x00000000处执行指令,那么就执行  LDR     PC, ResetAddr,及执行ResetInit地址处的代码,这里放置了BL     InitStack指令,负责初始化各种模式的堆栈,接着执行BL      TargetResetInit ,完成目标板基本初始化,最后跳转到ADS提供的启动代码__main,它初始化库并最终引导CPU进入main函数.


 


3、初始化CPU堆栈(代码位于startup.s中,一般不需要修改)


 


InitStack   
                MOV     R0, LR


;设置管理模式堆栈
                MSR     CPSR_c, #0xd3  
                LDR     SP, StackSvc 


;设置中断模式堆栈
        MSR     CPSR_c, #0xd2
        LDR     SP, StackIrq


;设置快速中断模式堆栈
                MSR     CPSR_c, #0xd1
                LDR     SP, StackFiq


;设置中止模式堆栈
                MSR     CPSR_c, #0xd7
                LDR     SP, StackAbt


;设置未定义模式堆栈
        MSR     CPSR_c, #0xdb
        LDR     SP, StackUnd


;设置系统模式堆栈
        MSR     CPSR_c, #0xdf
        LDR     SP, =StackUsr



MOV     PC, R0



StackSvc           DCD     SvcStackSpace + (SVC_STACK_LEGTH - 1)* 4
StackIrq           DCD     IrqStackSpace + (IRQ_STACK_LEGTH - 1)* 4
StackFiq           DCD     FiqStackSpace + (FIQ_STACK_LEGTH - 1)* 4
StackAbt           DCD     AbtStackSpace + (ABT_STACK_LEGTH - 1)* 4
StackUnd           DCD     UndtStackSpace + (UND_STACK_LEGTH - 1)* 4


 


AREA    MyStacks, DATA, NOINIT, ALIGN="2"
SvcStackSpace      SPACE   SVC_STACK_LEGTH * 4  ;
管理模式堆栈空间
IrqStackSpace      SPACE   IRQ_STACK_LEGTH * 4  ;
中断模式堆栈空间
FiqStackSpace      SPACE   FIQ_STACK_LEGTH * 4  ;
快速中断模式堆栈空间
AbtStackSpace      SPACE   ABT_STACK_LEGTH * 4 ;
中止义模式堆栈空间
UndtStackSpace     SPACE   UND_STACK_LEGTH * 4  ;
未定义模式堆栈


 


    因为程序需要切换模式,而且程序退出时CPU的模式已经不再是管理模式而是系统模式,LR已经不再保存返回程序地址,所以程序首先把返回地址保持到R0中,同时使用R0返回。然后程序把处理器模式转化为管理模式,并设置管理模式的堆栈指针。其中变量StackSvc保存着管理模式的堆栈指针的初始值,SvcStackSpace是分配给管理模式的堆栈空间的开始地址,而SVC_STACK_LEGTH是用户定义的常量,用于设置管理模式的堆栈空间的大小,其代码在文件startup.s的开始处,用户可以根据需要改变它。程序使用同样的方法对其他模式进行设置。


 


4、系统基本的初始化工作(代码位于target.c中,用户根据需要修改)


 

    为了使系统能够工作,必须在进入main()函数前进行一些基本的初始化工作,如地址重映射,PLL时钟初始化,存储器加速模块初始化,VIC中断初始化等,这些工作由函数TargetResetInit()完成。
PARTNER CONTENT

文章评论5条评论)

登录后参与讨论

用户35824 2008-3-26 10:08

正在学习中,谢谢

用户944075 2008-3-24 21:42

呵呵 这倒没注意

用户17735 2008-3-24 17:39

有没有尝试过,将代码COPY到RAM里面再运行?有兴趣的话可以共同探讨一下.2pia@163.com

用户944075 2008-3-10 19:26

对 就是周立功的

用户1370329 2008-3-10 13:17

周立功的??
相关推荐阅读
用户944075 2010-10-31 20:35
【大学电子类专业】【经典书籍和课本】【推荐下载】【地址汇总】
一级学科 电子科学与技术(0809) 主要包括有以下几个二级学科:物理电子学                     080901电路与系统                     080902微电子...
用户944075 2010-10-31 20:31
【初学者必知必会】【电子技术:数电 模电 单片机】【基础概念和小知识点】详解
电阻相关:; Z- D" M( X2 V, X9 n1、上拉电阻和下拉电阻的总结~~权威版倾情奉献 http://www.dzcny.com/thread-1138-1-1.html2、上拉电阻、下拉...
用户944075 2010-03-23 22:30
【电子菜鸟园】【电子类软件】【图文安装原创教程】下载地址汇总
【原创】Altium.Designer 6.6(Protel DXP)图文安装教程:http://www.dzcny.com/thread-525-1-1.html【原创】NI的Multisim和Ul...
用户944075 2010-03-23 22:26
欢迎访问电子菜鸟论坛
最近跟朋友们一起弄了个电子技术论坛 名叫 电子菜鸟园 在里面会共享电子方面的一些资料 我们在工作中的一些技术交流希望大家多多支持 !论坛地址   http://www.dzcny.com/      ...
用户944075 2010-03-23 22:25
电子菜鸟园免费赠送USB转串口PCB活动开始了!
电子菜鸟园免费赠送USB转串口PCB活动开始了!<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office"...
用户944075 2010-03-23 22:24
【电子菜鸟园】【日本欧姆社电子学入门丛书】【下载地址】【汇总】
电子菜鸟园收藏整理的OHM日本欧姆社的电子学入门系列丛书,特别分享给大家!欢迎访问下载。《图解电子电路》http://www.dzcny.com/thread-595-1-1.html《图解运算放大器...
EE直播间
更多
我要评论
5
14
关闭 站长推荐上一条 /1 下一条