欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > uc/os-II 原理及应用(八) 系统裁减以及移植到51单片机-下

uc/os-II 原理及应用(八) 系统裁减以及移植到51单片机-下

2025/11/17 7:44:32 来源:https://blog.csdn.net/weixin_43868793/article/details/145205991  浏览:    关键词:uc/os-II 原理及应用(八) 系统裁减以及移植到51单片机-下

现在说明几个重要的点,

  1. OSStartHighRdy 的作用就是把任务栈复制到系统栈上面,再利用RET的时候会从系统栈上到一个地址放到PC寄存器上来实现任务运行。
  2. OSCtxSw是任务切换,把系统栈全部备份到当前任务栈映射上,然后改OSTCBCur,调用OSStartHighRdy跳到新任务上来。
  3. OSIntCtxSw是在中断函数中来任务切换的
  4. 需要明确知道系统栈SP的初始值,也可以自己定义,参考C51定义SP初值
  5. OSIntCtxSw要明确清晰的知道系统栈中哪些内容需要丢弃。
  6. 要明确知道系统栈是如何工作的,像51单片机的栈是增长式的,压栈时是先加1,再存内容。出栈时是先取内容,再减1。
  7. 要明确知道51单片机call时,会先将下个执行的地址的低8位先压栈,高8位后压栈。

; void OSStartHighRdy(void)RSEG  ?PR?OSStartHighRdy?OS_CPU_A
OSStartHighRdy: clr EAmov DPTR, #OSTCBCur	; DPTR = &OSTCBCur;;  DPTR = OSTCBCurmovx A,@DPTR	    mov R0,AINC DPTRmovx A,@DPTRmov R1,AINC DPTRmovx A, @DPTRmov R2,Amov DPH, R1mov DPL, R2;;  OSTCBCur->OSTCBStkPtrmovx A,@DPTRmov R0,AINC DPTRmovx A, @DPTRmov R1,AINC DPTRmovx A, @DPTRmov R2,A;;  DPTR = OSTCBCur->OSTCBStkPtrmov DPH,R1mov DPL,R2 ;;  在这里任务栈第一个数据是栈长度movx A,@DPTRmov R7,A    ;  R7 = DPTR[0] = lenINC DPTR
taskstk_copyto_sysstk:    ; DPTR:taskptr,  R7:len	movx A,@DPTRpush ACCINC DPTRDJNZ R7, taskstk_copyto_sysstk; #if OS_TASK_SW_HOOK_EN > 0u
; 	OSTaskSwHook();  
; #endif;; 	OSRunning = OS_TRUE;MOV  	DPTR,#OSRunningMOV  	A,#01HMOVX 	@DPTR,A?C0003:popallSETB EARETI  	
; END OF OSStartHighRdy

; void OSIntCtxSw(void)RSEG  ?PR?OSIntCtxSw?OS_CPU_A
OSIntCtxSw:mov A,SPclr Csubb A,#17mov SP,ALJMP 	OSCtxSw
; END OF OSIntCtxSw

这里丢弃了栈后面的17个数据,其中栈顶两是调用OSIntCtxSw产生,再前面两个是调用OSIntExit产生,
再前面13个是进入tmr0_func时pushall保护现场产生。


; void OSCtxSw(void)RSEG  ?PR?OSCtxSw?OS_CPU_A
OSCtxSw:pushallmov A, #SysStackStartmov R6,Amov A,SPclr Csubb A,R6mov R7,A ;  R7 = SP - SysStackStart  ; system stack length at nowmov DPTR,#OSTCBCur   ; DPTR = &OSTCBCur;; 	*(&OSTCBCur)movx A, @DPTR        ; A = OSTCBCurmov R0, AINC DPTRmovx A, @DPTRmov R1, AINC DPTRmovx A, @DPTRmov R2, A;; DPTR = OSTCBCurmov DPH,R1mov DPL,R2;; 	 OSTCBCur->OSTCBStkPtrmovx A, @DPTRmov R0, AINC DPTRmovx A, @DPTRmov R1, AINC DPTRmovx A, @DPTRmov R2, A;;  DPTR = OSTCBCur->OSTCBStkPtrmov DPH,R1mov DPL,R2;; DPTR[0] = len = R7	mov A,R7movx @DPTR,Ainc DPTRmov R0,#SysStackStart    ;  这里是自己定义的栈初始位置
save_sysstack_to_taskstack:inc R0    ; 在这里51单片机的系统栈是先+1再存内容的mov	A,@R0movx @DPTR,Ainc DPTRDJNZ R7,save_sysstack_to_taskstack;; OSPrioCur = OSPrioHighRdymov DPTR,#OSPrioHighRdymovx A,@DPTRmov DPTR,#OSPrioCurmovx @DPTR,A
;; 	OSTCBCur = OSTCBHighRdy;MOV  	DPTR,#OSTCBHighRdyMOVX 	A,@DPTRMOV  	R1,AINC  	DPTRMOVX 	A,@DPTRMOV  	R2,AINC  	DPTRMOVX 	A,@DPTRMOV  	DPTR,#OSTCBCurXCH  	A,R1MOVX 	@DPTR,AINC  	DPTRMOV  	A,R2MOVX 	@DPTR,AINC  	DPTRMOV  	A,R1MOVX 	@DPTR,A;; SP = SysStackStartmov A,#SysStackStartmov SP,A
; 	OSStartHighRdy();LJMP 	OSStartHighRdy
; END OF OSCtxSw

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词