📄 os_core.src
字号:
LCALL _?OSStartHighRdy
; }
; SOURCE LINE # 308
; }
; SOURCE LINE # 309
?C0011:
INC ?C_IBP
INC ?C_IBP
RET
; 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) KCREENTRANT
RSEG ?PR?_?OSStatInit?OS_CORE
_?OSStatInit:
USING 0
; SOURCE LINE # 332
DEC ?C_IBP
; {
; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
; OS_CPU_SR cpu_sr;
; #endif
;
;
; OSTimeDly(2); /* Synchronize with clock tick */
; SOURCE LINE # 339
MOV R6,#00H
MOV R7,#02H
LCALL _?OSTimeDly
; OS_ENTER_CRITICAL();
; SOURCE LINE # 340
MOV C,EA
CLR A
RLC A
MOV R0,?C_IBP
MOV @R0,A
CLR EA
; OSIdleCtr = 0L; /* Clear idle counter */
; SOURCE LINE # 341
CLR A
MOV OSIdleCtr+03H,A
MOV OSIdleCtr+02H,A
MOV OSIdleCtr+01H,A
MOV OSIdleCtr,A
; OS_EXIT_CRITICAL();
; SOURCE LINE # 342
MOV A,@R0
ADD A,#0FFH
MOV EA,C
; OSTimeDly(OS_TICKS_PER_SEC); /* Determine MAX. idle counter value for 1 second */
; SOURCE LINE # 343
MOV R6,#00H
MOV R7,#064H
LCALL _?OSTimeDly
; OS_ENTER_CRITICAL();
; SOURCE LINE # 344
MOV C,EA
CLR A
RLC A
MOV R0,?C_IBP
MOV @R0,A
CLR EA
; OSIdleCtrMax = OSIdleCtr; /* Store maximum idle counter count in 1 second */
; SOURCE LINE # 345
MOV R7,OSIdleCtr+03H
MOV R6,OSIdleCtr+02H
MOV R5,OSIdleCtr+01H
MOV R4,OSIdleCtr
MOV OSIdleCtrMax+03H,R7
MOV OSIdleCtrMax+02H,R6
MOV OSIdleCtrMax+01H,R5
MOV OSIdleCtrMax,R4
; OSStatRdy = TRUE;
; SOURCE LINE # 346
MOV OSStatRdy,#01H
; OS_EXIT_CRITICAL();
; SOURCE LINE # 347
MOV A,@R0
ADD A,#0FFH
MOV EA,C
; }
; SOURCE LINE # 348
INC ?C_IBP
RET
; END OF _?OSStatInit
; #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) KCREENTRANT
RSEG ?PR?_?OSTimeTick?OS_CORE
_?OSTimeTick:
USING 0
; SOURCE LINE # 365
MOV A,?C_IBP
ADD A,#0FCH
MOV ?C_IBP,A
; {
; #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 # 373
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 # 379
MOV A,OSRunning
XRL A,#01H
JZ $ + 4H
AJMP ?C0020
; ptcb = OSTCBList; /* Point at first TCB in TCB list */
; SOURCE LINE # 380
MOV R1,OSTCBList
MOV R0,?C_IBP
INC R0
MOV @R0,A
INC R0
MOV @R0,A
INC R0
MOV @R0,AR1
?C0014:
; while (ptcb->OSTCBPrio != OS_IDLE_PRIO) { /* Go through all TCBs in TCB list */
; SOURCE LINE # 381
MOV R0,?C_IBP
INC R0
MOV AR3,@R0
INC R0
MOV A,@R0
MOV R2,A
INC R0
MOV A,@R0
MOV R1,A
MOV DPTR,#09H
LCALL ?C?CLDOPTR
XRL A,#0CH
JNZ $ + 4H
AJMP ?C0020
; OS_ENTER_CRITICAL();
; SOURCE LINE # 382
MOV C,EA
CLR A
RLC A
MOV R0,?C_IBP
MOV @R0,A
CLR EA
; if (ptcb->OSTCBDly != 0) { /* Delayed or waiting for event with TO */
; SOURCE LINE # 383
MOV DPTR,#06H
LCALL ?C?ILDOPTR
ORL A,B
JZ ?C0016
; if (--ptcb->OSTCBDly == 0) { /* Decrement nbr of ticks to end of delay */
; SOURCE LINE # 384
MOV R0,?C_IBP
INC R0
MOV AR3,@R0
INC R0
MOV A,@R0
MOV R2,A
INC R0
MOV A,@R0
MOV R1,A
MOV DPTR,#06H
MOV A,#0FFH
MOV B,A
LCALL ?C?IILDOPTR
ORL A,B
JNZ ?C0016
; if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) { /* Is task suspended? */
; SOURCE LINE # 385
MOV DPTR,#08H
LCALL ?C?CLDOPTR
JB ACC.3,?C0018
; OSRdyGrp |= ptcb->OSTCBBitY; /* No, Make task R-to-R (timed out)*/
; SOURCE LINE # 386
MOV DPTR,#0DH
LCALL ?C?CLDOPTR
ORL OSRdyGrp,A
; OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
; SOURCE LINE # 387
MOV DPTR,#0BH
LCALL ?C?CLDOPTR
ADD A,#LOW (OSRdyTbl)
MOV R0,A
PUSH AR0
MOV A,@R0
MOV R7,A
MOV R0,?C_IBP
INC R0
MOV AR3,@R0
INC R0
MOV A,@R0
MOV R2,A
INC R0
MOV A,@R0
MOV R1,A
MOV DPTR,#0CH
LCALL ?C?CLDOPTR
ORL A,R7
POP AR0
MOV @R0,A
; } else { /* Yes, Leave 1 tick to prevent ... */
; SOURCE LINE # 388
SJMP ?C0016
?C0018:
; ptcb->OSTCBDly = 1; /* ... loosing the task when the ... */
; SOURCE LINE # 389
MOV R0,?C_IBP
INC R0
MOV AR3,@R0
INC R0
MOV A,@R0
MOV R2,A
INC R0
MOV A,@R0
MOV R1,A
MOV DPTR,#06H
CLR A
MOV B,#01H
LCALL ?C?ISTOPTR
; } /* ... suspension is removed. */
; SOURCE LINE # 390
; }
; SOURCE LINE # 391
; }
; SOURCE LINE # 392
?C0016:
; ptcb = ptcb->OSTCBNext; /* Point at next TCB in TCB list */
; SOURCE LINE # 393
MOV R0,?C_IBP
INC R0
MOV AR3,@R0
INC R0
MOV A,@R0
MOV R2,A
INC R0
MOV A,@R0
MOV R1,A
MOV DPTR,#02H
LCALL ?C?CLDOPTR
MOV R0,?C_IBP
INC R0
MOV @R0,#00H
INC R0
MOV @R0,#00H
INC R0
MOV @R0,A
; OS_EXIT_CRITICAL();
; SOURCE LINE # 394
MOV R0,?C_IBP
MOV A,@R0
ADD A,#0FFH
MOV EA,C
; }
; SOURCE LINE # 395
AJMP ?C0014
; }
; SOURCE LINE # 396
; }
; SOURCE LINE # 397
?C0020:
MOV A,?C_IBP
ADD A,#04H
MOV ?C_IBP,A
RET
; 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) KCREENTRANT
RSEG ?PR?_?OSVersion?OS_CORE
_?OSVersion:
USING 0
; SOURCE LINE # 413
; {
; return (OS_VERSION);
; SOURCE LINE # 415
MOV R6,#00H
MOV R7,#0FCH
; }
; SOURCE LINE # 416
?C0021:
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)
; {
; }
; #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) KCREENTRANT
RSEG ?PR?_?OS_EventTaskRdy?OS_CORE
_?OS_EventTaskRdy:
USING 0
; SOURCE LINE # 460
DEC ?C_IBP
DEC ?C_IBP
DEC ?C_IBP
MOV R0,?C_IBP
MOV @R0,AR3
INC R0
MOV @R0,AR2
INC R0
MOV @R0,AR1
MOV A,?C_IBP
ADD A,#0F8H
MOV ?C_IBP,A
; {
; 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 # 470
ADD A,#08H
MOV R0,A
MOV AR3,@R0
INC R0
MOV A,@R0
MOV R2,A
INC R0
MOV A,@R0
MOV R1,A
MOV DPTR,#01H
LCALL ?C?CLDOPTR
MOV DPTR,#OSUnMapTbl
MOVC A,@A+DPTR
MOV R7,A
MOV A,?C_IBP
ADD A,#04H
MOV R0,A
MOV @R0,AR7
; bity = OSMapTbl[y];
; SOURCE LINE # 471
MOV A,@R0
MOV R7,A
MOV DPTR,#OSMapTbl
MOVC A,@A+DPTR
MOV R6,A
MOV A,?C_IBP
ADD A,#06H
MOV R0,A
MOV @R0,AR6
; x = OSUnMapTbl[pevent->OSEventTbl[y]];
; SOURCE LINE # 472
MOV A,R1
ADD A,#06H
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
MOV DPTR,#OSUnMapTbl
MOVC A,@A+DPTR
MOV R6,A
MOV A,?C_IBP
ADD A,#03H
MOV R0,A
MOV @R0,AR6
; bitx = OSMapTbl[x];
; SOURCE LINE # 473
MOV A,@R0
MOV R6,A
MOV DPTR,#OSMapTbl
MOVC A,@A+DPTR
MOV R5,A
MOV A,?C_IBP
ADD A,#05H
MOV R0,A
MOV @R0,AR5
; prio = (INT8U)((y << 3) + x); /* Find priority of task getting the msg */
; SOURCE LINE # 474
MOV A,?C_IBP
ADD A,#04H
MOV R0,A
MOV A,@R0
RLC A
RLC A
RLC A
ANL A,#0F8H
ADD A,R6
MOV R6,A
MOV A,?C_IBP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -