📄 os_core.src
字号:
XRL A,#01H
JNZ ?C0018
; OS_ENTER_CRITICAL();
; SOURCE LINE # 249
CLR EA
; if (OSLockNesting > 0) { /* Do not decrement if already 0 */
; SOURCE LINE # 250
MOV DPTR,#OSLockNesting
MOVX A,@DPTR
SETB C
SUBB A,#00H
JC ?C0014
; OSLockNesting--; /* Decrement lock nesting level */
; SOURCE LINE # 251
MOVX A,@DPTR
DEC A
MOVX @DPTR,A
; if ((OSLockNesting == 0) && (OSIntNesting == 0)) { /* See if sched. enabled and not an ISR */
; SOURCE LINE # 252
MOVX A,@DPTR
JNZ ?C0015
MOV DPTR,#OSIntNesting
MOVX A,@DPTR
JNZ ?C0015
; OS_EXIT_CRITICAL();
; SOURCE LINE # 253
SETB EA
; OS_Sched(); /* See if a HPT is ready */
; SOURCE LINE # 254
LJMP OS_Sched
; } else {
; SOURCE LINE # 255
?C0015:
; OS_EXIT_CRITICAL();
; SOURCE LINE # 256
SETB EA
; }
; SOURCE LINE # 257
; } else {
; SOURCE LINE # 258
RET
?C0014:
; OS_EXIT_CRITICAL();
; SOURCE LINE # 259
SETB EA
; }
; SOURCE LINE # 260
; }
; SOURCE LINE # 261
; }
; SOURCE LINE # 262
?C0018:
RET
; END OF _?OSSchedUnlock
; #endif
;
; /*$PAGE*/
; /*
; *********************************************************************************************************
; * START MULTITASKING
; *
; * Description: This function is used to start the multitasking process which lets uC/OS-II manages the
; * task that you have created. Before you can call OSStart(), you MUST have called OSInit()
; * and you MUST have created at least one task.
; *
; * Arguments : none
; *
; * Returns : none
; *
; * Note : OSStartHighRdy() MUST:
; * a) Call OSTaskSwHook() then,
; * b) Set OSRunning to TRUE.
; * c) Load the context of the task pointed to by OSTCBHighRdy.
; * d_ Execute the task.
; *********************************************************************************************************
; */
;
; void OSStart (void) reentrant
RSEG ?PR?_?OSStart?OS_CORE
_?OSStart:
USING 0
; SOURCE LINE # 286
MOV DPTR,#0FFFEH
LCALL ?C?ADDXBP
; {
; INT8U y;
; INT8U x;
;
;
; if (OSRunning == FALSE) {
; SOURCE LINE # 292
MOV R0,#LOW (OSRunning)
MOV A,@R0
JNZ ?C0020
; y = OSUnMapTbl[OSRdyGrp]; /* Find highest priority's task priority number */
; SOURCE LINE # 293
MOV DPTR,#OSRdyGrp
MOVX A,@DPTR
ADD A,#LOW (OSUnMapTbl)
MOV DPL,A
CLR A
ADDC A,#HIGH (OSUnMapTbl)
MOV DPH,A
MOVX A,@DPTR
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX @DPTR,A
; x = OSUnMapTbl[OSRdyTbl[y]];
; SOURCE LINE # 294
MOVX A,@DPTR
MOV R7,A
ADD A,#LOW (OSRdyTbl)
MOV DPL,A
CLR A
ADDC A,#HIGH (OSRdyTbl)
MOV DPH,A
MOVX A,@DPTR
ADD A,#LOW (OSUnMapTbl)
MOV DPL,A
CLR A
ADDC A,#HIGH (OSUnMapTbl)
MOV DPH,A
MOVX A,@DPTR
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
INC DPTR
MOVX @DPTR,A
; OSPrioHighRdy = (INT8U)((y << 3) + x);
; SOURCE LINE # 295
MOV A,R7
RLC A
RLC A
RLC A
ANL A,#0F8H
MOV R7,A
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
INC DPTR
MOVX A,@DPTR
ADD A,R7
MOV R0,#LOW (OSPrioHighRdy)
MOV @R0,A
; OSPrioCur = OSPrioHighRdy;
; SOURCE LINE # 296
DEC R0
MOV @R0,A
; OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run */
; SOURCE LINE # 297
MOV B,#03H
MUL AB
ADD A,#LOW (OSTCBPrioTbl)
MOV DPL,A
CLR A
ADDC A,#HIGH (OSTCBPrioTbl)
MOV DPH,A
MOVX A,@DPTR
MOV R3,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R0,#LOW (OSTCBHighRdy)
MOV @R0,AR3
INC R0
MOV @R0,AR2
INC R0
MOV @R0,A
; OSTCBCur = OSTCBHighRdy;
; SOURCE LINE # 298
MOV R0,#LOW (OSTCBCur)
MOV @R0,AR3
INC R0
MOV @R0,AR2
INC R0
MOV @R0,A
; OSStartHighRdy(); /* Execute target specific code to start task */
; SOURCE LINE # 299
LCALL OSStartHighRdy
; }
; SOURCE LINE # 300
; }
; SOURCE LINE # 301
?C0020:
MOV DPTR,#02H
LJMP ?C?ADDXBP
; END OF _?OSStart
; /*$PAGE*/
; /*
; *********************************************************************************************************
; * STATISTICS INITIALIZATION
; *
; * Description: This function is called by your application to establish CPU usage by first determining
; * how high a 32-bit counter would count to in 1 second if no other tasks were to execute
; * during that time. CPU usage is then determined by a low priority task which keeps track
; * of this 32-bit counter every second but this time, with other tasks running. CPU usage is
; * determined by:
; *
; * OSIdleCtr
; * CPU Usage (%) = 100 * (1 - ------------)
; * OSIdleCtrMax
; *
; * Arguments : none
; *
; * Returns : none
; *********************************************************************************************************
; */
;
; #if OS_TASK_STAT_EN > 0
; void OSStatInit (void) reentrant
; {
;
;
;
; OSTimeDly(2); /* Synchronize with clock tick */
; OS_ENTER_CRITICAL();
; OSIdleCtr = 0L; /* Clear idle counter */
; OS_EXIT_CRITICAL();
; OSTimeDly(OS_TICKS_PER_SEC); /* Determine MAX. idle counter value for 1 second */
; OS_ENTER_CRITICAL();
; OSIdleCtrMax = OSIdleCtr; /* Store maximum idle counter count in 1 second */
; OSStatRdy = TRUE;
; OS_EXIT_CRITICAL();
; }
; #endif
; /*$PAGE*/
; /*
; *********************************************************************************************************
; * PROCESS SYSTEM TICK
; *
; * Description: This function is used to signal to uC/OS-II the occurrence of a 'system tick' (also known
; * as a 'clock tick'). This function should be called by the ticker ISR but, can also be
; * called by a high priority task.
; *
; * Arguments : none
; *
; * Returns : none
; *********************************************************************************************************
; */
;
; void OSTimeTick (void) reentrant
RSEG ?PR?_?OSTimeTick?OS_CORE
_?OSTimeTick:
USING 0
; SOURCE LINE # 355
MOV DPTR,#0FFFDH
LCALL ?C?ADDXBP
; {
;
; OS_TCB *ptcb;
;
;
; OSTimeTickHook(); /* Call user definable hook */
; SOURCE LINE # 361
LCALL _?OSTimeTickHook
; #if OS_TIME_GET_SET_EN > 0
; OS_ENTER_CRITICAL(); /* Update the 32-bit tick counter */
; SOURCE LINE # 363
CLR EA
; OSTime++;
; SOURCE LINE # 364
MOV DPTR,#OSTime
MOVX A,@DPTR
MOV R4,A
INC DPTR
MOVX A,@DPTR
MOV R5,A
INC DPTR
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
ADD A,#01H
MOV R7,A
CLR A
ADDC A,R6
MOV R6,A
CLR A
ADDC A,R5
MOV R5,A
CLR A
ADDC A,R4
MOV R4,A
MOV DPTR,#OSTime
LCALL ?C?LSTXDATA
; OS_EXIT_CRITICAL();
; SOURCE LINE # 365
SETB EA
; #endif
; if (OSRunning == TRUE) {
; SOURCE LINE # 367
MOV R0,#LOW (OSRunning)
MOV A,@R0
XRL A,#01H
JZ $ + 5H
LJMP ?C0028
; ptcb = OSTCBList; /* Point at first TCB in TCB list */
; SOURCE LINE # 368
MOV DPTR,#OSTCBList
MOVX A,@DPTR
MOV R1,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
XCH A,R1
MOVX @DPTR,A
INC DPTR
MOV A,R2
MOVX @DPTR,A
INC DPTR
MOV A,R1
MOVX @DPTR,A
?C0022:
; while (ptcb->OSTCBPrio != OS_IDLE_PRIO) { /* Go through all TCBs in TCB list */
; SOURCE LINE # 369
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R3,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R1,A
MOV DPTR,#0CH
LCALL ?C?CLDOPTR
XRL A,#0CH
JNZ $ + 5H
LJMP ?C0028
; OS_ENTER_CRITICAL();
; SOURCE LINE # 370
CLR EA
; if (ptcb->OSTCBDly != 0) { /* Delayed or waiting for event with TO */
; SOURCE LINE # 371
MOV DPTR,#09H
LCALL ?C?ILDOPTR
ORL A,B
JNZ $ + 5H
LJMP ?C0024
; if (--ptcb->OSTCBDly == 0) { /* Decrement nbr of ticks to end of delay */
; SOURCE LINE # 372
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R3,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R1,A
MOV DPTR,#09H
MOV A,#0FFH
MOV B,A
LCALL ?C?IILDOPTR
ORL A,B
JNZ ?C0024
; if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) { /* Is task suspended? */
; SOURCE LINE # 373
MOV DPTR,#0BH
LCALL ?C?CLDOPTR
JB ACC.3,?C0026
; OSRdyGrp |= ptcb->OSTCBBitY; /* No, Make task R-to-R (timed out)*/
; SOURCE LINE # 374
MOV DPTR,#OSRdyGrp
MOVX A,@DPTR
MOV R7,A
MOV DPTR,#010H
LCALL ?C?CLDOPTR
MOV R6,A
MOV A,R7
ORL A,R6
MOV DPTR,#OSRdyGrp
MOVX @DPTR,A
; OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
; SOURCE LINE # 375
MOV DPTR,#0EH
LCALL ?C?CLDOPTR
ADD A,#LOW (OSRdyTbl)
MOV DPL,A
CLR A
ADDC A,#HIGH (OSRdyTbl)
MOV DPH,A
PUSH DPH
PUSH DPL
MOVX A,@DPTR
MOV R7,A
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R3,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R1,A
MOV DPTR,#0FH
LCALL ?C?CLDOPTR
MOV R6,A
MOV A,R7
ORL A,R6
POP DPL
POP DPH
MOVX @DPTR,A
; } else { /* Yes, Leave 1 tick to prevent ... */
; SOURCE LINE # 376
SJMP ?C0024
?C0026:
; ptcb->OSTCBDly = 1; /* ... loosing the task when the ... */
; SOURCE LINE # 377
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R3,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R1,A
MOV DPTR,#09H
CLR A
MOV B,#01H
LCALL ?C?ISTOPTR
; } /* ... suspension is removed. */
; SOURCE LINE # 378
; }
; SOURCE LINE # 379
; }
; SOURCE LINE # 380
?C0024:
; ptcb = ptcb->OSTCBNext; /* Point at next TCB in TCB list */
; SOURCE LINE # 381
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R3,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R1,A
MOV DPTR,#03H
LCALL ?C?PLDOPTR
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOV A,R3
MOVX @DPTR,A
INC DPTR
MOV A,R2
MOVX @DPTR,A
INC DPTR
MOV A,R1
MOVX @DPTR,A
; OS_EXIT_CRITICAL();
; SOURCE LINE # 382
SETB EA
; }
; SOURCE LINE # 383
LJMP ?C0022
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -