5
5
struct TASKCTL * taskctl ;
6
6
struct TIMER * task_timer ;
7
7
8
+ struct TASK * task_now (void )
9
+ {
10
+ struct TASKLEVEL * tl = & taskctl -> level [taskctl -> now_lv ];
11
+ return tl -> tasks [tl -> now ];
12
+ }
13
+
14
+ void task_add (struct TASK * task )
15
+ {
16
+ struct TASKLEVEL * tl = & taskctl -> level [task -> level ];
17
+ tl -> tasks [tl -> running ] = task ;
18
+ tl -> running ++ ;
19
+ task -> flags = 2 ; /*活动中*/
20
+ return ;
21
+ }
22
+
23
+ void task_remove (struct TASK * task )
24
+ {
25
+ int i ;
26
+ struct TASKLEVEL * tl = & taskctl -> level [task -> level ];
27
+
28
+ /*寻找task所在的位置*/
29
+ for (i = 0 ; i < tl -> running ; i ++ ) {
30
+ if (tl -> tasks [i ] == task ) {
31
+ /*在这里 */
32
+ break ;
33
+ }
34
+ }
35
+
36
+ tl -> running -- ;
37
+ if (i < tl -> now ) {
38
+ tl -> now -- ; /*需要移动成员,要相应地处理 */
39
+ }
40
+ if (tl -> now >= tl -> running ) {
41
+ /*如果now的值出现异常,则进行修正*/
42
+ tl -> now = 0 ;
43
+ }
44
+ task -> flags = 1 ; /* 休眠中 */
45
+
46
+ /* 移动 */
47
+ for (; i < tl -> running ; i ++ ) {
48
+ tl -> tasks [i ] = tl -> tasks [i + 1 ];
49
+ }
50
+ return ;
51
+ }
52
+
53
+ void task_switchsub (void )
54
+ {
55
+ int i ;
56
+ /*寻找最上层的LEVEL */
57
+ for (i = 0 ; i < MAX_TASKLEVELS ; i ++ ) {
58
+ if (taskctl -> level [i ].running > 0 ) {
59
+ break ; /*找到了*/
60
+ }
61
+ }
62
+ taskctl -> now_lv = i ;
63
+ taskctl -> lv_change = 0 ;
64
+ return ;
65
+ }
66
+
8
67
struct TASK * task_init (struct MEMMAN * memman )
9
68
{
10
69
int i ;
@@ -17,13 +76,16 @@ struct TASK *task_init(struct MEMMAN *memman)
17
76
taskctl -> tasks0 [i ].sel = (TASK_GDT0 + i ) * 8 ;
18
77
set_segmdesc (gdt + TASK_GDT0 + i , 103 , (int ) & taskctl -> tasks0 [i ].tss , AR_TSS32 );
19
78
}
20
-
79
+ for (i = 0 ; i < MAX_TASKLEVELS ; i ++ ) {
80
+ taskctl -> level [i ].running = 0 ;
81
+ taskctl -> level [i ].now = 0 ;
82
+ }
21
83
task = task_alloc ();
22
84
task -> flags = 2 ; /*活动中标志*/
23
- task -> priority = 2 ; /* 0.02秒 */
24
- taskctl -> running = 1 ;
25
- taskctl -> now = 0 ;
26
- taskctl -> tasks [ 0 ] = task ;
85
+ task -> priority = 2 ; /* 0.02秒*/
86
+ task -> level = 0 ; /*最高LEVEL */
87
+ task_add ( task ) ;
88
+ task_switchsub (); /* LEVEL 设置*/
27
89
load_tr (task -> sel );
28
90
task_timer = timer_alloc ();
29
91
timer_settime (task_timer , task -> priority );
@@ -58,64 +120,59 @@ struct TASK *task_alloc(void)
58
120
return 0 ; /*全部正在使用*/
59
121
}
60
122
61
- void task_run (struct TASK * task , int priority )
123
+ void task_run (struct TASK * task , int level , int priority )
62
124
{
125
+ if (level < 0 ) {
126
+ level = task -> level ; /*不改变LEVEL */
127
+ }
63
128
if (priority > 0 ) {
64
129
task -> priority = priority ;
65
130
}
131
+ if (task -> flags == 2 && task -> level != level ) {
132
+ /*改变活动中的LEVEL */
133
+ task_remove (task ); /*这里执行之后flag的值会变为1,于是下面的if语句块也会被执行*/
134
+ }
66
135
if (task -> flags != 2 ) {
67
- task -> flags = 2 ; /*活动中标志 */
68
- taskctl -> tasks [ taskctl -> running ] = task ;
69
- taskctl -> running ++ ;
136
+ /*从休眠状态唤醒的情形 */
137
+ task -> level = level ;
138
+ task_add ( task ) ;
70
139
}
140
+ taskctl -> lv_change = 1 ; /*下次任务切换时检查LEVEL */
71
141
return ;
72
142
}
73
143
74
- void task_switch (void ){
75
- struct TASK * task ;
76
- taskctl -> now ++ ;
77
- if (taskctl -> now == taskctl -> running ) {
78
- taskctl -> now = 0 ;
144
+ void task_switch (void )
145
+ {
146
+ struct TASKLEVEL * tl = & taskctl -> level [taskctl -> now_lv ];
147
+ struct TASK * new_task , * now_task = tl -> tasks [tl -> now ];
148
+ tl -> now ++ ;
149
+ if (tl -> now == tl -> running ) {
150
+ tl -> now = 0 ;
79
151
}
80
- task = taskctl -> tasks [taskctl -> now ];
81
- timer_settime (task_timer , task -> priority );
82
- if (taskctl -> running >= 2 ) {
83
- farjmp (0 , task -> sel );
152
+ if (taskctl -> lv_change != 0 ) {
153
+ task_switchsub ();
154
+ tl = & taskctl -> level [taskctl -> now_lv ];
155
+ }
156
+ new_task = tl -> tasks [tl -> now ];
157
+ timer_settime (task_timer , new_task -> priority );
158
+ if (new_task != now_task ) {
159
+ farjmp (0 , new_task -> sel );
84
160
}
85
161
return ;
86
162
}
87
163
88
164
void task_sleep (struct TASK * task )
89
165
{
90
- int i ;
91
- char ts = 0 ;
92
- if (task -> flags == 2 ) { /*如果指定任务处于唤醒状态*/
93
- if (task == taskctl -> tasks [taskctl -> now ]) {
94
- ts = 1 ; /*让自己休眠的话,稍后需要进行任务切换*/
95
- }
96
- /*寻找task所在的位置*/
97
- for (i = 0 ; i < taskctl -> running ; i ++ ) {
98
- if (taskctl -> tasks [i ] == task ) {
99
- /*在这里*/
100
- break ;
101
- }
102
- }
103
- taskctl -> running -- ;
104
- if (i < taskctl -> now ) {
105
- taskctl -> now -- ; /*需要移动成员,要相应地处理*/
106
- }
107
- /*移动成员*/
108
- for (; i < taskctl -> running ; i ++ ) {
109
- taskctl -> tasks [i ] = taskctl -> tasks [i + 1 ];
110
- }
111
- task -> flags = 1 ; /*不工作的状态*/
112
- if (ts != 0 ) {
113
- /*任务切换*/
114
- if (taskctl -> now >= taskctl -> running ) {
115
- /*如果now的值出现异常,则进行修正*/
116
- taskctl -> now = 0 ;
117
- }
118
- farjmp (0 , taskctl -> tasks [taskctl -> now ]-> sel );
166
+ struct TASK * now_task ;
167
+ if (task -> flags == 2 ) {
168
+ /*如果处于活动状态*/
169
+ now_task = task_now ();
170
+ task_remove (task ); /*执行此语句的话flags将变为1 */
171
+ if (task == now_task ) {
172
+ /*如果是让自己休眠,则需要进行任务切换*/
173
+ task_switchsub ();
174
+ now_task = task_now (); /*在设定后获取当前任务的值*/
175
+ farjmp (0 , now_task -> sel );
119
176
}
120
177
}
121
178
return ;
0 commit comments