📄 os_task.lst
字号:
C51 COMPILER V7.50 OS_TASK 12/14/2007 08:25:42 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE OS_TASK
OBJECT MODULE PLACED IN OS_TASK.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE OS_TASK.C LARGE BROWSE DEBUG OBJECTEXTEND
line level source
1 /*
2 *********************************************************************************************************
3 * uC/OS-II
4 * The Real-Time Kernel
5 * TASK MANAGEMENT
6 *
7 * (c) Copyright 1992-2007, Jean J. Labrosse, Weston, FL
8 * All Rights Reserved
9 *
10 * File : OS_TASK.C
11 * By : Jean J. Labrosse
12 * Version : V2.85
13 *
14 * LICENSING TERMS:
15 * ---------------
16 * uC/OS-II is provided in source form for FREE evaluation, for educational use or for peaceful research.
-
17 * If you plan on using uC/OS-II in a commercial product you need to contact Micri祄 to properly license
18 * its use in your product. We provide ALL the source code for your convenience and to help you experience
19 * uC/OS-II. The fact that the source is provided does NOT mean that you can use it without paying a
20 * licensing fee.
21 *********************************************************************************************************
22 */
23
24 #ifndef OS_MASTER_FILE
25 #include <ucos_ii.h>
26 #endif
27
28 /*$PAGE*/
29 /*
30 *********************************************************************************************************
31 * CHANGE PRIORITY OF A TASK
32 *
33 * Description: This function allows you to change the priority of a task dynamically. Note that the new
34 * priority MUST be available.
35 *
36 * Arguments : oldp is the old priority
37 *
38 * newp is the new priority
39 *
40 * Returns : OS_ERR_NONE is the call was successful
41 * OS_ERR_PRIO_INVALID if the priority you specify is higher that the maximum allowed
42 * (i.e. >= OS_LOWEST_PRIO)
43 * OS_ERR_PRIO_EXIST if the new priority already exist.
44 * OS_ERR_PRIO there is no task with the specified OLD priority (i.e. the OLD task
-does
45 * not exist.
46 * OS_ERR_TASK_NOT_EXIST if the task is assigned to a Mutex PIP.
47 *********************************************************************************************************
48 */
49
50 #if OS_TASK_CHANGE_PRIO_EN > 0
INT8U OSTaskChangePrio (INT8U oldprio, INT8U newprio) reentrant
{
#if OS_EVENT_EN
C51 COMPILER V7.50 OS_TASK 12/14/2007 08:25:42 PAGE 2
OS_EVENT *pevent;
#endif
OS_TCB *ptcb;
INT8U x;
INT8U y;
#if OS_LOWEST_PRIO <= 63
INT8U bitx;
INT8U bity;
#else
INT16U bitx;
INT16U bity;
#endif
INT8U y_old;
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr = 0; /* Storage for CPU status register */
#endif
#if OS_ARG_CHK_EN > 0
if (oldprio >= OS_LOWEST_PRIO) {
if (oldprio != OS_PRIO_SELF) {
return (OS_ERR_PRIO_INVALID);
}
}
if (newprio >= OS_LOWEST_PRIO) {
return (OS_ERR_PRIO_INVALID);
}
#endif
OS_ENTER_CRITICAL();
if (OSTCBPrioTbl[newprio] != (OS_TCB *)0) { /* New priority must not already exist */
OS_EXIT_CRITICAL();
return (OS_ERR_PRIO_EXIST);
}
if (oldprio == OS_PRIO_SELF) { /* See if changing self */
oldprio = OSTCBCur->OSTCBPrio; /* Yes, get priority */
}
ptcb = OSTCBPrioTbl[oldprio];
if (ptcb == (OS_TCB *)0) { /* Does task to change exist? */
OS_EXIT_CRITICAL(); /* No, can't change its priority! */
return (OS_ERR_PRIO);
}
if (ptcb == OS_TCB_RESERVED) { /* Is task assigned to Mutex */
OS_EXIT_CRITICAL(); /* No, can't change its priority! */
return (OS_ERR_TASK_NOT_EXIST);
}
#if OS_LOWEST_PRIO <= 63
y = (INT8U)(newprio >> 3); /* Yes, compute new TCB fields */
x = (INT8U)(newprio & 0x07);
bity = (INT8U)(1 << y);
bitx = (INT8U)(1 << x);
#else
y = (INT8U)((newprio >> 4) & 0x0F);
x = (INT8U)( newprio & 0x0F);
bity = (INT16U)(1 << y);
bitx = (INT16U)(1 << x);
#endif
OSTCBPrioTbl[oldprio] = (OS_TCB *)0; /* Remove TCB from old priority */
OSTCBPrioTbl[newprio] = ptcb; /* Place pointer to TCB @ new priority */
y_old = ptcb->OSTCBY;
if ((OSRdyTbl[y_old] & ptcb->OSTCBBitX) != 0) { /* If task is ready make it not */
C51 COMPILER V7.50 OS_TASK 12/14/2007 08:25:42 PAGE 3
OSRdyTbl[y_old] &= ~ptcb->OSTCBBitX;
if (OSRdyTbl[y_old] == 0) {
OSRdyGrp &= ~ptcb->OSTCBBitY;
}
OSRdyGrp |= bity; /* Make new priority ready to run */
OSRdyTbl[y] |= bitx;
}
#if OS_EVENT_EN
pevent = ptcb->OSTCBEventPtr;
if (pevent != (OS_EVENT *)0) { /* ... remove from event wait list */
pevent->OSEventTbl[y_old] &= ~ptcb->OSTCBBitX;
if (pevent->OSEventTbl[y_old] == 0) {
pevent->OSEventGrp &= ~ptcb->OSTCBBitY;
}
pevent->OSEventGrp |= bity; /* Add new priority to wait list */
pevent->OSEventTbl[y] |= bitx;
}
#endif
ptcb->OSTCBPrio = newprio; /* Set new task priority */
ptcb->OSTCBY = y;
ptcb->OSTCBX = x;
ptcb->OSTCBBitY = bity;
ptcb->OSTCBBitX = bitx;
OS_EXIT_CRITICAL();
if (OSRunning == OS_TRUE) {
OS_Sched(); /* Find new highest priority task */
}
return (OS_ERR_NONE);
}
#endif
146 /*$PAGE*/
147 /*
148 *********************************************************************************************************
149 * CREATE A TASK
150 *
151 * Description: This function is used to have uC/OS-II manage the execution of a task. Tasks can either
152 * be created prior to the start of multitasking or by a running task. A task cannot be
153 * created by an ISR.
154 *
155 * Arguments : task is a pointer to the task's code
156 *
157 * p_arg is a pointer to an optional data area which can be used to pass parameters to
158 * the task when the task first executes. Where the task is concerned it thinks
159 * it was invoked and passed the argument 'p_arg' as follows:
160 *
161 * void Task (void *p_arg)
162 * {
163 * for (;;) {
164 * Task code;
165 * }
166 * }
167 *
168 * ptos is a pointer to the task's top of stack. If the configuration constant
169 * OS_STK_GROWTH is set to 1, the stack is assumed to grow downward (i.e. from high
170 * memory to low memory). 'pstk' will thus point to the highest (valid) memory
171 * location of the stack. If OS_STK_GROWTH is set to 0, 'pstk' will point to the
172 * lowest memory location of the stack and the stack will grow with increasing
173 * memory locations.
174 *
175 * prio is the task's priority. A unique priority MUST be assigned to each task and the
176 * lower the number, the higher the priority.
177 *
C51 COMPILER V7.50 OS_TASK 12/14/2007 08:25:42 PAGE 4
178 * Returns : OS_ERR_NONE if the function was successful.
179 * OS_PRIO_EXIT if the task priority already exist
180 * (each task MUST have a unique priority).
181 * OS_ERR_PRIO_INVALID if the priority you specify is higher that the maximum allowed
182 * (i.e. >= OS_LOWEST_PRIO)
183 * OS_ERR_TASK_CREATE_ISR if you tried to create a task from an ISR.
184 *********************************************************************************************************
185 */
186
187 #if OS_TASK_CREATE_EN > 0
188 INT8U OSTaskCreate (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT8U
189 prio) reentrant
190 {
191 1 OS_STK *psp;
192 1 INT8U err;
193 1 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr = 0;
#endif
196 1
197 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -