📄 os_core.src
字号:
; * Returns : none
; *********************************************************************************************************
; */
;
; static void OS_InitTaskIdle (void)
RSEG ?PR?OS_InitTaskIdle?OS_CORE
OS_InitTaskIdle:
USING 0
; SOURCE LINE # 713
; {
; SOURCE LINE # 714
; #if OS_TASK_CREATE_EXT_EN > 0
; #if OS_STK_GROWTH == 1
; (void)OSTaskCreateExt(OS_TaskIdle,
; (void *)0, /* No arguments passed to OS_TaskIdle() */
; &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
; (void)OSTaskCreateExt(OS_TaskIdle,
; (void *)0, /* No arguments passed to OS_TaskIdle() */
; &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 */
; #endif
; #else
; #if OS_STK_GROWTH == 1
; (void)OSTaskCreate(OS_TaskIdle,
; (void *)0,
; &OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1],
; OS_IDLE_PRIO);
; #else
; (void)OSTaskCreate(OS_TaskIdle,
; (void *)0,
; SOURCE LINE # 745
MOV DPTR,#?_OSTaskCreate?BYTE+03H
CLR A
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
INC DPTR
INC A
MOVX @DPTR,A
INC DPTR
MOV A,#HIGH (OSTaskIdleStk)
MOVX @DPTR,A
INC DPTR
MOV A,#LOW (OSTaskIdleStk)
MOVX @DPTR,A
INC DPTR
MOV A,#0CH
MOVX @DPTR,A
MOV R3,#0FFH
MOV R2,#HIGH (_OS_TaskIdle)
MOV R1,#LOW (_OS_TaskIdle)
LJMP _OSTaskCreate
; END OF OS_InitTaskIdle
; &OSTaskIdleStk[0],
; OS_IDLE_PRIO);
; #endif
; #endif
; }
; /*$PAGE*/
; /*
; *********************************************************************************************************
; * INITIALIZATION
; * CREATING THE STATISTIC TASK
; *
; * Description: This function creates the Statistic Task.
; *
; * Arguments : none
; *
; * Returns : none
; *********************************************************************************************************
; */
;
; #if OS_TASK_STAT_EN > 0
; static void OS_InitTaskStat (void)
; {
; #if OS_TASK_CREATE_EXT_EN > 0
; #if OS_STK_GROWTH == 1
; (void)OSTaskCreateExt(OS_TaskStat,
; (void *)0, /* No args passed to OS_TaskStat()*/
; &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
; (void)OSTaskCreateExt(OS_TaskStat,
; (void *)0, /* No args passed to OS_TaskStat()*/
; &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
; (void)OSTaskCreate(OS_TaskStat,
; (void *)0, /* No args passed to OS_TaskStat()*/
; &OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1], /* Set Top-Of-Stack */
; OS_STAT_PRIO); /* One higher than the idle task */
; #else
; (void)OSTaskCreate(OS_TaskStat,
; (void *)0, /* No args passed to OS_TaskStat()*/
; &OSTaskStatStk[0], /* Set Top-Of-Stack */
; OS_STAT_PRIO); /* One higher than the idle task */
; #endif
; #endif
; }
; #endif
; /*$PAGE*/
; /*
; *********************************************************************************************************
; * INITIALIZATION
; * INITIALIZE THE FREE LIST OF TASK CONTROL BLOCKS
; *
; * Description: This function is called by OSInit() to initialize the free list of OS_TCBs.
; *
; * Arguments : none
; *
; * Returns : none
; *********************************************************************************************************
; */
;
; static void OS_InitTCBList (void)
RSEG ?PR?OS_InitTCBList?OS_CORE
OS_InitTCBList:
USING 0
; SOURCE LINE # 819
; {
; SOURCE LINE # 820
; INT8U i;
; OS_TCB *ptcb1;
; OS_TCB *ptcb2;
;
;
; OSTCBList = (OS_TCB *)0; /* TCB Initialization */
; SOURCE LINE # 826
MOV DPTR,#OSTCBList
CLR A
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
; for (i = 0; i < (OS_LOWEST_PRIO + 1); i++) { /* Clear the priority table */
; SOURCE LINE # 827
;---- Variable 'i?1242' assigned to Register 'R7' ----
MOV R7,A
?C0037:
; OSTCBPrioTbl[i] = (OS_TCB *)0;
; SOURCE LINE # 828
MOV A,R7
MOV B,#03H
MUL AB
ADD A,#LOW (OSTCBPrioTbl)
MOV DPL,A
CLR A
ADDC A,#HIGH (OSTCBPrioTbl)
MOV DPH,A
CLR A
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
; }
; SOURCE LINE # 829
INC R7
MOV A,R7
CJNE A,#0DH,?C0037
?C0038:
; ptcb1 = &OSTCBTbl[0];
; SOURCE LINE # 830
MOV DPTR,#ptcb1?1243
MOV A,#01H
MOVX @DPTR,A
INC DPTR
MOV A,#HIGH (OSTCBTbl)
MOVX @DPTR,A
INC DPTR
MOV A,#LOW (OSTCBTbl)
MOVX @DPTR,A
; ptcb2 = &OSTCBTbl[1];
; SOURCE LINE # 831
INC DPTR
MOV A,#01H
MOVX @DPTR,A
INC DPTR
MOV A,#HIGH (OSTCBTbl+011H)
MOVX @DPTR,A
INC DPTR
MOV A,#LOW (OSTCBTbl+011H)
MOVX @DPTR,A
; for (i = 0; i < (OS_MAX_TASKS + OS_N_SYS_TASKS - 1); i++) { /* Init. list of free TCBs */
; SOURCE LINE # 832
CLR A
MOV R7,A
?C0040:
; ptcb1->OSTCBNext = ptcb2;
; SOURCE LINE # 833
MOV DPTR,#ptcb2?1244
MOVX A,@DPTR
MOV R3,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R1,A
PUSH AR3
PUSH AR2
PUSH AR1
MOV DPTR,#ptcb1?1243
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?PSTOPTR
; ptcb1++;
; SOURCE LINE # 834
MOV DPTR,#ptcb1?1243+01H
CLR A
MOV B,#011H
LCALL ?C?IILDX
; ptcb2++;
; SOURCE LINE # 835
MOV DPTR,#ptcb2?1244+01H
CLR A
MOV B,#011H
LCALL ?C?IILDX
; }
; SOURCE LINE # 836
INC R7
MOV A,R7
CJNE A,#0BH,?C0040
?C0041:
; ptcb1->OSTCBNext = (OS_TCB *)0; /* Last OS_TCB */
; SOURCE LINE # 837
MOV R3,#00H
MOV R2,#00H
MOV R1,#00H
PUSH AR3
PUSH AR2
PUSH AR1
MOV DPTR,#ptcb1?1243
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?PSTOPTR
; OSTCBFreeList = &OSTCBTbl[0];
; SOURCE LINE # 838
MOV DPTR,#OSTCBFreeList
MOV A,#01H
MOVX @DPTR,A
INC DPTR
MOV A,#HIGH (OSTCBTbl)
MOVX @DPTR,A
INC DPTR
MOV A,#LOW (OSTCBTbl)
MOVX @DPTR,A
; }
; SOURCE LINE # 839
RET
; END OF OS_InitTCBList
; /*$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 OS_SchedLock())
; *********************************************************************************************************
; */
;
; void OS_Sched (void)
RSEG ?PR?OS_Sched?OS_CORE
OS_Sched:
USING 0
; SOURCE LINE # 858
; {
; SOURCE LINE # 859
;
; INT8U y;
;
;
; OS_ENTER_CRITICAL();
; SOURCE LINE # 864
CLR EA
; if ((OSIntNesting == 0) && (OSLockNesting == 0)) { /* Sched. only if all ISRs done & not locked */
; SOURCE LINE # 865
MOV DPTR,#OSIntNesting
MOVX A,@DPTR
JZ $ + 5H
LJMP ?C0044
MOV DPTR,#OSLockNesting
MOVX A,@DPTR
JNZ ?C0044
; y = OSUnMapTbl[OSRdyGrp]; /* Get pointer to HPT ready to run */
; SOURCE LINE # 866
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 R7,A
;---- Variable 'y?1345' assigned to Register 'R7' ----
; OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
; SOURCE LINE # 867
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 # 868
DEC R0
MOV A,@R0
XRL A,R7
JZ ?C0044
; OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
; SOURCE LINE # 869
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 # 870
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 # 871
LCALL OSCtxSw
; }
; SOURCE LINE # 872
; }
; SOURCE LINE # 873
?C0044:
; OS_EXIT_CRITICAL();
; SOURCE LINE # 874
SETB EA
; }
; SOURCE LINE # 875
RET
; END OF OS_Sched
; /*$PAGE*/
; /*
; *********************************************************************************************************
; * IDLE TASK
; *
; * Description: This task is internal to uC/OS-II and executes whenever no other higher priority tasks
; * executes because they are ALL waiting for event(s) to occur.
; *
; * Arguments : none
; *
; * Returns : none
; *
; * Note(s) : 1) OSTaskIdleHook() is called after the critical section to ensure that interrupts will be
; * enabled for at least a few instructions. On some processors (ex. Philips XA), enabling
; * and then disabling interrupts didn't allow the processor enough time to have interrupts
; * enabled before they were disabled again. uC/OS-II would thus never recognize
; * interrupts.
; * 2) This hook has been added to allow you to do such things as STOP the CPU to conserve
; * power.
; *********************************************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -