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

📄 os_cpu_a.s

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

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

OSStartHighRdy
	;//switch to SVC mode with IRQ & FIQ disable
	msr cpsr_c,#0xD3
	;//call user defined task switch hook
	bl OSTaskSwHook 
	; OSRunning = TRUE
	ldr r4,=OSRunning            
	mov r5,#1
	strb r5,[r4]
	;//get higest priority task TCB address
	ldr r4,=OSTCBHighRdy
	;//get stack pointer
	ldr r4,[r4]
	;//switch to the new stack
	ldr sp,[r4]
	;从新任务堆栈中恢复处理器的所有寄存器
	ldmfd sp!,{r4}
	msr spsr_cxsf,r4
	ldmfd sp!,{r0-r12,lr,pc}^

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

OSCtxSw
	;//save current task's context
	stmfd sp!,{lr}
	stmfd sp!,{r0-r12,lr}
	mrs r4,cpsr
	stmfd sp!,{r4}
	;//OSTCBCur->OSTCBStkPtr = sp;
	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 spsr_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
	;//push working registers onto IRQ stack
	stmfd sp!,{r1-r3}
	;//save IRQ stack pointer
	mov r1,sp
	;//adjust IRQ stack pointer
	add sp,sp,#12
	;//adjust pc  for return address to task
	sub r2,lr,#4
	;//copy spsr
	mrs r3,spsr
	;//change to SVC mode with IRQ & FIQ disable
	msr cpsr_c,#0xD3
	;//push task's return pc
	stmfd sp!,{r2} 
	;//push task's lr
	stmfd sp!,{lr}
	;//push task's r12-r4
	stmfd sp!,{r4-r12}
	;//move task's r1-r3 from IRQ stack to SVC stack
	ldmfd r1!,{r4-r6}
	stmfd sp!,{r4-r6}
	;//push task's r0 onto task's stack
	stmfd sp!,{r0}
	;//push task's cpsr (IRQ's spsr)
	stmfd sp!,{r3}
	
	;//调用OSIntEnter()或者直接给OSIntNesting加1
	 bl OSIntEnter
	;//if(1 == OSIntNesting)
	;//     OSTCBCur->OSTCBStkPtr = Stack Pointer ; the "sp" is not SYS(or task) sp, it is IRQ sp
	ldr r0,=OSIntNesting
	ldrb r1,[r0]
	cmp r1,#1
	bne %F0 
	ldr r4,=OSTCBCur
	ldr r5,[r4]
	str sp,[r5]
0
	;//给产生中断的设备清中断
	;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!,{r4}
	msr spsr_cxsf,r4
	ldmfd sp!,{r0-r12,lr,pc}^ 

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

OSIntCtxSw
	;//OSTaskSwGook()
	bl OSTaskSwHook
	;//OSTCBCur = OSTCBHighRdy
	ldr r4,=OSTCBCur
	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"
	;//sp = OSTCBHighRdy->OSTCBStkPtr
	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

        END

⌨️ 快捷键说明

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