📄 bootloader.s
字号:
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 + -