📄 os_task.src
字号:
; ..\SOURCE\OS_TASK.SRC generated from: ..\SOURCE\OS_TASK.C
; COMPILER INVOKED BY:
; C:\Keil\C51\BIN\C51.EXE ..\SOURCE\OS_TASK.C ROM(COMPACT) BROWSE DEBUG OBJECTEXTEND PRINT(.\OS_TASK.lst) OBJECT(.\OS_TASK.obj)
$NOMOD51
NAME OS_TASK
P0 DATA 080H
P1 DATA 090H
P2 DATA 0A0H
P3 DATA 0B0H
T0 BIT 0B0H.4
AC BIT 0D0H.6
T1 BIT 0B0H.5
T2 BIT 090H.0
EA BIT 0A8H.7
IE DATA 0A8H
EXF2 BIT 0C8H.6
RD BIT 0B0H.7
ES BIT 0A8H.4
IP DATA 0B8H
RI BIT 098H.0
INT0 BIT 0B0H.2
CY BIT 0D0H.7
TI BIT 098H.1
INT1 BIT 0B0H.3
RCAP2H DATA 0CBH
PS BIT 0B8H.4
SP DATA 081H
T2EX BIT 090H.1
OV BIT 0D0H.2
RCAP2L DATA 0CAH
C_T2 BIT 0C8H.1
WR BIT 0B0H.6
RCLK BIT 0C8H.5
TCLK BIT 0C8H.4
SBUF DATA 099H
PCON DATA 087H
SCON DATA 098H
TMOD DATA 089H
TCON DATA 088H
IE0 BIT 088H.1
IE1 BIT 088H.3
B DATA 0F0H
CP_RL2 BIT 0C8H.0
ACC DATA 0E0H
ET0 BIT 0A8H.1
ET1 BIT 0A8H.3
TF0 BIT 088H.5
ET2 BIT 0A8H.5
TF1 BIT 088H.7
TF2 BIT 0C8H.7
RB8 BIT 098H.2
TH0 DATA 08CH
EX0 BIT 0A8H.0
IT0 BIT 088H.0
TH1 DATA 08DH
TB8 BIT 098H.3
EX1 BIT 0A8H.2
IT1 BIT 088H.2
TH2 DATA 0CDH
P BIT 0D0H.0
SM0 BIT 098H.7
TL0 DATA 08AH
SM1 BIT 098H.6
TL1 DATA 08BH
SM2 BIT 098H.5
TL2 DATA 0CCH
PT0 BIT 0B8H.1
PT1 BIT 0B8H.3
RS0 BIT 0D0H.3
PT2 BIT 0B8H.5
TR0 BIT 088H.4
RS1 BIT 0D0H.4
TR1 BIT 088H.6
TR2 BIT 0C8H.2
PX0 BIT 0B8H.0
PX1 BIT 0B8H.2
DPH DATA 083H
DPL DATA 082H
EXEN2 BIT 0C8H.3
REN BIT 098H.4
T2CON DATA 0C8H
RXD BIT 0B0H.0
TXD BIT 0B0H.1
F0 BIT 0D0H.5
PSW DATA 0D0H
?PR?_?OSTaskCreate?OS_TASK SEGMENT CODE INBLOCK
EXTRN DATA (OSRunning)
EXTRN CODE (_?OS_Sched)
EXTRN CODE (_?OS_TCBInit)
EXTRN CODE (_?OSTaskStkInit)
EXTRN DATA (OSTCBPrioTbl)
EXTRN DATA (OSTaskCtr)
EXTRN DATA (?C_IBP)
EXTRN CODE (?C?LSTKIDATA)
PUBLIC _?OSTaskCreate
; #pragma SRC
; /*
; *********************************************************************************************************
; * uC/OS-II
; * The Real-Time Kernel
; * TASK MANAGEMENT
; *
; * (c) Copyright 1992-2002, Jean J. Labrosse, Weston, FL
; * All Rights Reserved
; *
; * File : OS_TASK.C
; * By : Jean J. Labrosse
; *********************************************************************************************************
; */
;
; #ifndef OS_MASTER_FILE
; #include "includes.h"
; #endif
;
; /*
; *********************************************************************************************************
; * CHANGE PRIORITY OF A TASK
; *
; * Description: This function allows you to change the priority of a task dynamically. Note that the new
; * priority MUST be available.
; *
; * Arguments : oldp is the old priority
; *
; * newp is the new priority
; *
; * Returns : OS_NO_ERR is the call was successful
; * OS_PRIO_INVALID if the priority you specify is higher that the maximum allowed
; * (i.e. >= OS_LOWEST_PRIO)
; * OS_PRIO_EXIST if the new priority already exist.
; * OS_PRIO_ERR there is no task with the specified OLD priority (i.e. the OLD task does
; * not exist.
; *********************************************************************************************************
; */
;
; #if OS_TASK_CHANGE_PRIO_EN > 0
; INT8U OSTaskChangePrio (INT8U oldprio, INT8U newprio)
; {
; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
; OS_CPU_SR cpu_sr;
; #endif
;
; #if OS_EVENT_EN > 0
; OS_EVENT *pevent;
; #endif
;
; OS_TCB *ptcb;
; INT8U x;
; INT8U y;
; INT8U bitx;
; INT8U bity;
;
;
;
; #if OS_ARG_CHK_EN > 0
; if ((oldprio >= OS_LOWEST_PRIO && oldprio != OS_PRIO_SELF) ||
; newprio >= OS_LOWEST_PRIO) {
; return (OS_PRIO_INVALID);
; }
; #endif
; OS_ENTER_CRITICAL();
; if (OSTCBPrioTbl[newprio] != (OS_TCB *)0) { /* New priority must not already exist */
; OS_EXIT_CRITICAL();
; return (OS_PRIO_EXIST);
; } else {
; OSTCBPrioTbl[newprio] = (OS_TCB *)1; /* Reserve the entry to prevent others */
; OS_EXIT_CRITICAL();
; y = newprio >> 3; /* Precompute to reduce INT. latency */
; bity = OSMapTbl[y];
; x = newprio & 0x07;
; bitx = OSMapTbl[x];
; OS_ENTER_CRITICAL();
; if (oldprio == OS_PRIO_SELF) { /* See if changing self */
; oldprio = OSTCBCur->OSTCBPrio; /* Yes, get priority */
; }
; ptcb = OSTCBPrioTbl[oldprio];
; if (ptcb != (OS_TCB *)0) { /* Task to change must exist */
; OSTCBPrioTbl[oldprio] = (OS_TCB *)0; /* Remove TCB from old priority */
; if ((OSRdyTbl[ptcb->OSTCBY] & ptcb->OSTCBBitX) != 0x00) { /* If task is ready make it not */
; if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0x00) {
; OSRdyGrp &= ~ptcb->OSTCBBitY;
; }
; OSRdyGrp |= bity; /* Make new priority ready to run */
; OSRdyTbl[y] |= bitx;
; #if OS_EVENT_EN > 0
; } else {
; pevent = ptcb->OSTCBEventPtr;
; if (pevent != (OS_EVENT *)0) { /* Remove from event wait list */
; if ((pevent->OSEventTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) {
; pevent->OSEventGrp &= ~ptcb->OSTCBBitY;
; }
; pevent->OSEventGrp |= bity; /* Add new priority to wait list */
; pevent->OSEventTbl[y] |= bitx;
; }
; #endif
; }
; OSTCBPrioTbl[newprio] = ptcb; /* Place pointer to TCB @ new priority */
; ptcb->OSTCBPrio = newprio; /* Set new task priority */
; ptcb->OSTCBY = y;
; ptcb->OSTCBX = x;
; ptcb->OSTCBBitY = bity;
; ptcb->OSTCBBitX = bitx;
; OS_EXIT_CRITICAL();
; OS_Sched(); /* Run highest priority task ready */
; return (OS_NO_ERR);
; } else {
; OSTCBPrioTbl[newprio] = (OS_TCB *)0; /* Release the reserved prio. */
; OS_EXIT_CRITICAL();
; return (OS_PRIO_ERR); /* Task to change didn't exist */
; }
; }
; }
; #endif
; /*$PAGE*/
; /*
; *********************************************************************************************************
; * CREATE A TASK
; *
; * Description: This function is used to have uC/OS-II manage the execution of a task. Tasks can either
; * be created prior to the start of multitasking or by a running task. A task cannot be
; * created by an ISR.
; *
; * Arguments : task is a pointer to the task's code
; *
; * pdata is a pointer to an optional data area which can be used to pass parameters to
; * the task when the task first executes. Where the task is concerned it thinks
; * it was invoked and passed the argument 'pdata' as follows:
; *
; * void Task (void *pdata)
; * {
; * for (;;) {
; * Task code;
; * }
; * }
; *
; * ptos is a pointer to the task's top of stack. If the configuration constant
; * OS_STK_GROWTH is set to 1, the stack is assumed to grow downward (i.e. from high
; * memory to low memory). 'pstk' will thus point to the highest (valid) memory
; * location of the stack. If OS_STK_GROWTH is set to 0, 'pstk' will point to the
; * lowest memory location of the stack and the stack will grow with increasing
; * memory locations.
; *
; * prio is the task's priority. A unique priority MUST be assigned to each task and the
; * lower the number, the higher the priority.
; *
; * Returns : OS_NO_ERR if the function was successful.
; * OS_PRIO_EXIT if the task priority already exist
; * (each task MUST have a unique priority).
; * OS_PRIO_INVALID if the priority you specify is higher that the maximum allowed
; * (i.e. >= OS_LOWEST_PRIO)
; *********************************************************************************************************
; */
;
; #if OS_TASK_CREATE_EN > 0
; INT8U OSTaskCreate (void (_CODE *task)(void _XDATA *pd) KCREENTRANT, void _XDATA *pdat, OS_STK _XDATA *ptos, INT8U prio) KCREENTRANT
RSEG ?PR?_?OSTaskCreate?OS_TASK
_?OSTaskCreate:
USING 0
; SOURCE LINE # 159
DEC ?C_IBP
DEC ?C_IBP
MOV R0,?C_IBP
MOV @R0,AR2
INC R0
MOV @R0,AR3
DEC ?C_IBP
DEC ?C_IBP
MOV R0,?C_IBP
MOV @R0,AR4
INC R0
MOV @R0,AR5
DEC ?C_IBP
DEC ?C_IBP
MOV R0,?C_IBP
MOV @R0,AR6
INC R0
MOV @R0,AR7
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_STK _XDATA * psp;
; INT8U err;
;
;
; #if OS_ARG_CHK_EN > 0
; if (prio > OS_LOWEST_PRIO) { /* Make sure priority is within allowable range */
; SOURCE LINE # 169
ADD A,#0AH
MOV R0,A
MOV A,@R0
MOV R6,A
SETB C
SUBB A,#0CH
JC ?C0001
; return (OS_PRIO_INVALID);
; SOURCE LINE # 170
MOV R7,#02AH
AJMP ?C0002
; }
; SOURCE LINE # 171
?C0001:
; #endif
; OS_ENTER_CRITICAL();
; SOURCE LINE # 173
MOV C,EA
CLR A
RLC A
MOV R0,?C_IBP
MOV @R0,A
CLR EA
; if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { /* Make sure task doesn't already exist at this priority */
; SOURCE LINE # 174
MOV A,#LOW (OSTCBPrioTbl)
ADD A,R6
MOV R0,A
MOV A,@R0
JZ $ + 4H
AJMP ?C0003
; OSTCBPrioTbl[prio] = (OS_TCB *)1; /* Reserve the priority to prevent others from doing ... */
; SOURCE LINE # 175
MOV A,?C_IBP
ADD A,#0AH
MOV R0,A
MOV A,@R0
ADD A,#LOW (OSTCBPrioTbl)
MOV R0,A
MOV @R0,#01H
; /* ... the same thing until task is created. */
; OS_EXIT_CRITICAL();
; SOURCE LINE # 177
MOV R0,?C_IBP
MOV A,@R0
ADD A,#0FFH
MOV EA,C
; psp =
; (OS_STK _XDATA *)OSTaskStkInit(task, pdat, ptos, 0); /* Initialize the task's stack */
; SOURCE LINE # 179
DEC ?C_IBP
DEC ?C_IBP
MOV R0,?C_IBP
CLR A
MOV @R0,A
INC R0
MOV @R0,A
MOV A,?C_IBP
ADD A,#0AH
MOV R0,A
MOV A,@R0
MOV R2,A
INC R0
MOV A,@R0
MOV R3,A
MOV A,?C_IBP
ADD A,#08H
MOV R0,A
MOV A,@R0
MOV R4,A
INC R0
MOV A,@R0
MOV R5,A
MOV A,?C_IBP
ADD A,#06H
MOV R0,A
MOV A,@R0
MOV R6,A
INC R0
MOV A,@R0
MOV R7,A
LCALL _?OSTaskStkInit
MOV R0,?C_IBP
INC R0
MOV @R0,AR6
INC R0
MOV @R0,AR7
; err = OS_TCBInit(prio, psp, (OS_STK *)0, 0, 0, (void *)0, 0);
; SOURCE LINE # 180
DEC ?C_IBP
DEC ?C_IBP
MOV R0,?C_IBP
CLR A
MOV @R0,A
INC R0
MOV @R0,A
DEC ?C_IBP
DEC ?C_IBP
DEC ?C_IBP
MOV R0,?C_IBP
MOV @R0,A
INC R0
MOV @R0,A
INC R0
MOV @R0,A
MOV A,?C_IBP
ADD A,#0FCH
MOV ?C_IBP,A
MOV R0,A
LCALL ?C?LSTKIDATA
DB 00H
DB 00H
DB 00H
DB 00H
DEC ?C_IBP
DEC ?C_IBP
MOV R0,?C_IBP
CLR A
MOV @R0,A
INC R0
MOV @R0,A
DEC ?C_IBP
DEC ?C_IBP
DEC ?C_IBP
MOV R0,?C_IBP
MOV @R0,A
INC R0
MOV @R0,A
INC R0
MOV @R0,A
MOV A,?C_IBP
ADD A,#0FH
MOV R0,A
MOV A,@R0
MOV R6,A
INC R0
MOV A,@R0
MOV R2,AR6
MOV R1,A
MOV R3,#01H
MOV A,?C_IBP
ADD A,#018H
MOV R0,A
MOV A,@R0
MOV R7,A
LCALL _?OS_TCBInit
MOV A,?C_IBP
ADD A,#03H
MOV R0,A
MOV A,R7
MOV @R0,A
; if (err == OS_NO_ERR) {
; SOURCE LINE # 181
JNZ ?C0004
; OS_ENTER_CRITICAL();
; SOURCE LINE # 182
MOV C,EA
RLC A
MOV R0,?C_IBP
MOV @R0,A
CLR EA
; OSTaskCtr++; /* Increment the #tasks counter */
; SOURCE LINE # 183
INC OSTaskCtr
; OS_EXIT_CRITICAL();
; SOURCE LINE # 184
MOV A,@R0
ADD A,#0FFH
MOV EA,C
; if (OSRunning == TRUE) { /* Find highest priority task if multitasking has started */
; SOURCE LINE # 185
MOV A,OSRunning
XRL A,#01H
JNZ ?C0006
; OS_Sched();
; SOURCE LINE # 186
LCALL _?OS_Sched
; }
; SOURCE LINE # 187
; } else {
; SOURCE LINE # 188
SJMP ?C0006
?C0004:
; OS_ENTER_CRITICAL();
; SOURCE LINE # 189
MOV C,EA
CLR A
RLC A
MOV R0,?C_IBP
MOV @R0,A
CLR EA
; OSTCBPrioTbl[prio] = (OS_TCB *)0;/* Make this priority available to others */
; SOURCE LINE # 190
MOV A,?C_IBP
ADD A,#0AH
MOV R0,A
MOV A,@R0
ADD A,#LOW (OSTCBPrioTbl)
MOV R0,A
CLR A
MOV @R0,A
; OS_EXIT_CRITICAL();
; SOURCE LINE # 191
MOV R0,?C_IBP
MOV A,@R0
ADD A,#0FFH
MOV EA,C
; }
; SOURCE LINE # 192
?C0006:
; return (err);
; SOURCE LINE # 193
MOV A,?C_IBP
ADD A,#03H
MOV R0,A
MOV A,@R0
MOV R7,A
SJMP ?C0002
; }
; SOURCE LINE # 194
?C0003:
; OS_EXIT_CRITICAL();
; SOURCE LINE # 195
MOV R0,?C_IBP
MOV A,@R0
ADD A,#0FFH
MOV EA,C
; return (OS_PRIO_EXIST);
; SOURCE LINE # 196
MOV R7,#028H
; }
; SOURCE LINE # 197
?C0002:
MOV A,?C_IBP
ADD A,#0BH
MOV ?C_IBP,A
RET
; END OF _?OSTaskCreate
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -