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

📄 bootloader.s

📁 NUCLEUS PLUS操作系统在STR710 arm上的移植代码
💻 S
📖 第 1 页 / 共 3 页
字号:
		MOV     a2,#TIMER_PRIORITY              ;//获得定时器高级中断服务(HISR)的优先级的编号
		LDR     a4,[pc,#HISR_Priority-.-8]
		STR     a2,[a4, #0]                     ;//保存优先级编号  
	
; 设置向量加载标志    
;   INT_Loaded_Flag =  0;                   ;//缺省为0
;
		MOV     a1,#1                           ;//加载所有的向量
		LDR		a2,=Loaded_Flag                 ;//建立加载标志的地址
		LDR		a2,[a2,#0]
		STR     a1,[a2,#0]                      ;//初始化加载标志
	
;为了以后堆栈状态的检查,所以我们需要将IRQ,FIQ,SYSTEM,SYSTEM TIMER HISR堆栈初始化成0xFE
        LDR     a2,System_Limit   			   	;//获得system stack limit变量地址           
        LDR     a1,[a2]                       	;//a1 = STACK_Segment
        MOV     a4,#0x0FE                      	;//利用此条以及下面7条指令设置 a4 = 0xFEFEFEFE
        STRB    a4,[a1, #0]
        STRB    a4,[a1, #1]
        STRB    a4,[a1, #2]
        STRB    a4,[a1, #3]
        LDR     a4,[a1],#4 				   ;//存储第一个字
      
FILL_STACK
        STR     a4,[a1],#4                    ;//保存一个字然后增加4
        CMP     a1,a3                         ;//是最后的地址吗?
        BLT     FILL_STACK                    ;//如果不是继续循环
	                                  
;/*-------------------------------------------------------------------------------------------------------
;**           Nucleus操作系统最主要的初始化函数——操作系统内核所有的部件通过该函数初始化           
;**           当系统初始化完成后,该函数调用应用程序初始化函数,当应用程序初始化函数完成后           
;**           调用TCT_Schedule开始进行任务调用.------------------即操作系统级的初始化函数.                  
;**-----------------------------------------------------------------------------------------------------*/
;调用操作系统内核服务函数INC_Initialize(first_available_memory) 
;a3中保存着操作系统内存池的起始地址
;
	MOV		a1,a3                           ;// Pass the first available memory
	B       INC_Initialize                  ;// to high-level initialization
;}                 
                 	
;/********************************************************************************************************
;** 函数名称: INT    INT_Vectors_Loaded(void)---返回向量是否加载的函数
;** 功能描述: 本函数返回一个标志来说明所有缺省的向量是否已经被加载,假如INT_Loaded_Flag的值为0,每个注册的LISR  
;**           同样使ISR shell 加载到实际的向量表  
;**       
;** 参    数: 无
;** 返 回 值 :INT_Loaded_Flag
;**
;** 被调用者: TCC_Register_LISR                   Register LISR for vector 
;** 
;** 作 者: 罗辉联
;** 日 期: 2006年5月30日
;**------------------------------------------------------------------------------------------------------
;** 修 改: 
;** 日 期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
;//INT    INT_Vectors_Loaded(void)
;//{
	EXPORT  INT_Vectors_Loaded
	
INT_Vectors_Loaded
     	 LDR	a1,=Loaded_Flag                ;//获得加载标志地址
         LDR	a1,[a1,#0]
         LDR    a1,[a1,#0]                     ;//加载当前值
         MOV    pc,lr                          ;//函数返回
;//}		                                    
		                                        
;/********************************************************************************************************
;** 函数名称: VOID  *INT_Setup_Vector(INT vector, VOID *new)
;** 功能描述: 此函数将新的向量值(中断服务程序首地址)赋给指定的向量,先前的向量值返回给主凋函数
;**
;** 参    数: vector--向量编号,  new---向量对应服务程序首地址  
;** 返 回 值 : old vector contents 
;**
;** 被调用者: TCC_Register_LISR          Register LISR for vector
;**           Application                应用程序可以调用该函数
;** 
;** 作 者: 罗辉联
;** 日 期: 2006年5月30日
;**------------------------------------------------------------------------------------------------------
;** 修 改: 
;** 日 期: 
;**------------------------------------------------------------------------------------------------------
;*******************************************************************************************************/
;//VOID  *INT_Setup_Vector(INT vector, VOID *new)
;//{
	EXPORT  INT_Setup_Vector
	
;//VOID    *old_vector;                       /* 旧的中断向量           */
;//VOID   **vector_table;                     /* 向量表指针             */
;//vector_table =  (VOID **) 0;               /* 计算实际向量表的首地址 */      
;//old_vector =  vector_table[vector];        /* 获得旧的中断向量       */        
;//vector_table[vector] =  new;               /* 设置新的中断向量       */       
;//return(old_vector);                        /* 返回旧的中断向量值     */
INT_Setup_Vector
		 MOV     a1,#0                        ;//这段代码根据实际需要确定本例返回一个NULL pointer
         MOV     pc,lr                        ;//程序返回
        
;//}

;/*********************************************************************************************************
;** 函数名称: VOID  *INT_Retrieve_Shell(INT vector)
;** 功能描述: This function retrieves the pointer to the shell interrupt service routine.
;**           The shell interrupt service routine calls the LISR dispatch routine.  
;**
;** 参    数: vector--向量编号 
;** 返 回 值: shell pointer -----返回指定向量中断服务程序地址(指针)
;**
;** 被调用者: TCC_Register_LISR          Register LISR for vector 
;** 
;** 作 者: 罗辉联
;** 日 期: 2006年5月30日
;**-------------------------------------------------------------------------------------------------------
;** 修 改: 
;** 日 期: 
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
;//VOID  *INT_Retrieve_Shell(INT vector)
;//{
	EXPORT  INT_Retrieve_Shell
;//return(INT_Vectors[vector]);
INT_Retrieve_Shell

		 MOV     a1,#0                         ;//这段代码根据实际需要确定本例返回一个NULL pointer
    
    	 MOV     pc,lr                         ;//程序返回
;//}	

;/*********************************************************************************************************
;** 函数名称: INT_EnableIRQ, INT_DisableIRQ
;** 功能描述: 允许/禁止 IRQ/FIQ
;** 
;** 参    数: 无
;**
;** 返 回 值: 无
;**         
;** 作   者: 罗辉联
;** 日   期: 2006年5月30日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/   
    EXPORT	INT_EnableIRQ
INT_EnableIRQ							 	   ;//允许FIQ、FIQ
         MRS     a1, CPSR                     ;//读取CPSR
         BIC     a1,a1,#MODE_MASK              ;//屏蔽所有中断位
         ORR     a1,a1,#IRQ_MODE         	   ;//屏蔽所有中断位
         MSR     CPSR_cxsf,a1                  ; IRQ mode

         MRS     a1, CPSR                ;//读取CPSR
         BIC     a1,a1,#LOCKOUT                ;//interrupt lockout value
         MSR     CPSR_cxsf,a1                       ;//Lockout interrupts

         BIC     a1,a1,#MODE_MASK              ;//屏蔽所有中断位
         ORR     a1,a1,#SVC_MODE         
         MSR     CPSR_cxsf,a1                       ;//Lockout interrupts
         
         MOV     pc,lr                         ;//程序返回
         

 	EXPORT	DisableIRQ					       ;//禁止FIQ、FIQ
DisableIRQ
         MRS     a1, CPSR                     ;//读取CPSR
         BIC     a1,a1,#MODE_MASK              ;//屏蔽所有中断位
         ORR     a1,a1,#IRQ_MODE               ;//retrieve desired mode
         MSR     CPSR_cxsf,a1                       ; IRQ mode

         MRS     a1, CPSR                ;//读取CPSR
         ORR     a1,a1,#LOCKOUT                ; //Build interrupt lockout value
         MSR     CPSR_cxsf,a1                       ;// Lockout interrupts

         BIC     a1,a1,#MODE_MASK              ;//屏蔽所有中断位
         ORR     a1,a1,#SVC_MODE         
         MSR     CPSR_cxsf,a1                  ;//Lockout interrupts
         
         MOV     pc,lr                         ;//程序返回



;/********************************************************************************************************
;** 数据段定义: NuData
;** 功能描述: 定义初始化标志以说明在初始化期间所有缺省的向量是否被加载
;**
;** 全局变量: INT_Loaded_Flag
;** 被调用者: Nucleus Plus 
;** 
;** 作 者: 罗辉联
;** 日 期: 2006年5月30日
;**-------------------------------------------------------------------------------------------------------
;** 修 改: 
;** 日 期: 
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/                        
         
     AREA   NuData  ,DATA
      
;INT    INT_Loaded_Flag;

	EXPORT  INT_Loaded_Flag
INT_Loaded_Flag
	DCD     &00000000   
	
;/* 分配堆栈空间 */
    AREA    ExceptionStacks, DATA, NOINIT, ALIGN=2
        
;	EXPORT	stack_segment
	EXPORT	exception_stack
        
;stack_segment       SPACE   SYS_INT_STACK_SIZE   * 4  			;//SYS,Exception堆栈空间
exception_stack     SPACE   EXCEPTION_STACK_SIZE * 4 
         
         
       LTORG

       END
;/*****************************************End of File********************************************/

⌨️ 快捷键说明

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