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

📄 startup.s

📁 ucos 在smartarm2200上的移植
💻 S
字号:
;/****************************************Copyright (c)**************************************************
;**                                         SDT
;**                                       TeTong1
;**
;**--------------File Info-------------------------------------------------------------------------------
;** File name: 			Startup.s
;** Last modified Date: 2009/03/30
;** Last Version: 		1.0
;** Descriptions: 		The start up codes for LPC2200, including the initializing codes for the entry point of exceptions and the stacks of user tasks.
;**				        Every project should have a independent copy of this file for related modifications
;**------------------------------------------------------------------------------------------------------
;** Created by: 		ZengFan
;** Created date:   	2009/03/30
;** Version:			1.0
;** Descriptions: 		Startup启动文件,设置异常向量表,初始化各种模式的堆栈,初始化外部总线控制器,参考了周立功的Startup.S文件 
;**
;**------------------------------------------------------------------------------------------------------
;** Modified by: 		
;** Modified date:
;** Version:	
;** Descriptions: 
;**
;********************************************************************************************************/

;定义堆栈的大小 /ZF
FIQ_STACK_LEGTH         EQU         16
IRQ_STACK_LEGTH         EQU         256             ;every layer need 9 bytes stack , permit 8 layer .每层嵌套需要9个字堆栈,允许8层嵌套
ABT_STACK_LEGTH         EQU         16
UND_STACK_LEGTH         EQU         16

NoIRQ                   EQU         0x80
NoFIQ                   EQU         0x40
NoInt                   EQU         0xC0

USR32Mode               EQU         0x10
SVC32Mode               EQU         0x13
SYS32Mode               EQU         0x1f
IRQ32Mode               EQU         0x12
FIQ32Mode               EQU         0x11

;注意,下面只是定义一个地址,由于这里没有包含LPC2214的头文件,所以这里进行单独的定义,仅在该文件使用 /ZF

PINSEL2                 EQU         0xE002C014         ;管脚功能选择寄存器2
BCFG0                   EQU         0xFFE00000         ;存储器组0配置寄存器
BCFG1                   EQU         0xFFE00004         ;存储器组1配置寄存器
BCFG2                   EQU         0xFFE00008         ;存储器组2配置寄存器
BCFG3                   EQU         0xFFE0000C         ;存储器组3配置寄存器

      
;引入的外部标号在这声明 /ZF
    IMPORT  OS_CPU_ARM_ExceptUndefInstrHndlr
    IMPORT  OS_CPU_ARM_ExceptSwiHndlr
    IMPORT  OS_CPU_ARM_ExceptPrefetchAbortHndlr
    IMPORT  OS_CPU_ARM_ExceptDataAbortHndlr
    IMPORT  OS_CPU_ARM_ExceptIrqHndlr
    IMPORT  OS_CPU_ARM_ExceptFiqHndlr
     
    IMPORT  __main                          ;The entry point to the main function C语言主程序入口 
    IMPORT  TargetResetInit                 ;initialize the target board 目标板基本初始化
       
;给外部使用的标号在这声明
	EXPORT  bottom_of_heap
    EXPORT  bottom_of_Stacks
    EXPORT  top_of_heap
    EXPORT  StackUsr
    
    EXPORT  Reset
    EXPORT  __user_initial_stackheap



;/********************************************************************************************************/
;/**                                            以下是代码段											**/
;/**																									**/
;/********************************************************************************************************/
    CODE32

    AREA    vectors,CODE,READONLY
        ENTRY
Reset
        LDR     PC, ResetAddr
        LDR     PC, UndefinedAddr
        LDR     PC, SWI_Addr
        LDR     PC, PrefetchAddr
        LDR     PC, DataAbortAddr
        DCD     0xb8a06f58                 ; 这个值其实不用计算,如果不对的话在调试的时候会有错误提示,然后
                                           ; 询问是否对0x00000014处的值进行修改,选择"确定",然后在Startup
                                           ; 的调试文件里面插入汇编语句,再查看该处的值就可以了 /ZF 
        LDR     PC, IRQ_Addr
        LDR     PC, FIQ_Addr

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

;未定义指令
Undefined
        B       OS_CPU_ARM_ExceptUndefInstrHndlr
        
;软中断指令
SwiHand
        B       OS_CPU_ARM_ExceptSwiHndlr
        
;取指令中止
PrefetchAbort
        B       OS_CPU_ARM_ExceptPrefetchAbortHndlr
        
;取数据中止
DataAbort
        B       OS_CPU_ARM_ExceptDataAbortHndlr
        
;普通中断
IRQ_Handler
        B       OS_CPU_ARM_ExceptIrqHndlr
        
;快速中断
FIQ_Handler
        B       OS_CPU_ARM_ExceptFiqHndlr           ;添加  /ZF


;/*********************************************************************************************************
;** Function name:			InitStack
;**
;** Descriptions:			RESET  复位入口,复位后第一个执行的函数
;**
;** input parameters:		None
;** Returned value:			None
;**         
;** Used global variables:	None
;** Calling modules:		None
;**
;** Created by:				ZengFan
;** Created Date:		    2009/03/26
;********************************************************************************************************/

ResetInit

;初始化外部总线控制器,根据目标板决定配置

        LDR     R0, =PINSEL2
    IF :DEF: EN_CRP                                ; 该指令相当与c语言中的 #ifdef /ZF	           
        LDR     R1, =0x0f814910                    ; 当程序中定义了 EN_CRP ,那么CrpData就会对代码进行保护,
    ELSE                                           ; 被保护后的是不允许调试的,故把该管脚作为一个普通I/O口使用
        LDR     R1, =0x0f814914                    ; 详细内容参考用户手册(中文版)67页
    ENDIF
        STR     R1, [R0]

        LDR     R0, =BCFG0
        LDR     R1, =0x1000ffef
        STR     R1, [R0]

        LDR     R0, =BCFG1
        LDR     R1, =0x1000ffef
        STR     R1, [R0]

;        LDR     R0, =BCFG2                        ; 在该开发板中,BCFG2/BCFG3管辖的地址没有被使用,所以无需配置 /ZF
;        LDR     R1, =0x2000ffef
;        STR     R1, [R0]

;        LDR     R0, =BCFG3
;        LDR     R1, =0x2000ffef
;        STR     R1, [R0]
        
        BL      InitStack               ; Initialize the stack 初始化堆栈
        BL      TargetResetInit         ; Initialize the target board 目标板基本初始化
                                        ; Jump to the entry point of C program 跳转到c语言入口
        B       __main

                         
;/*********************************************************************************************************
;** Function name:			InitStack
;**
;** Descriptions:			stack initializtion
;**
;** Input parameters:		None
;** Returned value:			None
;**         
;** Used global variables:	None
;** Calling modules:			None
;**
;** Created by:				ZengFan
;** Created Date:		    2009/03/26
;********************************************************************************************************/
        
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


InitStack    
        MOV     R0, LR
                                             
        MSR     CPSR_c, #0xd2                ;Build the SVC stack
        LDR     SP, StackIrq
	
        MSR     CPSR_c, #0xd1                ;Build the FIQ stack
        LDR     SP, StackFiq

        MSR     CPSR_c, #0xd7                ;Build the DATAABORT stack
        LDR     SP, StackAbt

        MSR     CPSR_c, #0xdb                ;Build the UDF stack
        LDR     SP, StackUnd

        MSR     CPSR_c, #0xdf                ;Build the SYS stack
        LDR     SP, =StackUsr

        MOV     PC, R0

;/*********************************************************************************************************
;** Function name : 	    __user_initial_stackheap
;** Descriptions : 	        Initial the function library stacks and heaps, can not deleted!   库函数初始化堆和栈,不能删除
;** input parameters :   	reference by function library 参考库函数手册
;** Returned value   	:  	reference by function library 参考库函数手册
;** Used global variables : None 无
;** Calling modules : 	    None 无
;** 
;** Created by : 	        Chenmingji(周立功2200系列开发板源程序)
;** Created Date : 	        2004/09
;**-------------------------------------------------------------------------------------------------------
;** Modified by 	
;** Modified date 	
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
__user_initial_stackheap    
    LDR   r0,=bottom_of_heap		
;    LDR   r1,=StackUsr			
    LDR   r2,=top_of_heap		
    LDR   r3,=bottom_of_Stacks		
    MOV   pc,lr				


;/*********************************************************************************************************
;** unction name : 	        CrpData
;** Descriptions : 	        encrypt the chip      该代码是周立功文件中本来就有的,具体的用途不清楚 /zf
;** input parameters :   	None 无
;** Returned value :  	    None 无
;** Used global variables : None 无
;** Calling modules : 	    None 无
;** 
;** Created by 	:  	        Chenmingji(周立功2200系列开发板源程序)	 
;** Created Date : 	        2004/09
;**-------------------------------------------------------------------------------------------------------
;** Modified by : 
;** Modified date : 
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
    IF :DEF: EN_CRP                             ; 该指令相当与c语言中的 #ifdef /ZF	
        IF  . >= 0x1fc
        INFO    1,"\nThe data at 0x000001fc must be 0x87654321.\nPlease delete some source before this line."
        ENDIF
CrpData
    WHILE . < 0x1fc
    NOP
    WEND
CrpData1
    DCD     0x87654321          ;/*When the Data is 为0x87654321,user code be protected. 当此数为0x87654321时,用户程序被保护 */

    ENDIF
    

 
;/*********************************************************************************************************/
;                                         /* 分配堆栈空间 */
; SPACE 指令是分配一段内存空间,其前面的段名就是一个指向刚分配内存空间的开始位置的指针
;
; 下面的这些代码要和分散加载描述文件联合起来才容易看明白,在这些代码中一共声明了5个数据段,在这里其实并没有
; 定义这些段的其实地址,它们地址的分配是在分散加载描述文件里面定义的
;/*********************************************************************************************************/

        AREA    MyStacks, DATA, NOINIT, ALIGN=2
IrqStackSpace      SPACE   IRQ_STACK_LEGTH * 4  ;Stack spaces for Interrupt ReQuest Mode      中断模式堆栈空间
FiqStackSpace      SPACE   FIQ_STACK_LEGTH * 4  ;Stack spaces for Fast Interrupt reQuest Mode 快速中断模式堆栈空间
AbtStackSpace      SPACE   ABT_STACK_LEGTH * 4  ;Stack spaces for Suspend Mode                中止义模式堆栈空间
UndtStackSpace     SPACE   UND_STACK_LEGTH * 4  ;Stack spaces for Undefined                   Mode 未定义模式堆栈

        AREA    Heap, DATA, NOINIT              ;声明一个数据段,段名为Heap
bottom_of_heap    SPACE   1                     ;分配一个字节空间

        AREA    StackBottom, DATA, NOINIT       ;
bottom_of_Stacks    SPACE   1

        AREA    HeapTop, DATA, NOINIT           ;
top_of_heap

        AREA    Stacks, DATA, NOINIT            ;
StackUsr

    
  END

⌨️ 快捷键说明

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