?? os_core.src
字號:
; if (OSRunning == TRUE) {
; SOURCE LINE # 293
MOV R0,#LOW (OSRunning)
MOV A,@R0
CJNE A,#01H,?C0004
; if (OSIntNesting < 255u) {
; SOURCE LINE # 294
MOV DPTR,#OSIntNesting
MOVX A,@DPTR
CLR C
SUBB A,#0FFH
JNC ?C0004
; OSIntNesting++; /* Increment ISR nesting level */
; SOURCE LINE # 295
MOVX A,@DPTR
INC A
MOVX @DPTR,A
; }
; SOURCE LINE # 296
; }
; SOURCE LINE # 297
; }
; SOURCE LINE # 298
?C0004:
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 OS_SchedLock())
; *********************************************************************************************************
; */
;
; void OSIntExit (void) KCREENTRANT
RSEG ?PR?_?OSIntExit?OS_CORE
_?OSIntExit:
USING 0
; SOURCE LINE # 319
; {
; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
; OS_CPU_SR cpu_sr;
; #endif
;
;
; if (OSRunning == TRUE) {
; SOURCE LINE # 326
MOV R0,#LOW (OSRunning)
MOV A,@R0
XRL A,#01H
JZ $ + 5H
LJMP ?C0010
; OS_ENTER_CRITICAL();
; SOURCE LINE # 327
CLR EA
; if (OSIntNesting > 0) { /* Prevent OSIntNesting from wrapping */
; SOURCE LINE # 328
MOV DPTR,#OSIntNesting
MOVX A,@DPTR
SETB C
SUBB A,#00H
JC ?C0006
; OSIntNesting--;
; SOURCE LINE # 329
MOVX A,@DPTR
DEC A
MOVX @DPTR,A
; }
; SOURCE LINE # 330
?C0006:
; if (OSIntNesting == 0) { /* Reschedule only if all ISRs complete ... */
; SOURCE LINE # 331
MOV DPTR,#OSIntNesting
MOVX A,@DPTR
JZ $ + 5H
LJMP ?C0007
; if (OSLockNesting == 0) { /* ... and not locked. */
; SOURCE LINE # 332
MOV DPTR,#OSLockNesting
MOVX A,@DPTR
JZ $ + 5H
LJMP ?C0007
; OSIntExitY = OSUnMapTbl[OSRdyGrp];
; SOURCE LINE # 333
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 DPTR,#OSIntExitY
MOVX @DPTR,A
; OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]]);
; SOURCE LINE # 334
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 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 Ctx Sw if current task is highest rdy */
; SOURCE LINE # 335
DEC R0
MOV A,@R0
XRL A,R7
JZ ?C0007
; OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
; SOURCE LINE # 336
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 R1,A
MOV R0,#LOW (OSTCBHighRdy)
MOV @R0,AR3
INC R0
MOV @R0,AR2
INC R0
MOV @R0,A
; #if OS_TASK_PROFILE_EN > 0
; OSTCBHighRdy->OSTCBCtxSwCtr++; /* Inc. # of context switches to this task */
; SOURCE LINE # 338
MOV DPTR,#020H
LCALL ?C?LLDOPTR
MOV A,R7
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,#020H
LCALL ?C?LSTOPTR
; #endif
; OSCtxSwCtr++; /* Keep track of the number of ctx switches */
; SOURCE LINE # 340
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 ctx switch */
; SOURCE LINE # 341
LCALL OSIntCtxSw
; }
; SOURCE LINE # 342
; }
; SOURCE LINE # 343
; }
; SOURCE LINE # 344
?C0007:
; OS_EXIT_CRITICAL();
; SOURCE LINE # 345
SETB EA
; }
; SOURCE LINE # 346
; }
; SOURCE LINE # 347
?C0010:
RET
; END OF _?OSIntExit
; /*$PAGE*/
; /*
; *********************************************************************************************************
; * PREVENT SCHEDULING
; *
; * Description: This function is used to prevent rescheduling to take place. This allows your application
; * to prevent context switches until you are ready to permit context switching.
; *
; * Arguments : none
; *
; * Returns : none
; *
; * Notes : 1) You MUST invoke OSSchedLock() and OSSchedUnlock() in pair. In other words, for every
; * call to OSSchedLock() you MUST have a call to OSSchedUnlock().
; *********************************************************************************************************
; */
;
; #if OS_SCHED_LOCK_EN > 0
; void OSSchedLock (void) KCREENTRANT
RSEG ?PR?_?OSSchedLock?OS_CORE
_?OSSchedLock:
USING 0
; SOURCE LINE # 366
; {
; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
; OS_CPU_SR cpu_sr;
; #endif
;
;
; if (OSRunning == TRUE) { /* Make sure multitasking is running */
; SOURCE LINE # 373
MOV R0,#LOW (OSRunning)
MOV A,@R0
CJNE A,#01H,?C0013
; OS_ENTER_CRITICAL();
; SOURCE LINE # 374
CLR EA
; if (OSLockNesting < 255u) { /* Prevent OSLockNesting from wrapping back to 0 */
; SOURCE LINE # 375
MOV DPTR,#OSLockNesting
MOVX A,@DPTR
CLR C
SUBB A,#0FFH
JNC ?C0012
; OSLockNesting++; /* Increment lock nesting level */
; SOURCE LINE # 376
MOVX A,@DPTR
INC A
MOVX @DPTR,A
; }
; SOURCE LINE # 377
?C0012:
; OS_EXIT_CRITICAL();
; SOURCE LINE # 378
SETB EA
; }
; SOURCE LINE # 379
; }
; SOURCE LINE # 380
?C0013:
RET
; END OF _?OSSchedLock
; #endif
;
; /*$PAGE*/
; /*
; *********************************************************************************************************
; * ENABLE SCHEDULING
; *
; * Description: This function is used to re-allow rescheduling.
; *
; * Arguments : none
; *
; * Returns : none
; *
; * Notes : 1) You MUST invoke OSSchedLock() and OSSchedUnlock() in pair. In other words, for every
; * call to OSSchedLock() you MUST have a call to OSSchedUnlock().
; *********************************************************************************************************
; */
;
; #if OS_SCHED_LOCK_EN > 0
; void OSSchedUnlock (void) KCREENTRANT
RSEG ?PR?_?OSSchedUnlock?OS_CORE
_?OSSchedUnlock:
USING 0
; SOURCE LINE # 400
; {
; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
; OS_CPU_SR cpu_sr;
; #endif
;
;
; if (OSRunning == TRUE) { /* Make sure multitasking is running */
; SOURCE LINE # 407
MOV R0,#LOW (OSRunning)
MOV A,@R0
XRL A,#01H
JNZ ?C0021
; OS_ENTER_CRITICAL();
; SOURCE LINE # 408
CLR EA
; if (OSLockNesting > 0) { /* Do not decrement if already 0 */
; SOURCE LINE # 409
MOV DPTR,#OSLockNesting
MOVX A,@DPTR
SETB C
SUBB A,#00H
JC ?C0015
; OSLockNesting--; /* Decrement lock nesting level */
; SOURCE LINE # 410
MOVX A,@DPTR
DEC A
MOVX @DPTR,A
; if (OSLockNesting == 0) { /* See if scheduler is enabled and ... */
; SOURCE LINE # 411
MOVX A,@DPTR
JNZ ?C0016
; if (OSIntNesting == 0) { /* ... not in an ISR */
; SOURCE LINE # 412
MOV DPTR,#OSIntNesting
MOVX A,@DPTR
JNZ ?C0017
; OS_EXIT_CRITICAL();
; SOURCE LINE # 413
SETB EA
; OS_Sched(); /* See if a HPT is ready */
; SOURCE LINE # 414
LJMP _?OS_Sched
; } else {
; SOURCE LINE # 415
?C0017:
; OS_EXIT_CRITICAL();
; SOURCE LINE # 416
SETB EA
; }
; SOURCE LINE # 417
; } else {
; SOURCE LINE # 418
RET
?C0016:
; OS_EXIT_CRITICAL();
; SOURCE LINE # 419
SETB EA
; }
; SOURCE LINE # 420
; } else {
; SOURCE LINE # 421
RET
?C0015:
; OS_EXIT_CRITICAL();
; SOURCE LINE # 422
SETB EA
; }
; SOURCE LINE # 423
; }
; SOURCE LINE # 424
; }
; SOURCE LINE # 425
?C0021:
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) KCREENTRANT
RSEG ?PR?_?OSStart?OS_CORE
_?OSStart:
USING 0
; SOURCE LINE # 449
MOV DPTR,#0FFFEH
LCALL ?C?ADDXBP
; {
; INT8U y;
; INT8U x;
;
;
; if (OSRunning == FALSE) {
; SOURCE LINE # 455
MOV R0,#LOW (OSRunning)
MOV A,@R0
JNZ ?C0023
; y = OSUnMapTbl[OSRdyGrp]; /* Find highest priority's task priority number */
; SOURCE LINE # 456
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 # 457
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
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -