55struct TASKCTL * taskctl ;
66struct TIMER * task_timer ;
77
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+
867struct TASK * task_init (struct MEMMAN * memman )
968{
1069 int i ;
@@ -17,13 +76,16 @@ struct TASK *task_init(struct MEMMAN *memman)
1776 taskctl -> tasks0 [i ].sel = (TASK_GDT0 + i ) * 8 ;
1877 set_segmdesc (gdt + TASK_GDT0 + i , 103 , (int ) & taskctl -> tasks0 [i ].tss , AR_TSS32 );
1978 }
20-
79+ for (i = 0 ; i < MAX_TASKLEVELS ; i ++ ) {
80+ taskctl -> level [i ].running = 0 ;
81+ taskctl -> level [i ].now = 0 ;
82+ }
2183 task = task_alloc ();
2284 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 设置*/
2789 load_tr (task -> sel );
2890 task_timer = timer_alloc ();
2991 timer_settime (task_timer , task -> priority );
@@ -58,64 +120,59 @@ struct TASK *task_alloc(void)
58120 return 0 ; /*全部正在使用*/
59121}
60122
61- void task_run (struct TASK * task , int priority )
123+ void task_run (struct TASK * task , int level , int priority )
62124{
125+ if (level < 0 ) {
126+ level = task -> level ; /*不改变LEVEL */
127+ }
63128 if (priority > 0 ) {
64129 task -> priority = priority ;
65130 }
131+ if (task -> flags == 2 && task -> level != level ) {
132+ /*改变活动中的LEVEL */
133+ task_remove (task ); /*这里执行之后flag的值会变为1,于是下面的if语句块也会被执行*/
134+ }
66135 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 ) ;
70139 }
140+ taskctl -> lv_change = 1 ; /*下次任务切换时检查LEVEL */
71141 return ;
72142}
73143
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 ;
79151 }
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 );
84160 }
85161 return ;
86162}
87163
88164void task_sleep (struct TASK * task )
89165{
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 );
119176 }
120177 }
121178 return ;
0 commit comments