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

📄 os_cpu_a.s.bak

📁 基于Verilog HDL的电梯系统设计
💻 BAK
字号:
	AREA  UCOS_ARM, CODE, READONLY

;void OSStartHighRdy(void)
	IMPORT  OSTaskSwHook
    IMPORT  OSRunning
    IMPORT  OSTCBHighRdy
    EXPORT  OSStartHighRdy

OSStartHighRdy
	;调用用户自定义的OSTaskSwHook
	msr cpsr_c,#0x1f
	bl OSTaskSwHook 
	; OSRunning = TRUE
    ldr r4,=OSRunning            
    mov r5,#1
    strb r5,[r4]
	;得到将要恢复运行任务的堆栈指针
    ldr r4,=OSTCBHighRdy
    ldr r4,[r4]                 
    ldr sp,[r4]
	;从新任务堆栈中恢复处理器的所有寄存器
    ldmfd sp!,{r4}
    msr cpsr_cxsf,r4
    ldmfd sp!,{r0-r12,lr,pc}
    ;ldmfd sp!,{lr}
    ;ldmfd sp!,{pc}

;void OSCtxSw(void)
	IMPORT  OSTCBCur
	IMPORT  OSTaskSwHook
    IMPORT  OSTCBHighRdy
    IMPORT  OSPrioCur
    IMPORT  OSPrioHighRdy
    EXPORT  OSCtxSw

OSCtxSw
	;保存所有处理器寄存器
	stmfd sp!,{lr}
	stmfd sp!,{r0-r12,lr}
	mrs r4,cpsr
	stmfd sp!,{r4}
	;在当前任务的任务控制块中保存当前任务的堆栈指针
	ldr r4,=OSTCBCur
	ldr r5,[r4]
	str sp,[r5]
	;OSTaskSwGook()
	bl OSTaskSwHook
	;OSTCBCur = OSTCBHighRdy
	ldr r6,=OSTCBHighRdy
	ldr r6,[r6]
	str r6,[r4]	
	;OSPrioCur = OSPrioHighRdy
	ldr r7,=OSPrioCur
	ldr r8,=OSPrioHighRdy
	ldrb r8,[r8] ;ldr r8,[r8] 
	strb r8,[r7] ;str r8,[r7] will make next instruciton to produce "Data Abort"
	;得到将来重新开始运行的任务的堆栈指针
	ldr sp,[r6]
	;从新任务的任务堆栈中恢复处理器所有的寄存器的值, 执行中断返回指令
    ldmfd sp!,{r4}
    msr cpsr_cxsf,r4
    ldmfd sp!,{r0-r12,pc,lr}
  

;void OSTickISR(void)
	IMPORT OSIntEnter
	IMPORT OSIntNesting
	IMPORT OSTCBCur
	IMPORT OSTimeTick
	IMPORT OSIntExit
	IMPORT TRACE_ARM
	EXPORT OSTickISR

SRCPND       EQU  0x4a000000    ;Interrupt request status  
INTPND        EQU  0x4a000010    ;Interrupt request status
BIT_TIMER4  EQU  (0x1<<14)

OSTickISR
	;保存所有处理器寄存器
	sub lr,lr,#4
	stmfd sp!,{r0-r3,lr} ; 
	mrs r0,spsr
	stmfd sp!,{r0}
	
	;调用OSIntEnter()或者直接给OSIntNesting加1
	 bl OSIntEnter
	;if(1 == OSIntNesting)
	;     OSTCBCur->OSTCBStkPtr = Stack Pointer ; the "sp" is not SYS(or task) sp, it is IRQ sp
	
	;给产生中断的设备清中断
	;rSRCPND = BIT_TIMER4;       //Clear pending bit
	;rINTPND = BIT_TIMER4;
	ldr r0,=SRCPND
	ldr r1,=BIT_TIMER4
	str r1,[r0]
	ldr r2,=INTPND
	str r1,[r2]
	
	;重新允许中断(可选) 
        
	;OSTimeTick()
	bl OSTimeTick
	;OSIntExit()
	bl OSIntExit
	;恢复处理器寄存器, 执行中断返回指令
	ldmfd sp!,{r0}
	msr spsr_cxsf,r0
	ldmfd sp!,{r0-r3,pc}^ 

;void OSIntCtxSw(void) 
	IMPORT  OSTCBCur
    IMPORT  OSTaskSwHook
    IMPORT  OSTCBHighRdy
    IMPORT  OSPrioCur
    IMPORT  OSPrioHighRdy
    EXPORT  OSIntCtxSw

OSIntCtxSw
	msr cpsr_c,#0x9f ;IRQ -> SYS
	stmfd sp,{lr} ;will be replace by task's pc later 
	stmfd sp,{r4-r12,lr}
	msr cpsr_c,#0x92 ;SYS -> IRQ, to restore spsr,r0-r3,lr
	ldmfd sp,{r4-r9}
	msr cpsr_c,#0x9f
	stmfd sp,{r4-r8}
	str r9,[sp,#60] ; pc's position is sp+15*4

	;在当前任务的任务控制块中保存当前任务的堆栈指针
	ldr r0,=OSTCBCur
	ldr r1,[r0]
	str sp,[r1]

	;OSTaskSwGook()
	bl OSTaskSwHook
	;OSTCBCur = OSTCBHighRdy
	ldr r6,=OSTCBHighRdy
	ldr r6,[r6]
	str r6,[r4]	
	;OSPrioCur = OSPrioHighRdy
	ldr r7,=OSPrioCur
	ldr r8,=OSPrioHighRdy
	ldrb r8,[r8] ;ldr r8,[r8] 
	strb r8,[r7] ;str r8,[r7] will make next instruciton to produce "Data Abort"
	;得到将来重新开始运行的任务的堆栈指针
	ldr sp,[r6]
	;从新任务的任务堆栈中恢复处理器所有的寄存器的值
    ldmfd sp!,{r4}
    msr spsr_cxsf,r4
    ldmfd sp!,{r0-r12,lr,pc}


	EXPORT  OSCPUSaveSR
OSCPUSaveSR
	
    mrs r0,CPSR
    orr r1,r0,#0xc0
    msr CPSR_c,r1
    mov pc,lr


	EXPORT  OSCPURestoreSR
OSCPURestoreSR

    msr CPSR_c,r0
    mov pc,lr
    
	EXPORT SimulatorTimer4
SimulatorTimer4
	mrs r12,cpsr
	add r11,lr,#4
	msr cpsr_csxf,#0x92
	msr spsr_cxsf,r12
	mov lr,r11
	b OSTickISR
	

        END

⌨️ 快捷键说明

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