📄 os_core.src
字号:
MOV DPH,A
MOVX A,@DPTR
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX @DPTR,A
; x = OSUnMapTbl[OSRdyTbl[y]];
; SOURCE LINE # 300
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 # 301
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 DPTR,#OSPrioHighRdy
MOVX @DPTR,A
; OSPrioCur = OSPrioHighRdy;
; SOURCE LINE # 302
MOV DPTR,#OSPrioCur
MOVX @DPTR,A
; OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run */
; SOURCE LINE # 303
MOV B,#03H
MUL AB
ADD A,#LOW (OSTCBPrioTbl)
MOV DPL,A
CLR A
ADDC A,#HIGH (OSTCBPrioTbl)
MOV DPH,A
LCALL ?C?PLDXDATA
MOV DPTR,#OSTCBHighRdy
LCALL ?C?PSTXDATA
; OSTCBCur = OSTCBHighRdy;
; SOURCE LINE # 304
MOV DPTR,#OSTCBCur
LCALL ?C?PSTXDATA
; OSStartHighRdy(); /* Execute target specific code to start task */
; SOURCE LINE # 305
LCALL _?OSStartHighRdy
; }
; SOURCE LINE # 306
; }
; SOURCE LINE # 307
?C0011:
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) LG_REENTRANT
; {
; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
; OS_CPU_SR cpu_sr;
; #endif
;
;
; 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) LG_REENTRANT
RSEG ?PR?_?OSTimeTick?OS_CORE
_?OSTimeTick:
USING 0
; SOURCE LINE # 363
MOV DPTR,#0FFFDH
LCALL ?C?ADDXBP
; {
; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
; OS_CPU_SR cpu_sr;
; #endif
; OS_TCB *ptcb;
;
;
; OSTimeTickHook(); /* Call user definable hook */
; SOURCE LINE # 371
LCALL _?OSTimeTickHook
; #if OS_TIME_GET_SET_EN > 0
; OS_ENTER_CRITICAL(); /* Update the 32-bit tick counter */
; OSTime++;
; OS_EXIT_CRITICAL();
; #endif
; if (OSRunning == TRUE) {
; SOURCE LINE # 377
JB OSRunning,$ + 6H
LJMP ?C0019
; ptcb = OSTCBList; /* Point at first TCB in TCB list */
; SOURCE LINE # 378
MOV DPTR,#OSTCBList
LCALL ?C?PLDXDATA
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
LCALL ?C?PSTXDATA
?C0013:
; while (ptcb->OSTCBPrio != OS_IDLE_PRIO) { /* Go through all TCBs in TCB list */
; SOURCE LINE # 379
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
LCALL ?C?PLDXDATA
MOV DPTR,#0FH
LCALL ?C?CLDOPTR
XRL A,#09H
JNZ $ + 5H
LJMP ?C0019
; OS_ENTER_CRITICAL();
; SOURCE LINE # 380
CLR EA
; if (ptcb->OSTCBDly != 0) { /* Delayed or waiting for event with TO */
; SOURCE LINE # 381
MOV DPTR,#0CH
LCALL ?C?ILDOPTR
ORL A,B
JZ ?C0015
; if (--ptcb->OSTCBDly == 0) { /* Decrement nbr of ticks to end of delay */
; SOURCE LINE # 382
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
LCALL ?C?PLDXDATA
MOV DPTR,#0CH
MOV A,#0FFH
MOV B,A
LCALL ?C?IILDOPTR
ORL A,B
JNZ ?C0015
; if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) { /* Is task suspended? */
; SOURCE LINE # 383
MOV DPTR,#0EH
LCALL ?C?CLDOPTR
JB ACC.3,?C0017
; OSRdyGrp |= ptcb->OSTCBBitY; /* No, Make task R-to-R (timed out)*/
; SOURCE LINE # 384
MOV DPTR,#OSRdyGrp
MOVX A,@DPTR
MOV R7,A
MOV DPTR,#013H
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 # 385
MOV DPTR,#011H
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
LCALL ?C?PLDXDATA
MOV DPTR,#012H
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 # 386
SJMP ?C0015
?C0017:
; ptcb->OSTCBDly = 1; /* ... loosing the task when the ... */
; SOURCE LINE # 387
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
LCALL ?C?PLDXDATA
MOV DPTR,#0CH
CLR A
MOV B,#01H
LCALL ?C?ISTOPTR
; } /* ... suspension is removed. */
; SOURCE LINE # 388
; }
; SOURCE LINE # 389
; }
; SOURCE LINE # 390
?C0015:
; ptcb = ptcb->OSTCBNext; /* Point at next TCB in TCB list */
; SOURCE LINE # 391
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
LCALL ?C?PLDXDATA
MOV DPTR,#03H
LCALL ?C?PLDOPTR
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
LCALL ?C?PSTXDATA
; OS_EXIT_CRITICAL();
; SOURCE LINE # 392
SETB EA
; }
; SOURCE LINE # 393
LJMP ?C0013
; }
; SOURCE LINE # 394
; }
; SOURCE LINE # 395
?C0019:
MOV DPTR,#03H
LJMP ?C?ADDXBP
; END OF _?OSTimeTick
; /*$PAGE*/
; /*
; *********************************************************************************************************
; * GET VERSION
; *
; * Description: This function is used to return the version number of uC/OS-II. The returned value
; * corresponds to uC/OS-II's version number multiplied by 100. In other words, version 2.00
; * would be returned as 200.
; *
; * Arguments : none
; *
; * Returns : the version number of uC/OS-II multiplied by 100.
; *********************************************************************************************************
; */
;
; INT16U OSVersion (void) LG_REENTRANT
RSEG ?PR?_?OSVersion?OS_CORE
_?OSVersion:
USING 0
; SOURCE LINE # 411
; {
; return (OS_VERSION);
; SOURCE LINE # 413
MOV R6,#00H
MOV R7,#0FCH
; }
; SOURCE LINE # 414
?C0020:
RET
; END OF _?OSVersion
;
; /*$PAGE*/
; /*
; *********************************************************************************************************
; * DUMMY FUNCTION
; *
; * Description: This function doesn't do anything. It is called by OSTaskDel().
; *
; * Arguments : none
; *
; * Returns : none
; *********************************************************************************************************
; */
;
; #if OS_TASK_DEL_EN > 0
; void OS_Dummy (void) LG_REENTRANT
; {
; }
; #endif
;
; /*$PAGE*/
; /*
; *********************************************************************************************************
; * MAKE TASK READY TO RUN BASED ON EVENT OCCURING
; *
; * Description: This function is called by other uC/OS-II services and is used to ready a task that was
; * waiting for an event to occur.
; *
; * Arguments : pevent is a pointer to the event control block corresponding to the event.
; *
; * msg is a pointer to a message. This pointer is used by message oriented services
; * such as MAILBOXEs and QUEUEs. The pointer is not used when called by other
; * service functions.
; *
; * msk is a mask that is used to clear the status byte of the TCB. For example,
; * OSSemPost() will pass OS_STAT_SEM, OSMboxPost() will pass OS_STAT_MBOX etc.
; *
; * Returns : none
; *
; * Note : This function is INTERNAL to uC/OS-II and your application should not call it.
; *********************************************************************************************************
; */
; #if OS_EVENT_EN > 0
; INT8U OS_EventTaskRdy (OS_EVENT *pevent, void *msg, INT8U msk) LG_REENTRANT
RSEG ?PR?_?OS_EventTaskRdy?OS_CORE
_?OS_EventTaskRdy:
USING 0
; SOURCE LINE # 458
MOV DPTR,#0FFFDH
LCALL ?C?ADDXBP
LCALL ?C?PSTXDATA
MOV DPTR,#0FFF8H
LCALL ?C?ADDXBP
; {
; OS_TCB *ptcb;
; INT8U x;
; INT8U y;
; INT8U bitx;
; INT8U bity;
; INT8U prio;
;
;
; y = OSUnMapTbl[pevent->OSEventGrp]; /* Find highest prio. task waiting for message */
; SOURCE LINE # 468
MOV DPTR,#08H
LCALL ?C?XBPOFF
LCALL ?C?PLDXDATA
MOV DPTR,#01H
LCALL ?C?CLDOPTR
ADD A,#LOW (OSUnMapTbl)
MOV DPL,A
CLR A
ADDC A,#HIGH (OSUnMapTbl)
MOV DPH,A
MOVX A,@DPTR
MOV R7,A
MOV DPTR,#04H
LCALL ?C?XBPOFF
MOV A,R7
MOVX @DPTR,A
; bity = OSMapTbl[y];
; SOURCE LINE # 469
MOV DPTR,#04H
LCALL ?C?XBPOFF
MOVX A,@DPTR
MOV R7,A
ADD A,#LOW (OSMapTbl)
MOV DPL,A
CLR A
ADDC A,#HIGH (OSMapTbl)
MOV DPH,A
MOVX A,@DPTR
MOV R6,A
MOV DPTR,#06H
LCALL ?C?XBPOFF
MOV A,R6
MOVX @DPTR,A
; x = OSUnMapTbl[pevent->OSEventTbl[y]];
; SOURCE LINE # 470
MOV A,R1
ADD A,#07H
MOV R1,A
CLR A
ADDC A,R2
MOV R2,A
MOV R6,#00H
MOV A,R1
ADD A,R7
MOV R1,A
MOV A,R6
ADDC A,R2
MOV R2,A
LCALL ?C?CLDPTR
MOV R7,A
ADD A,#LOW (OSUnMapTbl)
MOV DPL,A
CLR A
ADDC A,#HIGH (OSUnMapTbl)
MOV DPH,A
MOVX A,@DPTR
MOV R6,A
MOV DPTR,#03H
LCALL ?C?XBPOFF
MOV A,R6
MOVX @DPTR,A
; bitx = OSMapTbl[x];
; SOURCE LINE # 471
MOV DPTR,#03H
LCALL ?C?XBPOFF
MOVX A,@DPTR
MOV R6,A
ADD A,#LOW (OSMapTbl)
MOV DPL,A
CLR A
ADDC A,#HIGH (OSMapTbl)
MOV DPH,A
MOVX A,@DPTR
MOV R5,A
MOV DPTR,#05H
LCALL ?C?XBPOFF
MOV A,R5
MOVX @DPTR,A
; prio = (INT8U)((y << 3) + x); /* Find priority of task getting the msg */
; SOURCE LINE # 472
MOV DPTR,#04H
LCALL ?C?XBPOFF
MOVX A,@DPTR
MOV R5,A
RLC A
RLC A
RLC A
ANL A,#0F8H
ADD A,R6
MOV R6,A
MOV DPTR,#07H
LCALL ?C?XBPOFF
MOV A,R6
MOVX @DPTR,A
; if ((pevent->OSEventTbl[y] &= ~bitx) == 0x00) { /* Remove this task from the waiting list */
; SOURCE LINE # 473
MOV DPTR,#05H
LCALL ?C?XBPOFF
MOVX A,@DPTR
MOV R4,A
CPL A
ANL A,R7
LCALL ?C?CSTPTR
JNZ ?C0021
; pevent->OSEventGrp &= ~bity; /* Clr group bit if this was only task pending */
; SOURCE LINE # 474
MOV DPTR,#08H
LCALL ?C?XBPOFF
LCALL ?C?PLDXDATA
MOV A,R1
ADD A,#01H
MOV R1,A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -