📄 os_cpu_c.src
字号:
; * been placed on the stack in the proper order.
; *
; * Note(s) : Interrupts are enabled when your task starts executing. You can change this by setting the
; * PSW to 0x0002 instead. In this case, interrupts would be disabled upon task startup. The
; * application code would be responsible for enabling interrupts at the beginning of the task
; * code. You will need to modify OSTaskIdle() and OSTaskStat() so that they enable
; * interrupts. Failure to do this will make your system crash!
; *********************************************************************************************************
; */
; /*
; at89c55wd PDL(sp form LOW to HIGH): (堆栈指针所指的栈顶数据为有效数据)
; 装入堆栈指针ptos到stk
;
; stk--> 入栈:task底\高 (高内存)
; 入 || 入栈:ACC
; 栈 || 入栈:B
; 顺 || 入栈:DPH //暂时忽略第二指针
; 序 || 入栈:DPL
; | \/ | 入栈:PSW
; | | 入栈:R7-R4
; |______| 入栈:os_pdata(R3,R2,R1)用寄存器传递os_pdata
; 入栈:R0 (底内存)
;
; // 入栈:DPS?? //双数据指针选择寄存器??
; // 入栈:PC
; 自己应该参照编译器定义入栈/出栈顺序,写出来备以后查阅
; */
; OS_STK *OSTaskStkInit (void (*task)(void *pd)LG_REENTRANT, void *os_pdata, OS_STK *ptos, INT16U opt) LG_REENTRANT
RSEG ?PR?_?OSTaskStkInit?OS_CPU_C
_?OSTaskStkInit:
USING 0
; SOURCE LINE # 187
MOV DPTR,#0FFFDH
LCALL ?C?ADDXBP
LCALL ?C?PSTXDATA
MOV DPTR,#0FFFDH
LCALL ?C?ADDXBP
; {
; //INT16U *stk;
; OS_STK *stk;
;
; opt = opt; /* 'opt' is not used, prevent warning */
; SOURCE LINE # 192
MOV DPTR,#0CH
LCALL ?C?XBPOFF
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
MOV DPTR,#0CH
LCALL ?C?XBPOFF
MOV A,R6
MOVX @DPTR,A
INC DPTR
MOV A,R7
MOVX @DPTR,A
; stk = (OS_STK *)ptos; /* Load stack pointer */
; SOURCE LINE # 193
MOV DPTR,#09H
LCALL ?C?XBPOFF
LCALL ?C?PLDXDATA
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
LCALL ?C?PSTXDATA
; //装入堆栈指针ptos到stk
;
; *stk = 0; //入栈:R0
; SOURCE LINE # 196
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
LCALL ?C?PLDXDATA
CLR A
LCALL ?C?CSTPTR
; stk -= sizeof(void *);
; SOURCE LINE # 197
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
INC DPTR
MOV A,#0FFH
MOV B,#0FDH
LCALL ?C?IILDX
; *(void **)stk = (void *)os_pdata; //用寄存器传递os_pdata
; SOURCE LINE # 198
MOV DPTR,#06H
LCALL ?C?XBPOFF
LCALL ?C?PLDXDATA
PUSH AR3
PUSH AR2
PUSH AR1
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
LCALL ?C?PLDXDATA
LCALL ?C?PSTPTR
; *--stk = 4; //入栈:R4-R7
; SOURCE LINE # 199
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOV A,#0FFH
MOV B,A
LCALL ?C?PILDXDATA
MOV A,#04H
LCALL ?C?CSTPTR
; *--stk = 5;
; SOURCE LINE # 200
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOV A,#0FFH
MOV B,A
LCALL ?C?PILDXDATA
MOV A,#05H
LCALL ?C?CSTPTR
; *--stk = 6;
; SOURCE LINE # 201
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOV A,#0FFH
MOV B,A
LCALL ?C?PILDXDATA
MOV A,#06H
LCALL ?C?CSTPTR
; *--stk = 7;
; SOURCE LINE # 202
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOV A,#0FFH
MOV B,A
LCALL ?C?PILDXDATA
MOV A,#07H
LCALL ?C?CSTPTR
;
; *--stk = PSW; //入栈:PSW
; SOURCE LINE # 204
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOV A,#0FFH
MOV B,A
LCALL ?C?PILDXDATA
MOV A,PSW
LCALL ?C?CSTPTR
; *--stk = 'L'; //入栈:DPL
; SOURCE LINE # 205
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOV A,#0FFH
MOV B,A
LCALL ?C?PILDXDATA
MOV A,#04CH
LCALL ?C?CSTPTR
; *--stk = 'H'; //入栈:DPH //暂时忽略第二指针
; SOURCE LINE # 206
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOV A,#0FFH
MOV B,A
LCALL ?C?PILDXDATA
MOV A,#048H
LCALL ?C?CSTPTR
; *--stk = 'B'; //入栈:B
; SOURCE LINE # 207
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOV A,#0FFH
MOV B,A
LCALL ?C?PILDXDATA
MOV A,#042H
LCALL ?C?CSTPTR
; *--stk = 'A'; //入栈:ACC
; SOURCE LINE # 208
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOV A,#0FFH
MOV B,A
LCALL ?C?PILDXDATA
MOV A,#041H
LCALL ?C?CSTPTR
;
; *--stk = ((INT16U)task & 0xff00) >> 8; //保存任务地址
; SOURCE LINE # 210
MOV DPTR,#03H
LCALL ?C?XBPOFF
LCALL ?C?PLDXDATA
MOV A,R2
MOV R7,A
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOV A,#0FFH
MOV B,A
LCALL ?C?PILDXDATA
MOV A,R7
LCALL ?C?CSTPTR
; *--stk = (INT16U)task & 0x00ff;
; SOURCE LINE # 211
MOV DPTR,#03H
LCALL ?C?XBPOFF
LCALL ?C?PLDXDATA
MOV R7,AR1
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOV A,#0FFH
MOV B,A
LCALL ?C?PILDXDATA
MOV A,R7
LCALL ?C?CSTPTR
;
; *--stk = 15; //入栈个数
; SOURCE LINE # 213
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOV A,#0FFH
MOV B,A
LCALL ?C?PILDXDATA
MOV A,#0FH
LCALL ?C?CSTPTR
; //END
; return ((OS_STK *)stk);
; SOURCE LINE # 215
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
LCALL ?C?PLDXDATA
; }
; SOURCE LINE # 216
?C0011:
MOV DPTR,#0EH
LJMP ?C?ADDXBP
; END OF _?OSTaskStkInit
;
; /*$PAGE*/
; /*
; *********************************************************************************************************
; * INITIALIZE A TASK'S STACK FOR FLOATING POINT EMULATION
; *
; *********************************************************************************************************
; */
;
; /*$PAGE*/
; //void OSTaskStkInit_FPE_x86 (OS_STK **pptos, OS_STK **ppbos, INT32U *psize)
; //{
; //}
;
; /*$PAGE*/
; /*
; *********************************************************************************************************
; * TASK SWITCH HOOK
; *
; * Description: This function is called when a task switch is performed. This allows you to perform other
; * operations during a context switch.
; *
; * Arguments : none
; *
; * Note(s) : 1) Interrupts are disabled during this call.
; * 2) It is assumed that the global pointer 'OSTCBHighRdy' points to the TCB of the task that
; * will be 'switched in' (i.e. the highest priority task) and, 'OSTCBCur' points to the
; * task being switched out (i.e. the preempted task).
; *********************************************************************************************************
; */
; #if OS_CPU_HOOKS_EN > 0
; void OSTaskSwHook (void) LG_REENTRANT
RSEG ?PR?_?OSTaskSwHook?OS_CPU_C
_?OSTaskSwHook:
; SOURCE LINE # 248
; {
; }
; SOURCE LINE # 250
RET
; END OF _?OSTaskSwHook
; #endif
;
; /*
; *********************************************************************************************************
; * OSTCBInit() HOOK
; *
; * Description: This function is called by OS_TCBInit() after setting up most of the TCB.
; *
; * Arguments : ptcb is a pointer to the TCB of the task being created.
; *
; * Note(s) : 1) Interrupts may or may not be ENABLED during this call.
; *********************************************************************************************************
; */
; #if OS_CPU_HOOKS_EN > 0 && OS_VERSION > 203
; void OSTCBInitHook (OS_TCB *ptcb) LG_REENTRANT
RSEG ?PR?_?OSTCBInitHook?OS_CPU_C
_?OSTCBInitHook:
USING 0
; SOURCE LINE # 265
MOV DPTR,#0FFFDH
LCALL ?C?ADDXBP
LCALL ?C?PSTXDATA
; {
; ptcb = ptcb; /* Prevent Compiler warning */
; SOURCE LINE # 267
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
LCALL ?C?PLDXDATA
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
LCALL ?C?PSTXDATA
; }
; SOURCE LINE # 268
MOV DPTR,#03H
LJMP ?C?ADDXBP
; END OF _?OSTCBInitHook
; #endif
;
;
; /*
; *********************************************************************************************************
; * TICK HOOK
; *
; * Description: This function is called every tick.
; *
; * Arguments : none
; *
; * Note(s) : 1) Interrupts may or may not be ENABLED during this call.
; *********************************************************************************************************
; */
; #if OS_CPU_HOOKS_EN > 0
; void OSTimeTickHook (void) LG_REENTRANT
RSEG ?PR?_?OSTimeTickHook?OS_CPU_C
_?OSTimeTickHook:
; SOURCE LINE # 284
; {
; }
; SOURCE LINE # 286
RET
; END OF _?OSTimeTickHook
; #endif
;
;
; /*
; *********************************************************************************************************
; * 中断服务程序外挂
; * NOTE : 注意:所有中断外挂都在临界区之外,用户可以自行控制进/退临界区
; *********************************************************************************************************
; */
; #if OS_ISR_T1_EN > 0
; void OSISR_T1HOOK (void) LG_REENTRANT
; {
;
; /* 请在这里输入中断服务程序 */
;
; }
; #endif
;
; #if OS_ISR_INT0_EN > 0
; void OSISR_INT0HOOK (void) LG_REENTRANT
; {
;
; /* 请在这里输入中断服务程序 */
;
; }
; #endif
;
; #if OS_ISR_INT1_EN > 0
; void OSISR_INT1HOOK (void) LG_REENTRANT
; {
;
; /* 请在这里输入中断服务程序 */
;
; }
; #endif
;
; #if OS_ISR_S0_EN > 0
; void OSISR_S0HOOK (void) LG_REENTRANT
RSEG ?PR?_?OSISR_S0HOOK?OS_CPU_C
_?OSISR_S0HOOK:
; SOURCE LINE # 324
; {
;
; /* 请在这里输入中断服务程序 */
;
;
;
; }
; SOURCE LINE # 331
RET
; END OF _?OSISR_S0HOOK
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -