📄 os_core.src
字号:
; 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
; 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
; 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
; 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
; 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
; 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
; 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
; 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
; 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
; 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
; 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
; 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
; 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
; 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
; 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
; };
;
; /*$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_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN || OS_SEM_EN
; void OSEventTaskRdy (OS_EVENT *pevent, void *msg, INT8U msk) reentrant
; {
; OS_TCB *ptcb;
; INT8U x;
; INT8U y;
; INT8U bitx;
; INT8U bity;
; INT8U prio;
;
;
; y = OSUnMapTbl[pevent->OSEventGrp]; /* Find highest prio. task waiting for message */
; bity = OSMapTbl[y];
; x = OSUnMapTbl[pevent->OSEventTbl[y]];
; bitx = OSMapTbl[x];
; prio = (INT8U)((y << 3) + x); /* Find priority of task getting the msg */
; if ((pevent->OSEventTbl[y] &= ~bitx) == 0) { /* Remove this task from the waiting list */
; pevent->OSEventGrp &= ~bity;
; }
; ptcb = OSTCBPrioTbl[prio]; /* Point to this task's OS_TCB */
; ptcb->OSTCBDly = 0; /* Prevent OSTimeTick() from readying task */
; ptcb->OSTCBEventPtr = (OS_EVENT *)0; /* Unlink ECB from this task */
; #if (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN
; ptcb->OSTCBMsg = msg; /* Send message directly to waiting task */
; #else
; msg = msg; /* Prevent compiler warning if not used */
; #endif
; ptcb->OSTCBStat &= ~msk; /* Clear bit associated with event type */
; if (ptcb->OSTCBStat == OS_STAT_RDY) { /* See if task is ready (could be susp'd) */
; OSRdyGrp |= bity; /* Put task in the ready to run list */
; OSRdyTbl[y] |= bitx;
; }
; }
; #endif
; /*$PAGE*/
; /*
; *********************************************************************************************************
; * MAKE TASK WAIT FOR EVENT TO OCCUR
; *
; * Description: This function is called by other uC/OS-II services to suspend a task because an event has
; * not occurred.
; *
; * Arguments : pevent is a pointer to the event control block for which the task will be waiting for.
; *
; * Returns : none
; *
; * Note : This function is INTERNAL to uC/OS-II and your application should not call it.
; *********************************************************************************************************
; */
; #if (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN || OS_SEM_EN
; void OSEventTaskWait (OS_EVENT *pevent) reentrant
; {
; OSTCBCur->OSTCBEventPtr = pevent; /* Store pointer to event control block in TCB */
; if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0) { /* Task no longer ready */
; OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
; }
; pevent->OSEventTbl[OSTCBCur->OSTCBY] |= OSTCBCur->OSTCBBitX; /* Put task in waiting list */
; pevent->OSEventGrp |= OSTCBCur->OSTCBBitY;
; }
; #endif
; /*$PAGE*/
; /*
; *********************************************************************************************************
; * MAKE TASK READY TO RUN BASED ON EVENT TIMEOUT
; *
; * Description: This function is called by other uC/OS-II services to make a task ready to run because a
; * timeout occurred.
; *
; * Arguments : pevent is a pointer to the event control block which is readying a task.
; *
; * Returns : none
; *
; * Note : This function is INTERNAL to uC/OS-II and your application should not call it.
; *********************************************************************************************************
; */
; #if (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN || OS_SEM_EN
; void OSEventTO (OS_EVENT *pevent) reentrant
; {
; if ((pevent->OSEventTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0) {
; pevent->OSEventGrp &= ~OSTCBCur->OSTCBBitY;
; }
; OSTCBCur->OSTCBStat = OS_STAT_RDY; /* Set status to ready */
; OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0; /* No longer waiting for event */
; }
; #endif
; /*$PAGE*/
; /*
; *********************************************************************************************************
; * INITIALIZE EVENT CONTROL BLOCK'S WAIT LIST
; *
; * Description: This function is called by other uC/OS-II services to initialize the event wait list.
; *
; * Arguments : pevent is a pointer to the event control block allocated to the event.
; *
; * Returns : none
; *
; * Note : This function is INTERNAL to uC/OS-II and your application should not call it.
; *********************************************************************************************************
; */
; #if (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_MBOX_EN || OS_SEM_EN
; void OSEventWaitListInit (OS_EVENT *pevent) reentrant
; {
; INT8U i;
;
;
; pevent->OSEventGrp = 0x00; /* No task waiting on event */
; for (i = 0; i < OS_EVENT_TBL_SIZE; i++) {
; pevent->OSEventTbl[i] = 0x00;
; }
; }
; #endif
; /*$PAGE*/
; /*
; *********************************************************************************************************
; * INITIALIZATION
; *
; * Description: This function is used to initialize the internals of uC/OS-II and MUST be called prior to
; * creating any uC/OS-II object and, prior to calling OSStart().
; *
; * Arguments : none
; *
; * Returns : none
; *********************************************************************************************************
; */
;
; void OSInit (void) reentrant
RSEG ?PR?_?OSInit?OS_CORE
_?OSInit:
USING 0
; SOURCE LINE # 225
MOV DPTR,#0FFFEH
LCALL ?C?ADDXBP
; {
; INT16U i;
;
;
; OSTime = 0L; /* Clear the 32-bit system clock */
; SOURCE LINE # 230
MOV DPTR,#OSTime
LCALL ?C?LSTKXDATA
DB 00H
DB 00H
DB 00H
DB 00H
; OSIntNesting = 0; /* Clear the interrupt nesting counter */
; SOURCE LINE # 231
CLR A
MOV DPTR,#OSIntNesting
MOVX @DPTR,A
; OSLockNesting = 0; /* Clear the scheduling lock counter */
; SOURCE LINE # 232
MOV DPTR,#OSLockNesting
MOVX @DPTR,A
; #if OS_TASK_CREATE_EN || OS_TASK_CREATE_EXT_EN || OS_TASK_DEL_EN
; OSTaskCtr = 0; /* Clear the number of tasks */
; SOURCE LINE # 234
MOV DPTR,#OSTaskCtr
MOVX @DPTR,A
; #endif
; OSRunning = FALSE; /* Indicate that multitasking not started */
; SOURCE LINE # 236
MOV R0,#LOW (OSRunning)
MOV @R0,A
; OSIdleCtr = 0L; /* Clear the 32-bit idle counter */
; SOURCE LINE # 237
MOV DPTR,#OSIdleCtr
LCALL ?C?LSTKXDATA
DB 00H
DB 00H
DB 00H
DB 00H
; #if OS_TASK_STAT_EN && OS_TASK_CREATE_EXT_EN
; OSIdleCtrRun = 0L;
; OSIdleCtrMax = 0L;
; OSStatRdy = FALSE; /* Statistic task is not ready */
; #endif
; OSCtxSwCtr = 0; /* Clear the context switch counter */
; SOURCE LINE # 243
MOV DPTR,#OSCtxSwCtr
LCALL ?C?LSTKXDATA
DB 00H
DB 00H
DB 00H
DB 00H
; OSRdyGrp = 0; /* Clear the ready list */
; SOURCE LINE # 244
CLR A
MOV DPTR,#OSRdyGrp
MOVX @DPTR,A
; for (i = 0; i < OS_RDY_TBL_SIZE; i++) {
; SOURCE LINE # 245
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
?C0001:
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
CLR C
SUBB A,#04H
MOV A,R6
SUBB A,#00H
JNC ?C0002
; OSRdyTbl[i] = 0;
; SOURCE LINE # 246
MOV A,#LOW (OSRdyTbl)
ADD A,R7
MOV DPL,A
CLR A
ADDC A,#HIGH (OSRdyTbl)
MOV DPH,A
CLR A
MOVX @DPTR,A
; }
; SOURCE LINE # 247
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOV B,#01H
LCALL ?C?IILDX
SJMP ?C0001
?C0002:
;
; OSPrioCur = 0;
; SOURCE LINE # 249
CLR A
MOV R0,#LOW (OSPrioCur)
MOV @R0,A
; OSPrioHighRdy = 0;
; SOURCE LINE # 250
INC R0
MOV @R0,A
; OSTCBHighRdy = (OS_TCB *)0; /* TCB Initialization */
; SOURCE LINE # 251
MOV R0,#LOW (OSTCBHighRdy)
MOV @R0,A
INC R0
MOV @R0,A
INC R0
MOV @R0,A
; OSTCBCur = (OS_TCB *)0;
; SOURCE LINE # 252
MOV R0,#LOW (OSTCBCur)
MOV @R0,A
INC R0
MOV @R0,A
INC R0
MOV @R0,A
; OSTCBList = (OS_TCB *)0;
; SOURCE LINE # 253
MOV R1,A
MOV DPTR,#OSTCBList
XCH A,R1
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
INC DPTR
MOV A,R1
MOVX @DPTR,A
; for (i = 0; i < (OS_LOWEST_PRIO + 1); i++) { /* Clear the priority table */
; SOURCE LINE # 254
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
CLR A
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
?C0004:
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
CLR C
SUBB A,#01DH
MOV A,R6
SUBB A,#00H
JNC ?C0005
; OSTCBPrioTbl[i] = (OS_TCB *)0;
; SOURCE LINE # 255
MOV DPTR,#OSTCBPrioTbl
MOV B,#03H
MOV A,R7
LCALL ?C?OFFXADD
MOV A,R6
MOV B,#03H
MUL AB
ADD A,DPH
MOV DPH,A
CLR A
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
; }
; SOURCE LINE # 256
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOV B,#01H
LCALL ?C?IILDX
SJMP ?C0004
?C0005:
; for (i = 0; i < (OS_MAX_TASKS + OS_N_SYS_TASKS - 1); i++) { /* Init. list of free TCBs */
; SOURCE LINE # 257
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
CLR A
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
?C0007:
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
CLR C
SUBB A,#01BH
MOV A,R6
SUBB A,#00H
JNC ?C0008
; OSTCBTbl[i].OSTCBNext = &OSTCBTbl[i + 1];
; SOURCE LINE # 258
MOV R4,#00H
MOV R5,#011H
LCALL ?C?IMUL
MOV A,#LOW (OSTCBTbl+011H)
ADD A,R7
MOV R1,A
MOV A,#HIGH (OSTCBTbl+011H)
ADDC A,R6
MOV R2,A
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV DPTR,#OSTCBTbl+03H
MOV B,#011H
LCALL ?C?OFFXADD
MOV A,R6
MOV B,#011H
MUL AB
ADD A,DPH
MOV DPH,A
MOV A,#01H
MOVX @DPTR,A
INC DPTR
MOV A,R2
MOVX @DPTR,A
INC DPTR
MOV A,R1
MOVX @DPTR,A
; }
; SOURCE LINE # 259
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
CLR A
MOV B,#01H
LCALL ?C?IILDX
SJMP ?C0007
?C0008:
; OSTCBTbl[OS_MAX_TASKS + OS_N_SYS_TASKS - 1].OSTCBNext = (OS_TCB *)0; /* Last OS_TCB */
; SOURCE LINE # 260
MOV DPTR,#OSTCBTbl+01CEH
CLR A
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
; OSTCBFreeList = &OSTCBTbl[0];
; SOURCE LINE # 261
MOV DPTR,#OSTCBFreeList
INC A
MOVX @DPTR,A
INC DPTR
MOV A,#HIGH (OSTCBTbl)
MOVX @DPTR,A
INC DPTR
MOV A,#LOW (OSTCBTbl)
MOVX @DPTR,A
;
; #if OS_MAX_EVENTS >= 2
; for (i = 0; i < (OS_MAX_EVENTS - 1); i++) { /* Init. list of free EVENT control blocks */
; SOURCE LINE # 264
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
CLR A
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
?C0010:
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
CLR C
SUBB A,#01H
MOV A,R6
SUBB A,#00H
JNC ?C0011
; OSEventTbl[i].OSEventPtr = (OS_EVENT *)&OSEventTbl[i + 1];
; SOURCE LINE # 265
MOV R4,#00H
MOV R5,#0BH
LCALL ?C?IMUL
MOV A,#LOW (OSEventTbl+0BH)
ADD A,R7
MOV R1,A
MOV A,#HIGH (OSEventTbl+0BH)
ADDC A,R6
MOV R2,A
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV DPTR,#OSEventTbl
MOV B,#0BH
LCALL ?C?OFFXADD
MOV A,R6
MOV B,#0BH
MUL AB
ADD A,DPH
MOV DPH,A
MOV A,#01H
MOVX @DPTR,A
INC DPTR
MOV A,R2
MOVX @DPTR,A
INC DPTR
MOV A,R1
MOVX @DPTR,A
; }
; SOURCE LINE # 266
MOV DPH,?C_XBP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -