@@ -49,10 +49,10 @@ static mut CTX_TASKS: [Context; MAX_TASK] = [Context {
49
49
_running : false ,
50
50
} ; MAX_TASK ] ;
51
51
52
- pub fn task_create ( task : extern "C" fn ( ) ) -> usize {
52
+ pub fn task_create ( task : extern "C" fn ( ) ) {
53
53
unsafe {
54
- let i = TASK_TOP ;
55
- TASK_TOP += 1 ;
54
+ let i = allocate_task ( ) ;
55
+
56
56
CTX_TASKS [ i] . trap_frame . pc = task as usize ;
57
57
58
58
let task_stack_size = TASK_STACK_SIZE [ i] ;
@@ -64,19 +64,6 @@ pub fn task_create(task: extern "C" fn()) -> usize {
64
64
- 4 ;
65
65
let stack_ptr = task_stack_ptr - ( task_stack_ptr % 0x10 ) ;
66
66
CTX_TASKS [ i] . trap_frame . sp = stack_ptr;
67
-
68
- CTX_NOW = i;
69
- i
70
- }
71
- }
72
-
73
- fn task_create_from_mepc ( mepc : usize ) -> usize {
74
- unsafe {
75
- let i = TASK_TOP ;
76
- TASK_TOP += 1 ;
77
- CTX_TASKS [ i] . trap_frame . pc = mepc;
78
- CTX_NOW = i;
79
- i
80
67
}
81
68
}
82
69
@@ -156,42 +143,24 @@ pub fn save_task_context(id: usize, pc: usize, trap_frame: &TrapFrame) {
156
143
}
157
144
}
158
145
159
- pub fn next_task ( ) {
160
- unsafe {
161
- CTX_NOW = ( CTX_NOW + 1 ) % TASK_TOP ;
162
- }
163
- }
164
-
165
146
pub fn task_switch ( trap_frame : & mut TrapFrame ) {
166
- unsafe {
167
- let old_mepc = trap_frame. pc ;
168
-
169
- if FIRST_SWITCH . load ( Ordering :: Relaxed ) {
170
- FIRST_SWITCH . store ( false , Ordering :: Relaxed ) ;
171
- let main_task = task_create_from_mepc ( old_mepc) ;
172
- CTX_NOW = main_task;
173
- }
174
-
175
- save_task_context ( CTX_NOW , old_mepc, trap_frame) ;
176
-
177
- next_task ( ) ;
178
-
179
- let new_pc = restore_task_context ( CTX_NOW , trap_frame) ;
180
- trap_frame. pc = new_pc;
181
-
182
- // debug aid! remove when not needed anymore!!!!!
183
- // static mut CNT: u32 = 0;
184
- // if CTX_NOW == 0 {
185
- // if CNT < 5_000 {
186
- // CNT += 1;
187
- // } else {
188
- // CNT = 0;
189
- // info!("@@@ Task {} PC = {:x} {:?}", CTX_NOW, new_pc, trap_frame);
190
- // }
191
- // }
192
- }
193
- }
147
+ let old_mepc = trap_frame. pc ;
148
+
149
+ save_task_context ( current_task ( ) , old_mepc, trap_frame) ;
150
+
151
+ next_task ( ) ;
152
+
153
+ let new_pc = restore_task_context ( current_task ( ) , trap_frame) ;
154
+ trap_frame. pc = new_pc;
194
155
195
- pub fn current_task ( ) -> usize {
196
- unsafe { CTX_NOW }
156
+ // debug aid! remove when not needed anymore!!!!!
157
+ // static mut CNT: u32 = 0;
158
+ // if CTX_NOW == 0 {
159
+ // if CNT < 5_000 {
160
+ // CNT += 1;
161
+ // } else {
162
+ // CNT = 0;
163
+ // info!("@@@ Task {} PC = {:x} {:?}", CTX_NOW, new_pc, trap_frame);
164
+ // }
165
+ // }
197
166
}
0 commit comments