📄 os_core.src
字号:
MOV DPL,?C_XBP+01H
CLR A
MOV B,#01H
LCALL ?C?IILDX
SJMP ?C0010
?C0011:
; OSEventTbl[OS_MAX_EVENTS - 1].OSEventPtr = (OS_EVENT *)0;
; SOURCE LINE # 267
MOV DPTR,#OSEventTbl+0BH
CLR A
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
; OSEventFreeList = &OSEventTbl[0];
; SOURCE LINE # 268
MOV R3,#01H
MOV DPTR,#OSEventFreeList
INC A
MOVX @DPTR,A
INC DPTR
MOV A,#HIGH (OSEventTbl)
MOVX @DPTR,A
INC DPTR
MOV A,#LOW (OSEventTbl)
MOVX @DPTR,A
; #endif
;
; #if OS_Q_EN && (OS_MAX_QS >= 2)
; OSQInit(); /* Initialize the message queue structures */
; #endif
;
; #if OS_MEM_EN && OS_MAX_MEM_PART >= 2
; OSMemInit(); /* Initialize the memory manager */
; #endif
;
; #if OS_STK_GROWTH == 1
; #if OS_TASK_CREATE_EXT_EN
; OSTaskCreateExt(OSTaskIdle,
; (void *)0, /* No arguments passed to OSTaskIdle() */
; &OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1], /* Set Top-Of-Stack */
; OS_IDLE_PRIO, /* Lowest priority level */
; OS_TASK_IDLE_ID,
; &OSTaskIdleStk[0], /* Set Bottom-Of-Stack */
; OS_TASK_IDLE_STK_SIZE,
; (void *)0, /* No TCB extension */
; OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);/* Enable stack checking + clear stack */
; #else
; OSTaskCreate(OSTaskIdle, (void *)0, &OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1], OS_IDLE_PRIO);
; #endif
; #else
; #if OS_TASK_CREATE_EXT_EN
; OSTaskCreateExt(OSTaskIdle,
; (void *)0, /* No arguments passed to OSTaskIdle() */
; &OSTaskIdleStk[0], /* Set Top-Of-Stack */
; OS_IDLE_PRIO, /* Lowest priority level */
; OS_TASK_IDLE_ID,
; &OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1], /* Set Bottom-Of-Stack */
; OS_TASK_IDLE_STK_SIZE,
; (void *)0, /* No TCB extension */
; OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);/* Enable stack checking + clear stack */
; #else
; OSTaskCreate(OSTaskIdle, (void *)0, &OSTaskIdleStk[0], OS_IDLE_PRIO);
; SOURCE LINE # 305
MOV DPTR,#0FFFFH
LCALL ?C?ADDXBP
MOV A,#01CH
MOVX @DPTR,A
MOV R3,#01H
MOV R2,#HIGH (OSTaskIdleStk)
MOV R1,#LOW (OSTaskIdleStk)
MOV DPTR,#0FFFDH
LCALL ?C?ADDXBP
MOV A,R3
MOVX @DPTR,A
INC DPTR
MOV A,R2
MOVX @DPTR,A
INC DPTR
MOV A,R1
MOVX @DPTR,A
MOV R3,#00H
MOV R2,#00H
MOV R1,#00H
MOV DPTR,#0FFFDH
LCALL ?C?ADDXBP
MOV A,R3
MOVX @DPTR,A
INC DPTR
MOV A,R2
MOVX @DPTR,A
INC DPTR
MOV A,R1
MOVX @DPTR,A
MOV R3,#0FFH
MOV R2,#HIGH (_?OSTaskIdle)
MOV R1,#LOW (_?OSTaskIdle)
LCALL _?OSTaskCreate
; #endif
; #endif
;
; #if OS_TASK_STAT_EN
; #if OS_TASK_CREATE_EXT_EN
; #if OS_STK_GROWTH == 1
; OSTaskCreateExt(OSTaskStat,
; (void *)0, /* No args passed to OSTaskStat() */
; &OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1],/* Set Top-Of-Stack */
; OS_STAT_PRIO, /* One higher than the idle task */
; OS_TASK_STAT_ID,
; &OSTaskStatStk[0], /* Set Bottom-Of-Stack */
; OS_TASK_STAT_STK_SIZE,
; (void *)0, /* No TCB extension */
; OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); /* Enable stack checking + clear */
; #else
; OSTaskCreateExt(OSTaskStat,
; (void *)0, /* No args passed to OSTaskStat() */
; &OSTaskStatStk[0], /* Set Top-Of-Stack */
; OS_STAT_PRIO, /* One higher than the idle task */
; OS_TASK_STAT_ID,
; &OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1],/* Set Bottom-Of-Stack */
; OS_TASK_STAT_STK_SIZE,
; (void *)0, /* No TCB extension */
; OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); /* Enable stack checking + clear */
; #endif
; #else
; #if OS_STK_GROWTH == 1
; OSTaskCreate(OSTaskStat,
; (void *)0, /* No args passed to OSTaskStat() */
; &OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1], /* Set Top-Of-Stack */
; OS_STAT_PRIO); /* One higher than the idle task */
; #else
; OSTaskCreate(OSTaskStat,
; (void *)0, /* No args passed to OSTaskStat() */
; &OSTaskStatStk[0], /* Set Top-Of-Stack */
; OS_STAT_PRIO); /* One higher than the idle task */
; #endif
; #endif
; #endif
; }
; SOURCE LINE # 346
MOV DPTR,#02H
LJMP ?C?ADDXBP
; END OF _?OSInit
; /*$PAGE*/
; /*
; *********************************************************************************************************
; * ENTER ISR
; *
; * Description: This function is used to notify uC/OS-II that you are about to service an interrupt
; * service routine (ISR). This allows uC/OS-II to keep track of interrupt nesting and thus
; * only perform rescheduling at the last nested ISR.
; *
; * Arguments : none
; *
; * Returns : none
; *
; * Notes : 1) Your ISR can directly increment OSIntNesting without calling this function because
; * OSIntNesting has been declared 'global'. You MUST, however, be sure that the increment
; * is performed 'indivisibly' by your processor to ensure proper access to this critical
; * resource.
; * 2) You MUST still call OSIntExit() even though you increment OSIntNesting directly.
; * 3) You MUST invoke OSIntEnter() and OSIntExit() in pair. In other words, for every call
; * to OSIntEnter() at the beginning of the ISR you MUST have a call to OSIntExit() at the
; * end of the ISR.
; *********************************************************************************************************
; */
;
; void OSIntEnter (void) reentrant
RSEG ?PR?_?OSIntEnter?OS_CORE
_?OSIntEnter:
; SOURCE LINE # 371
; {
; OS_ENTER_CRITICAL();
; SOURCE LINE # 373
CLR EA
; OSIntNesting++; /* Increment ISR nesting level */
; SOURCE LINE # 374
MOV DPTR,#OSIntNesting
MOVX A,@DPTR
INC A
MOVX @DPTR,A
; OS_EXIT_CRITICAL();
; SOURCE LINE # 375
SETB EA
; }
; SOURCE LINE # 376
RET
; END OF _?OSIntEnter
; /*$PAGE*/
; /*
; *********************************************************************************************************
; * EXIT ISR
; *
; * Description: This function is used to notify uC/OS-II that you have completed serviving an ISR. When
; * the last nested ISR has completed, uC/OS-II will call the scheduler to determine whether
; * a new, high-priority task, is ready to run.
; *
; * Arguments : none
; *
; * Returns : none
; *
; * Notes : 1) You MUST invoke OSIntEnter() and OSIntExit() in pair. In other words, for every call
; * to OSIntEnter() at the beginning of the ISR you MUST have a call to OSIntExit() at the
; * end of the ISR.
; * 2) Rescheduling is prevented when the scheduler is locked (see OSSchedLock())
; *********************************************************************************************************
; */
;
; void OSIntExit (void) reentrant
RSEG ?PR?_?OSIntExit?OS_CORE
_?OSIntExit:
USING 0
; SOURCE LINE # 397
; {
; OS_ENTER_CRITICAL();
; SOURCE LINE # 399
CLR EA
; if ((--OSIntNesting | OSLockNesting) == 0) { /* Reschedule only if all ISRs completed & not locked */
; SOURCE LINE # 400
MOV DPTR,#OSLockNesting
MOVX A,@DPTR
MOV R7,A
MOV DPTR,#OSIntNesting
MOVX A,@DPTR
DEC A
MOV R6,A
MOVX @DPTR,A
MOV A,R7
ORL A,R6
JNZ ?C0015
; OSIntExitY = OSUnMapTbl[OSRdyGrp];
; SOURCE LINE # 401
MOV DPTR,#OSRdyGrp
MOVX A,@DPTR
MOV DPTR,#OSUnMapTbl
MOVC A,@A+DPTR
MOV DPTR,#OSIntExitY
MOVX @DPTR,A
; OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]]);
; SOURCE LINE # 402
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
MOV DPTR,#OSUnMapTbl
MOVC A,@A+DPTR
MOV R6,A
MOV A,R7
RLC A
RLC A
RLC A
ANL A,#0F8H
MOV R7,A
MOV A,R6
ADD A,R7
MOV R7,A
MOV R0,#LOW (OSPrioHighRdy)
MOV @R0,A
; if (OSPrioHighRdy != OSPrioCur) { /* No context switch if current task is highest ready */
; SOURCE LINE # 403
DEC R0
MOV A,@R0
XRL A,R7
JZ ?C0015
; OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
; SOURCE LINE # 404
INC R0
MOV A,@R0
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
; OSCtxSwCtr++; /* Keep track of the number of context switches */
; SOURCE LINE # 405
MOV DPTR,#OSCtxSwCtr
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,#OSCtxSwCtr
LCALL ?C?LSTXDATA
; OSIntCtxSw(); /* Perform interrupt level context switch */
; SOURCE LINE # 406
LCALL OSIntCtxSw
; }
; SOURCE LINE # 407
; }
; SOURCE LINE # 408
?C0015:
; OS_EXIT_CRITICAL();
; SOURCE LINE # 409
SETB EA
; }
; SOURCE LINE # 410
RET
; END OF _?OSIntExit
; /*$PAGE*/
; /*
; *********************************************************************************************************
; * SCHEDULER
; *
; * Description: This function is called by other uC/OS-II services to determine whether a new, high
; * priority task has been made ready to run. This function is invoked by TASK level code
; * and is not used to reschedule tasks from ISRs (see OSIntExit() for ISR rescheduling).
; *
; * Arguments : none
; *
; * Returns : none
; *
; * Notes : 1) This function is INTERNAL to uC/OS-II and your application should not call it.
; * 2) Rescheduling is prevented when the scheduler is locked (see OSSchedLock())
; *********************************************************************************************************
; */
;
; void OSSched (void) reentrant
RSEG ?PR?_?OSSched?OS_CORE
_?OSSched:
USING 0
; SOURCE LINE # 429
MOV DPTR,#0FFFFH
LCALL ?C?ADDXBP
; {
; INT8U y;
;
;
; OS_ENTER_CRITICAL();
; SOURCE LINE # 434
CLR EA
; if ((OSLockNesting | OSIntNesting) == 0) { /* Task scheduling must be enabled and not ISR level */
; SOURCE LINE # 435
MOV DPTR,#OSIntNesting
MOVX A,@DPTR
MOV R7,A
MOV DPTR,#OSLockNesting
MOVX A,@DPTR
ORL A,R7
JNZ ?C0018
; y = OSUnMapTbl[OSRdyGrp]; /* Get pointer to highest priority task ready to run */
; SOURCE LINE # 436
MOV DPTR,#OSRdyGrp
MOVX A,@DPTR
MOV DPTR,#OSUnMapTbl
MOVC A,@A+DPTR
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX @DPTR,A
; OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
; SOURCE LINE # 437
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
MOV DPTR,#OSUnMapTbl
MOVC A,@A+DPTR
MOV R6,A
MOV A,R7
RLC A
RLC A
RLC A
ANL A,#0F8H
MOV R7,A
MOV A,R6
ADD A,R7
MOV R7,A
MOV R0,#LOW (OSPrioHighRdy)
MOV @R0,A
; if (OSPrioHighRdy != OSPrioCur) { /* No context switch if current task is highest ready */
; SOURCE LINE # 438
DEC R0
MOV A,@R0
XRL A,R7
JZ ?C0018
; OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
; SOURCE LINE # 439
INC R0
MOV A,@R0
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
; OSCtxSwCtr++; /* Increment context switch counter */
; SOURCE LINE # 440
MOV DPTR,#OSCtxSwCtr
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,#OSCtxSwCtr
LCALL ?C?LSTXDATA
; OS_TASK_SW(); /* Perform a context switch */
; SOURCE LINE # 441
LCALL OSCtxSw
; }
; SOURCE LINE # 442
; }
; SOURCE LINE # 443
?C0018:
; OS_EXIT_CRITICAL();
; SOURCE LINE # 444
SETB EA
; }
; SOURCE LINE # 445
MOV DPTR,#01H
LJMP ?C?ADDXBP
; END OF _?OSSched
; /*$PAGE*/
; /*
; *********************************************************************************************************
; * PREVENT SCHEDULING
; *
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -