1
1
//! The RTOS kernel
2
2
use atomic_ref:: AtomicRef ;
3
- use core:: { fmt, mem:: forget, num:: NonZeroUsize , sync:: atomic:: Ordering } ;
3
+ use core:: { borrow :: BorrowMut , fmt, mem:: forget, num:: NonZeroUsize , sync:: atomic:: Ordering } ;
4
4
5
- use crate :: utils:: { BinUInteger , Init , PrioBitmap } ;
5
+ use crate :: utils:: { intrusive_list :: StaticListHead , BinUInteger , Init , PrioBitmap } ;
6
6
7
7
#[ macro_use]
8
8
mod cfg;
@@ -218,6 +218,8 @@ pub unsafe trait KernelCfg2: Port + Sized {
218
218
219
219
type TaskReadyBitmap : PrioBitmap ;
220
220
221
+ type TaskReadyQueue : BorrowMut < [ StaticListHead < TaskCb < Self > > ] > + Init + ' static ;
222
+
221
223
/// Access the kernel's global state.
222
224
fn state ( ) -> & ' static State < Self > ;
223
225
@@ -239,6 +241,7 @@ pub struct State<
239
241
System : KernelCfg2 ,
240
242
PortTaskState : ' static = <System as Port >:: PortTaskState ,
241
243
TaskReadyBitmap : PrioBitmap = <System as KernelCfg2 >:: TaskReadyBitmap ,
244
+ TaskReadyQueue : ' static = <System as KernelCfg2 >:: TaskReadyQueue ,
242
245
TaskPriority : ' static = <System as KernelCfg1 >:: TaskPriority ,
243
246
> {
244
247
// TODO: Make `running_task` non-null to simplify runtime code
@@ -248,38 +251,51 @@ pub struct State<
248
251
/// The task ready bitmap, in which each bit indicates whether the
249
252
/// task ready queue corresponding to that bit contains a task or not.
250
253
task_ready_bitmap : utils:: CpuLockCell < System , TaskReadyBitmap > ,
254
+
255
+ /// The task ready queues, in which each queue represents the list of
256
+ /// runnable task at the corresponding priority level.
257
+ task_ready_queue : utils:: CpuLockCell < System , TaskReadyQueue > ,
251
258
}
252
259
253
260
impl <
254
261
System : KernelCfg2 ,
255
262
PortTaskState : ' static ,
256
263
TaskReadyBitmap : PrioBitmap ,
264
+ TaskReadyQueue : ' static + Init ,
257
265
TaskPriority : ' static ,
258
- > Init for State < System , PortTaskState , TaskReadyBitmap , TaskPriority >
266
+ > Init for State < System , PortTaskState , TaskReadyBitmap , TaskReadyQueue , TaskPriority >
259
267
{
260
268
const INIT : Self = Self {
261
269
running_task : AtomicRef :: new ( None ) ,
262
270
task_ready_bitmap : Init :: INIT ,
271
+ task_ready_queue : Init :: INIT ,
263
272
} ;
264
273
}
265
274
266
275
impl <
267
276
System : Kernel ,
268
277
PortTaskState : ' static + fmt:: Debug ,
269
278
TaskReadyBitmap : PrioBitmap ,
279
+ TaskReadyQueue : ' static + fmt:: Debug ,
270
280
TaskPriority : ' static ,
271
- > fmt:: Debug for State < System , PortTaskState , TaskReadyBitmap , TaskPriority >
281
+ > fmt:: Debug for State < System , PortTaskState , TaskReadyBitmap , TaskReadyQueue , TaskPriority >
272
282
{
273
283
fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
274
284
f. debug_struct ( "State" )
275
285
. field ( "running_task" , & self . running_task )
276
286
. field ( "task_ready_bitmap" , & self . task_ready_bitmap )
287
+ . field ( "task_ready_queue" , & self . task_ready_queue )
277
288
. finish ( )
278
289
}
279
290
}
280
291
281
- impl < System : KernelCfg2 , PortTaskState : ' static , TaskReadyBitmap : PrioBitmap , TaskPriority >
282
- State < System , PortTaskState , TaskReadyBitmap , TaskPriority >
292
+ impl <
293
+ System : KernelCfg2 ,
294
+ PortTaskState : ' static ,
295
+ TaskReadyBitmap : PrioBitmap ,
296
+ TaskReadyQueue : BorrowMut < [ StaticListHead < TaskCb < System , PortTaskState , TaskPriority > > ] > + Init + ' static ,
297
+ TaskPriority ,
298
+ > State < System , PortTaskState , TaskReadyBitmap , TaskReadyQueue , TaskPriority >
283
299
{
284
300
/// Get the currently running task.
285
301
pub fn running_task ( & self ) -> Option < & ' static TaskCb < System , PortTaskState , TaskPriority > > {
0 commit comments