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

📄 os_cpu.c

📁 8051单片机的ucos移植
💻 C
📖 第 1 页 / 共 2 页
字号:
            PUSH B
            PUSH DPH
            PUSH DPL
            PUSH 0
            PUSH 1
            PUSH 2
            PUSH 3
            PUSH 4
            PUSH 5
            PUSH 6
            PUSH 7
            /* push internal stack pointer onto the external stack */
            MOV A,?stack    Decrement external stack pointer by 1
            CLR PSW.7
            SUBB A,#1
            MOV ?stack,A
            MOV A,?stack+1
            SUBB A,#0
            MOV ?stack+1,A
            MOV A,?stack    set up dptr with the new external stack pointer value   
            MOV DPL,A
            MOV A,?stack+1
            MOV DPH,A
            MOV A,SP        move internal stack pointer value into xternal stack
            MOVX [DPTR],A
            /* start pushing the internal ram onto the external ram */   
            MOV B,#$7F-?stk   We have 0x7F-?stk bytes to move starting from hi to low
_CSPUSHA    MOV A,B
            ADD A,#?stk
            MOV R0,A
            MOV A,?stack    Decrement external stack pointer by 1
            CLR PSW.7
            SUBB A,#1
            MOV ?stack,A
            MOV A,?stack+1
            SUBB A,#0
            MOV ?stack+1,A
            MOV A,?stack    set up dptr with the new external stack pointer value   
            MOV DPL,A
            MOV A,?stack+1
            MOV DPH,A
            MOV A,[R0]        
            MOVX [DPTR],A
            MOV A,B
            CLR PSW.7
            SUBB A,#1 
            MOV B,A
            CJNE A,#0,_CSPUSHA
            /* Switch the external stack pointer now */
            MOV DPTR,#OSTCBCur
            MOVX A,[DPTR]
            MOV R0,A
            INC DPTR
            MOVX A,[DPTR]
            MOV R1,A
            MOV DPL,R0
            MOV DPH,R1
            MOV A,?stack
            MOVX [DPTR],A
            INC DPTR
            MOV A,?stack+1
            MOVX [DPTR],A
            MOV DPTR,#OSTCBHighRdy
            MOVX A,[DPTR]
            MOV R0,A
            INC DPTR
            MOVX A,[DPTR]
            MOV R1,A
            MOV DPL,R0
            MOV DPH,R1
            MOVX A,[DPTR]
            MOV ?stack,A
            INC DPTR
            MOVX A,[DPTR]
            MOV ?stack+1,A
            /* Call user defined function */
            LCALL OSTaskSwHook 
            /* OSTCBCur = OSTCBHighRdy */
            MOV DPTR,#OSTCBHighRdy
            MOVX A,[DPTR]
            MOV R0,A
            INC DPTR
            MOVX A,[DPTR]
            MOV R1,A
            MOV DPTR,#OSTCBCur
            MOV A,R0
            MOVX [DPTR],A
            INC DPTR
            MOV A,R1
            MOVX [DPTR],A
            /* OSPrioCur = OSPrioHighRdy */
            MOV DPTR,#OSPrioHighRdy
            MOVX A,[DPTR]
            MOV DPTR,#OSPrioCur
            MOVX [DPTR],A 
            /* pop all internal stack values from external stack back to internal ram */
            MOV B,#0   We have 0x7F-?stk bytes to move starting from low to high
_CSPOPA     MOV A,B
            ADD A,#1 
            MOV B,A
            ADD A,#?stk
            MOV R0,A
            MOV A,?stack
            MOV DPL,A
            MOV A,?stack+1
            MOV DPH,A
            MOVX A,[DPTR]
            MOV [R0],A
            MOV A,?stack
            ADD A,#1
            MOV ?stack,A
            MOV A,?stack+1
            ADDC A,#0
            MOV ?stack+1,A
            MOV A,B
            CJNE A,#$7F-?stk,_CSPOPA 
_CSPOPADONE
            /* pop internal stack pointer */
            MOV A,?stack
            MOV DPL,A
            MOV A,?stack+1
            MOV DPH,A
            MOVX A,[DPTR]
            MOV SP,A
            MOV A,?stack
            ADD A,#1
            MOV ?stack,A
            MOV A,?stack+1
            ADDC A,#0
            MOV ?stack+1,A
            /* restore processor registers */
            POP 7
            POP 6
            POP 5
            POP 4
            POP 3
            POP 2
            POP 1
            POP 0
            POP DPL
            POP DPH
            POP B
            POP A
            SETB IE.7      Have to turn the interrupt back on
            POP PSW
    }
}


void OSIntCtxSw()
{
    asm {

            /* Remove calls to OSIntExit and OSIntCtxSw, 
               and the call to the ISR itself see 8051INT.h
               for details */
            XCH A,SP
            CLR PSW.7
            SUBB A,#6
            XCH A,SP
  
            /* push internal stack pointer onto the external stack */
            MOV A,?stack    Decrement external stack pointer by 1
            CLR PSW.7
            SUBB A,#1
            MOV ?stack,A
            MOV A,?stack+1
            SUBB A,#0
            MOV ?stack+1,A
            MOV A,?stack    set up dptr with the new external stack pointer value   
            MOV DPL,A
            MOV A,?stack+1
            MOV DPH,A
            MOV A,SP        move internal stack pointer value into xternal stack
            MOVX [DPTR],A
            /* start pushing the internal ram onto the external ram */   
            MOV B,#$7F-?stk   We have 0x7F-?stk bytes to move starting from hi to low
_ICSPUSHA   MOV A,B
            ADD A,#?stk
            MOV R0,A
            MOV A,?stack    Decrement external stack pointer by 1
            CLR PSW.7
            SUBB A,#1
            MOV ?stack,A
            MOV A,?stack+1
            SUBB A,#0
            MOV ?stack+1,A
            MOV A,?stack    set up dptr with the new external stack pointer value   
            MOV DPL,A
            MOV A,?stack+1
            MOV DPH,A
            MOV A,[R0]        
            MOVX [DPTR],A
            MOV A,B
            CLR PSW.7
            SUBB A,#1 
            MOV B,A
            CJNE A,#0,_ICSPUSHA
            /* Switch the external stack pointer now */
            MOV DPTR,#OSTCBCur
            MOVX A,[DPTR]
            MOV R0,A
            INC DPTR
            MOVX A,[DPTR]
            MOV R1,A
            MOV DPL,R0
            MOV DPH,R1
            MOV A,?stack
            MOVX [DPTR],A
            INC DPTR
            MOV A,?stack+1
            MOVX [DPTR],A
            MOV DPTR,#OSTCBHighRdy
            MOVX A,[DPTR]
            MOV R0,A
            INC DPTR
            MOVX A,[DPTR]
            MOV R1,A
            MOV DPL,R0
            MOV DPH,R1
            MOVX A,[DPTR]
            MOV ?stack,A
            INC DPTR
            MOVX A,[DPTR]
            MOV ?stack+1,A
            /* Call user defined function */
            LCALL OSTaskSwHook
            /* OSTCBCur = OSTCBHighRdy */
            MOV DPTR,#OSTCBHighRdy
            MOVX A,[DPTR]
            MOV R0,A
            INC DPTR
            MOVX A,[DPTR]
            MOV R1,A
            MOV DPTR,#OSTCBCur
            MOV A,R0
            MOVX [DPTR],A
            INC DPTR
            MOV A,R1
            MOVX [DPTR],A
            /* OSPrioCur = OSPrioHighRdy */
            MOV DPTR,#OSPrioHighRdy
            MOVX A,[DPTR]
            MOV DPTR,#OSPrioCur
            MOVX [DPTR],A 
            /* pop all internal stack values from external stack back to internal ram */
            MOV B,#0   We have 0x7F-?stk bytes to move starting from low to high
_ICSPOPA    MOV A,B
            ADD A,#1 
            MOV B,A
            ADD A,#?stk
            MOV R0,A
            MOV A,?stack
            MOV DPL,A
            MOV A,?stack+1
            MOV DPH,A
            MOVX A,[DPTR]
            MOV [R0],A
            MOV A,?stack
            ADD A,#1
            MOV ?stack,A
            MOV A,?stack+1
            ADDC A,#0
            MOV ?stack+1,A
            MOV A,B
            CJNE A,#$7F-?stk,_ICSPOPA 
_ICSPOPADONE
            /* pop internal stack pointer */
            MOV A,?stack
            MOV DPL,A
            MOV A,?stack+1
            MOV DPH,A
            MOVX A,[DPTR]
            MOV SP,A
            MOV A,?stack
            ADD A,#1
            MOV ?stack,A
            MOV A,?stack+1
            ADDC A,#0
            MOV ?stack+1,A
            /* restore processor registers */
            POP 7
            POP 6
            POP 5
            POP 4
            POP 3
            POP 2
            POP 1
            POP 0
            POP DPL
            POP DPH
            POP B
            POP A
            POP PSW
            SETB IE.7
            RETI
    }
}

⌨️ 快捷键说明

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