📄 task.lst
字号:
C51 COMPILER V6.12 TASK 12/07/2004 17:58:47 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE TASK
OBJECT MODULE PLACED IN .\task.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ..\..\..\kernel\task.c INCDIR(d:\rs1.12b\) DEBUG OBJECTEXTEND PRINT(.\task.
-lst) OBJECT(.\task.obj)
stmt level source
1 /*
2 ===============================================================================
3 | Copyright (C) 2004 RuanHaiShen, All rights reserved.
4 | SUMMARY:
5 | Task implementation.
6 |
7 | DESCRIPTION:
8 | See http://www.01s.org for documentation, latest information, license
9 | and contact details.
10 | email:ruanhaishen@01s.org
11 =============================================================================*/
12 /*===========================================================================*/
13 #include "arch/arch.h"
14 #include "inc/queue.h"
15 #include "inc/kernel.h"
16 #include "inc/memory.h"
17 #include "inc/ipc.h"
18 #include "inc/kapi.h"
19
20
21 task_t _tasks[CFG_MAX_TASKS];
22 static byte _idle_task_stack[CFG_IDLE_STACKSZ];
23
24 #if ARCH_STACK_GROW == UPWARDS
25 # define IDLE_STK_TOP &_idle_task_stack[0]
26 #else
# define IDLE_STK_TOP &_idle_task_stack[CFG_IDLE_STACKSZ - 1]
#endif
29
30 #if CFG_TASK_INFO_EN > 0
static u32 _idle_counter;
static info_t _task_info;
static byte _info_task_stack[CFG_INFO_STACKSZ];
#if ARCH_STACK_GROW == UPWARDS
# define STATUS_STK_TOP &_info_task_stack[0]
#else
# define STATUS_STK_TOP &_info_task_stack[CFG_INFO_STACKSZ - 1]
#endif
#endif
41
42 #if CFG_PRIO_MODE > 1
# define __nprio_init(prio) \
do { \
_tasks[prio].prio.normal = prio; \
_tasks[prio].lock = 0; \
} while (0)
#else
49 # define __nprio_init(prio) __MPT
50 #endif
51
52 #if CFG_IPC_EN > 0
# define __pend_q_init(prio) _tasks[prio].pend_q = NULL
#else
C51 COMPILER V6.12 TASK 12/07/2004 17:58:47 PAGE 2
55 # define __pend_q_init(prio) __MPT
56 #endif
57
58 #define __tcb_init(prio, stack_base) \
59 do { \
60 _tasks[prio].stack = stack_base; \
61 _tasks[prio].delay = 0; \
62 __nprio_init(prio); \
63 __pend_q_init(prio); \
64 } while(0)
65
66 #define __tcb_free(prio) \
67 do { \
68 _tasks[prio].delay = 0; \
69 _tasks[prio].state = STATE_NONE; \
70 } while(0)
71
72
73 void task_lock(void)
74 {
75 1 CRITICAL_ENTER;
76 1 if (_sched_lock < 0xff) {
77 2 _sched_lock++;
78 2 }
79 1 CRITICAL_EXIT;
80 1 }
81
82 void task_unlock(void)
83 {
84 1 CRITICAL_ENTER;
85 1 if (_sched_lock > 0x00) {
86 2 _sched_lock--;
87 2 }
88 1 CRITICAL_EXIT;
89 1
90 1 __schedule();
91 1 }
92
93
94 err_t __task_create(
95 u8 prio, /* task priority */
96 entry_t entry, /* entry point function */
97 arg_t entry_arg, /* entry data */
98 sp_t stack_base /* stack base */
99 )
100 {
101 1 sp_t pstack;
102 1
103 1 __ASSERT(entry != NULL);
104 1 __ASSERT(stack_base != NULL);
105 1
106 1 #if TASK_IDLE_PRIO < 0xff && CFG_ARG_CHK > 1
107 1 if (prio > TASK_IDLE_PRIO) {
108 2 return EOUTRANGE;
109 2 }
110 1 #elif TASK_IDLE_PRIO < 0xff
__ASSERT(prio <= TASK_IDLE_PRIO);
#endif
113 1
114 1 CRITICAL_ENTER;
115 1 if (_tasks[prio].state != STATE_NONE) {
116 2 CRITICAL_EXIT;
C51 COMPILER V6.12 TASK 12/07/2004 17:58:47 PAGE 3
117 2 return EEXIST;
118 2 }
119 1 _tasks[prio].state = STATE_ZOMBIE;
120 1 CRITICAL_EXIT;
121 1
122 1 hook_task_create(prio);
123 1 pstack = __stack_init(entry, entry_arg, stack_base);
124 1 __tcb_init(prio, pstack);
125 1
126 1 CRITICAL_ENTER;
127 1 _tasks[prio].state = STATE_READY;
128 1 __ready_que_add(prio);
129 1 CRITICAL_EXIT;
130 1
131 1 __schedule();
132 1
133 1 return EOK;
134 1 }
135
136 #if CFG_TASK_DEL_EN > 0 && CFG_PRIO_MODE < 2
err_t task_delete(u8 prio)
{
#if CFG_ARG_CHK > 1
if (prio >= TASK_IDLE_PRIO && prio != SELF_PRIO) {
return EOUTRANGE;
}
#else
__ASSERT(prio < TASK_IDLE_PRIO || prio == SELF_PRIO);
#endif
CRITICAL_ENTER;
if (prio == SELF_PRIO) {
prio = _current_prio;
}
if (!(_tasks[prio].state & STATE_READY)) {
CRITICAL_EXIT;
return ENOTEXIST;
}
#if CFG_IPC_EN > 0
if (_tasks[prio].pend_q != NULL) {
__queue_remove_f(_tasks[prio].pend_q, prio);
} else
#endif
{ __ready_que_remove(prio); }
_sched_lock++;
CRITICAL_EXIT;
__tcb_free(prio);
hook_task_delete(prio);
CRITICAL_ENTER;
if (prio == _current_prio) {
_sched_lock = 0;
} else {
_sched_lock--;
}
CRITICAL_EXIT;
__schedule();
C51 COMPILER V6.12 TASK 12/07/2004 17:58:47 PAGE 4
return EOK;
}
#elif CFG_TASK_DEL_EN > 0
err_t task_delete(u8 prio)
{
register u8 cprio;
#if CFG_ARG_CHK > 1
if (prio >= TASK_IDLE_PRIO && prio != SELF_PRIO) {
return EOUTRANGE;
}
#else
__ASSERT(prio < TASK_IDLE_PRIO || prio == SELF_PRIO);
#endif
CRITICAL_ENTER;
if (prio == SELF_PRIO) {
prio = _tasks[_current_prio].prio.normal;
} else if (!__prio_if_normal(prio)) {
CRITICAL_EXIT;
return ENOTEXIST;
}
cprio = _tasks[prio].prio.current;
__nprio_lock(cprio); /*prevent normal-prio being changed*/
CRITICAL_EXIT;
__dummy();
CRITICAL_ENTER;
cprio = _tasks[prio].prio.current;
#if CFG_IPC_EN > 0
if (_tasks[cprio].pend_q != NULL) {
__queue_remove_f(_tasks[cprio].pend_q, cprio);
} else
#endif
{ __ready_que_remove(cprio); }
_sched_lock++;
CRITICAL_EXIT;
__tcb_free(cprio);
hook_task_delete(prio);
CRITICAL_ENTER;
if (cprio == _current_prio) {
_sched_lock = 0;
} else {
_sched_lock--;
}
CRITICAL_EXIT;
__schedule();
return EOK;
}
#endif
237
238
239 #if CFG_PRIO_MODE == 1
err_t task_change_prio(u8 old_prio, u8 new_prio)
C51 COMPILER V6.12 TASK 12/07/2004 17:58:47 PAGE 5
{
#if CFG_ARG_CHK > 1
if ((old_prio >= TASK_IDLE_PRIO && old_prio != SELF_PRIO) ||
new_prio >= TASK_IDLE_PRIO) {
return EOUTRANGE;
}
#else
__ASSERT((old_prio < TASK_IDLE_PRIO || old_prio == SELF_PRIO) &&
new_prio < TASK_IDLE_PRIO);
#endif
CRITICAL_ENTER;
if (_tasks[new_prio].state != STATE_NONE) {
CRITICAL_EXIT;
return EEXIST;
}
_tasks[new_prio].state = STATE_ZOMBIE;
CRITICAL_EXIT;
__dummy();
CRITICAL_ENTER;
if (old_prio == SELF_PRIO) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -