From 5158588af3f4b0c711d68c751d7b7aad576e399f Mon Sep 17 00:00:00 2001 From: Brad Campbell Date: Wed, 15 Oct 2025 14:55:02 -0400 Subject: [PATCH 1/3] kernel: scheduler functions not unsafe The implementations are not relevant for tock/rust memory safety. --- kernel/src/kernel.rs | 8 +++----- kernel/src/scheduler.rs | 4 ++-- kernel/src/scheduler/priority.rs | 2 +- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/kernel/src/kernel.rs b/kernel/src/kernel.rs index f50d731421..470ca8eb58 100644 --- a/kernel/src/kernel.rs +++ b/kernel/src/kernel.rs @@ -509,11 +509,9 @@ impl Kernel { } // Check if the scheduler wishes to continue running this process. - let continue_process = unsafe { - resources - .scheduler() - .continue_process(process.processid(), chip) - }; + let continue_process = resources + .scheduler() + .continue_process(process.processid(), chip); if !continue_process { return_reason = process::StoppedExecutingReason::KernelPreemption; break; diff --git a/kernel/src/scheduler.rs b/kernel/src/scheduler.rs index 2056e005ee..5d507462ed 100644 --- a/kernel/src/scheduler.rs +++ b/kernel/src/scheduler.rs @@ -61,7 +61,7 @@ pub trait Scheduler { /// processes to handle kernel tasks. Most schedulers will use this default /// implementation, which always prioritizes kernel work, but schedulers /// that wish to defer interrupt handling may reimplement it. - unsafe fn do_kernel_work_now(&self, chip: &C) -> bool { + fn do_kernel_work_now(&self, chip: &C) -> bool { chip.has_pending_interrupts() || DeferredCall::has_tasks() } @@ -81,7 +81,7 @@ pub trait Scheduler { /// returns `false`, then `do_process` will exit with a `KernelPreemption`. /// /// `id` is the identifier of the currently active process. - unsafe fn continue_process(&self, _id: ProcessId, chip: &C) -> bool { + fn continue_process(&self, _id: ProcessId, chip: &C) -> bool { !(chip.has_pending_interrupts() || DeferredCall::has_tasks()) } } diff --git a/kernel/src/scheduler/priority.rs b/kernel/src/scheduler/priority.rs index e6b5f92a23..bbfe8e91e6 100644 --- a/kernel/src/scheduler/priority.rs +++ b/kernel/src/scheduler/priority.rs @@ -54,7 +54,7 @@ impl Scheduler for PrioritySched { }) } - unsafe fn continue_process(&self, _: ProcessId, chip: &C) -> bool { + fn continue_process(&self, _: ProcessId, chip: &C) -> bool { // In addition to checking for interrupts, also checks if any higher // priority processes have become ready. This check is necessary because // a system call by this process could make another process ready, if From 354689760145af5810ed37508f5603fdb5bec0a5 Mon Sep 17 00:00:00 2001 From: Brad Campbell Date: Wed, 15 Oct 2025 17:02:49 -0400 Subject: [PATCH 2/3] kernel: move schedulers to capsules --- capsules/system/src/lib.rs | 1 + .../system}/src/scheduler/cooperative.rs | 10 ++-- .../system}/src/scheduler/mlfq.rs | 12 ++--- capsules/system/src/scheduler/mod.rs | 8 ++++ .../system}/src/scheduler/priority.rs | 47 ++++++++++--------- .../system}/src/scheduler/round_robin.rs | 10 ++-- kernel/src/scheduler.rs | 5 -- 7 files changed, 50 insertions(+), 43 deletions(-) rename {kernel => capsules/system}/src/scheduler/cooperative.rs (93%) rename {kernel => capsules/system}/src/scheduler/mlfq.rs (95%) create mode 100644 capsules/system/src/scheduler/mod.rs rename {kernel => capsules/system}/src/scheduler/priority.rs (63%) rename {kernel => capsules/system}/src/scheduler/round_robin.rs (95%) diff --git a/capsules/system/src/lib.rs b/capsules/system/src/lib.rs index b919cc6f71..488b690048 100644 --- a/capsules/system/src/lib.rs +++ b/capsules/system/src/lib.rs @@ -8,4 +8,5 @@ pub mod process_checker; pub mod process_policies; pub mod process_printer; +pub mod scheduler; pub mod storage_permissions; diff --git a/kernel/src/scheduler/cooperative.rs b/capsules/system/src/scheduler/cooperative.rs similarity index 93% rename from kernel/src/scheduler/cooperative.rs rename to capsules/system/src/scheduler/cooperative.rs index 4a32320d71..1b131a1e51 100644 --- a/kernel/src/scheduler/cooperative.rs +++ b/capsules/system/src/scheduler/cooperative.rs @@ -15,11 +15,11 @@ //! interrupt. However it then continues executing the same userspace process //! that was executing. -use crate::collections::list::{List, ListLink, ListNode}; -use crate::platform::chip::Chip; -use crate::process::ProcessSlot; -use crate::process::StoppedExecutingReason; -use crate::scheduler::{Scheduler, SchedulingDecision}; +use kernel::collections::list::{List, ListLink, ListNode}; +use kernel::platform::chip::Chip; +use kernel::process::ProcessSlot; +use kernel::process::StoppedExecutingReason; +use kernel::scheduler::{Scheduler, SchedulingDecision}; /// A node in the linked list the scheduler uses to track processes pub struct CoopProcessNode<'a> { diff --git a/kernel/src/scheduler/mlfq.rs b/capsules/system/src/scheduler/mlfq.rs similarity index 95% rename from kernel/src/scheduler/mlfq.rs rename to capsules/system/src/scheduler/mlfq.rs index cc620eae60..2db56cda1c 100644 --- a/kernel/src/scheduler/mlfq.rs +++ b/capsules/system/src/scheduler/mlfq.rs @@ -24,12 +24,12 @@ use core::cell::Cell; use core::num::NonZeroU32; -use crate::collections::list::{List, ListLink, ListNode}; -use crate::hil::time::{self, ConvertTicks, Ticks}; -use crate::platform::chip::Chip; -use crate::process::ProcessSlot; -use crate::process::StoppedExecutingReason; -use crate::scheduler::{Scheduler, SchedulingDecision}; +use kernel::collections::list::{List, ListLink, ListNode}; +use kernel::hil::time::{self, ConvertTicks, Ticks}; +use kernel::platform::chip::Chip; +use kernel::process::ProcessSlot; +use kernel::process::StoppedExecutingReason; +use kernel::scheduler::{Scheduler, SchedulingDecision}; #[derive(Default)] struct MfProcState { diff --git a/capsules/system/src/scheduler/mod.rs b/capsules/system/src/scheduler/mod.rs new file mode 100644 index 0000000000..e7f7245673 --- /dev/null +++ b/capsules/system/src/scheduler/mod.rs @@ -0,0 +1,8 @@ +// Licensed under the Apache License, Version 2.0 or the MIT License. +// SPDX-License-Identifier: Apache-2.0 OR MIT +// Copyright Tock Contributors 2025. + +pub mod cooperative; +pub mod mlfq; +pub mod priority; +pub mod round_robin; diff --git a/kernel/src/scheduler/priority.rs b/capsules/system/src/scheduler/priority.rs similarity index 63% rename from kernel/src/scheduler/priority.rs rename to capsules/system/src/scheduler/priority.rs index bbfe8e91e6..a75e966a77 100644 --- a/kernel/src/scheduler/priority.rs +++ b/capsules/system/src/scheduler/priority.rs @@ -14,43 +14,47 @@ //! is running. The only way for a process to longer be the highest priority is //! for an interrupt to occur, which will cause the process to stop running. -use crate::deferred_call::DeferredCall; -use crate::kernel::Kernel; -use crate::platform::chip::Chip; -use crate::process::ProcessId; -use crate::process::StoppedExecutingReason; -use crate::scheduler::{Scheduler, SchedulingDecision}; -use crate::utilities::cells::OptionalCell; +use kernel::capabilities::ProcessManagementCapability; +use kernel::deferred_call::DeferredCall; +use kernel::platform::chip::Chip; +use kernel::process::ProcessId; +use kernel::process::StoppedExecutingReason; +use kernel::scheduler::{Scheduler, SchedulingDecision}; +use kernel::utilities::cells::OptionalCell; +use kernel::Kernel; /// Priority scheduler based on the order of processes in the `PROCESSES` array. -pub struct PrioritySched { +pub struct PrioritySched { kernel: &'static Kernel, - running: OptionalCell, + running: OptionalCell<(usize, ProcessId)>, + cap: CAP, } -impl PrioritySched { - pub const fn new(kernel: &'static Kernel) -> Self { +impl PrioritySched { + pub const fn new(kernel: &'static Kernel, cap: CAP) -> Self { Self { kernel, running: OptionalCell::empty(), + cap, } } } -impl Scheduler for PrioritySched { +impl Scheduler for PrioritySched { fn next(&self) -> SchedulingDecision { // Iterates in-order through the process array, always running the // first process it finds that is ready to run. This enforces the // priorities of all processes. let next = self .kernel - .get_process_iter() - .find(|&proc| proc.ready()) - .map(|proc| proc.processid()); + .process_iter_capability(&self.cap) + .enumerate() + .find(|(_i, proc)| proc.ready()) + .map(|(i, proc)| (i, proc.processid())); self.running.insert(next); next.map_or(SchedulingDecision::TrySleep, |next| { - SchedulingDecision::RunProcess((next, None)) + SchedulingDecision::RunProcess((next.1, None)) }) } @@ -63,12 +67,11 @@ impl Scheduler for PrioritySched { || DeferredCall::has_tasks() || self .kernel - .get_process_iter() - .find(|proc| proc.ready()) - .is_some_and(|ready_proc| { - self.running.map_or(false, |running| { - ready_proc.processid().index < running.index - }) + .process_iter_capability(&self.cap) + .enumerate() + .find(|(_i, proc)| proc.ready()) + .is_some_and(|(i, _ready_proc)| { + self.running.map_or(false, |running| i < running.0) })) } diff --git a/kernel/src/scheduler/round_robin.rs b/capsules/system/src/scheduler/round_robin.rs similarity index 95% rename from kernel/src/scheduler/round_robin.rs rename to capsules/system/src/scheduler/round_robin.rs index 4dd9cb8db2..a95e8f2192 100644 --- a/kernel/src/scheduler/round_robin.rs +++ b/capsules/system/src/scheduler/round_robin.rs @@ -21,11 +21,11 @@ use core::cell::Cell; use core::num::NonZeroU32; -use crate::collections::list::{List, ListLink, ListNode}; -use crate::platform::chip::Chip; -use crate::process::ProcessSlot; -use crate::process::StoppedExecutingReason; -use crate::scheduler::{Scheduler, SchedulingDecision}; +use kernel::collections::list::{List, ListLink, ListNode}; +use kernel::platform::chip::Chip; +use kernel::process::ProcessSlot; +use kernel::process::StoppedExecutingReason; +use kernel::scheduler::{Scheduler, SchedulingDecision}; /// A node in the linked list the scheduler uses to track processes /// Each node holds a pointer to a slot in the processes array diff --git a/kernel/src/scheduler.rs b/kernel/src/scheduler.rs index 5d507462ed..ae5ad17519 100644 --- a/kernel/src/scheduler.rs +++ b/kernel/src/scheduler.rs @@ -4,11 +4,6 @@ //! Interface for Tock kernel schedulers. -pub mod cooperative; -pub mod mlfq; -pub mod priority; -pub mod round_robin; - use crate::deferred_call::DeferredCall; use crate::platform::chip::Chip; use crate::process::ProcessId; From 3ded2a7ec3238b005afca416d65d4c4472407333 Mon Sep 17 00:00:00 2001 From: Brad Campbell Date: Wed, 15 Oct 2025 17:03:14 -0400 Subject: [PATCH 3/3] boards: update scheduler components --- boards/apollo3/lora_things_plus/src/main.rs | 7 +-- .../apollo3/redboard_artemis_atp/src/main.rs | 7 +-- .../apollo3/redboard_artemis_nano/src/main.rs | 6 +-- boards/arty_e21/src/main.rs | 20 ++++++--- boards/clue_nrf52840/src/main.rs | 7 +-- boards/components/src/sched/cooperative.rs | 11 +++-- boards/components/src/sched/mlfq.rs | 10 +++-- boards/components/src/sched/priority.rs | 26 ++++++----- boards/components/src/sched/round_robin.rs | 12 +++-- .../src/main.rs | 7 +-- .../src/main.rs | 7 +-- .../nrf52840dk-test-appid-sha256/src/main.rs | 7 +-- .../nrf52840dk-test-appid-tbf/src/main.rs | 7 +-- .../src/main.rs | 7 +-- .../nrf52840dk-test-invs/src/main.rs | 7 +-- .../nrf52840dk-test-kernel/src/main.rs | 7 +-- boards/cy8cproto_62_4343_w/src/main.rs | 7 +-- boards/esp32-c3-devkitM-1/src/main.rs | 20 ++++++--- boards/hail/src/main.rs | 7 +-- boards/hifive1/src/main.rs | 7 +-- boards/hifive_inventor/src/main.rs | 7 +-- boards/imix/src/main.rs | 7 +-- boards/imxrt1050-evkb/src/main.rs | 7 +-- boards/litex/arty/src/main.rs | 44 ++++--------------- boards/litex/sim/src/main.rs | 44 ++++--------------- boards/makepython-nrf52840/src/main.rs | 7 +-- boards/microbit_v2/src/main.rs | 7 +-- boards/msp_exp432p401r/src/main.rs | 7 +-- boards/nano33ble/src/main.rs | 7 +-- boards/nano33ble_rev2/src/main.rs | 7 +-- boards/nano_rp2040_connect/src/main.rs | 7 +-- boards/nordic/nrf52840_dongle/src/main.rs | 7 +-- boards/nordic/nrf52840dk/src/lib.rs | 7 +-- boards/nordic/nrf52dk/src/main.rs | 7 +-- boards/nucleo_f429zi/src/main.rs | 7 +-- boards/nucleo_f446re/src/main.rs | 7 +-- boards/opentitan/earlgrey-cw310/src/main.rs | 20 ++++++--- boards/particle_boron/src/main.rs | 7 +-- boards/pico_explorer_base/src/main.rs | 7 +-- boards/qemu_i486_q35/src/main.rs | 7 +-- boards/qemu_rv32_virt/src/lib.rs | 7 +-- boards/raspberry_pi_pico/src/main.rs | 7 +-- boards/raspberry_pi_pico_2/src/main.rs | 7 +-- boards/redboard_redv/src/main.rs | 7 +-- boards/sma_q3/src/main.rs | 7 +-- boards/stm32f3discovery/src/main.rs | 7 +-- boards/stm32f412gdiscovery/src/main.rs | 7 +-- boards/stm32f429idiscovery/src/main.rs | 7 +-- boards/teensy40/src/main.rs | 7 +-- boards/veer_el2_sim/src/main.rs | 7 +-- boards/weact_f401ccu6/src/main.rs | 7 +-- boards/wm1110dev/src/main.rs | 7 +-- 52 files changed, 270 insertions(+), 237 deletions(-) diff --git a/boards/apollo3/lora_things_plus/src/main.rs b/boards/apollo3/lora_things_plus/src/main.rs index 85e72fc891..bfd1974fd3 100644 --- a/boards/apollo3/lora_things_plus/src/main.rs +++ b/boards/apollo3/lora_things_plus/src/main.rs @@ -52,7 +52,6 @@ use kernel::hil::spi::SpiMaster; use kernel::hil::time::Counter; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::round_robin::RoundRobinSched; use kernel::{create_capability, debug, static_init}; #[cfg(feature = "atecc508a")] @@ -149,6 +148,8 @@ type SignatureVerifyInMemoryKeys = 64, >; +type SchedulerObj = components::sched::round_robin::RoundRobinComponentType; + /// A structure representing this platform that holds references to all /// capsules for this platform. struct LoRaThingsPlus { @@ -194,7 +195,7 @@ struct LoRaThingsPlus { >, >, >, - scheduler: &'static RoundRobinSched<'static>, + scheduler: &'static SchedulerObj, systick: cortexm4::systick::SysTick, kv_driver: &'static capsules_extra::kv_driver::KVStoreDriver< 'static, @@ -377,7 +378,7 @@ impl KernelResources> for LoRa type SyscallDriverLookup = Self; type SyscallFilter = (); type ProcessFault = (); - type Scheduler = RoundRobinSched<'static>; + type Scheduler = SchedulerObj; type SchedulerTimer = cortexm4::systick::SysTick; type WatchDog = (); type ContextSwitchCallback = (); diff --git a/boards/apollo3/redboard_artemis_atp/src/main.rs b/boards/apollo3/redboard_artemis_atp/src/main.rs index 0556ae70b0..d296c5ee7b 100644 --- a/boards/apollo3/redboard_artemis_atp/src/main.rs +++ b/boards/apollo3/redboard_artemis_atp/src/main.rs @@ -25,7 +25,6 @@ use kernel::hil::led::LedHigh; use kernel::hil::time::Counter; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::round_robin::RoundRobinSched; use kernel::{create_capability, debug, static_init}; /// Support routines for debugging I/O. @@ -69,6 +68,8 @@ static mut ALARM: Option<&'static MuxAlarm<'static, apollo3::stimer::STimer<'sta kernel::stack_size! {0x1000} +type SchedulerObj = components::sched::round_robin::RoundRobinComponentType; + /// A structure representing this platform that holds references to all /// capsules for this platform. struct RedboardArtemisAtp { @@ -103,7 +104,7 @@ struct RedboardArtemisAtp { apollo3::ble::Ble<'static>, VirtualMuxAlarm<'static, apollo3::stimer::STimer<'static>>, >, - scheduler: &'static RoundRobinSched<'static>, + scheduler: &'static SchedulerObj, systick: cortexm4::systick::SysTick, } @@ -130,7 +131,7 @@ impl KernelResources> for Redb type SyscallDriverLookup = Self; type SyscallFilter = (); type ProcessFault = (); - type Scheduler = RoundRobinSched<'static>; + type Scheduler = SchedulerObj; type SchedulerTimer = cortexm4::systick::SysTick; type WatchDog = (); type ContextSwitchCallback = (); diff --git a/boards/apollo3/redboard_artemis_nano/src/main.rs b/boards/apollo3/redboard_artemis_nano/src/main.rs index 0c3b076bc5..accb83e5ae 100644 --- a/boards/apollo3/redboard_artemis_nano/src/main.rs +++ b/boards/apollo3/redboard_artemis_nano/src/main.rs @@ -25,7 +25,6 @@ use kernel::hil::led::LedHigh; use kernel::hil::time::Counter; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::round_robin::RoundRobinSched; use kernel::{create_capability, debug, static_init}; /// Support routines for debugging I/O. @@ -82,6 +81,7 @@ type BME280Sensor = components::bme280::Bme280ComponentType< >; type TemperatureDriver = components::temperature::TemperatureComponentType; type HumidityDriver = components::humidity::HumidityComponentType; +type SchedulerObj = components::sched::round_robin::RoundRobinComponentType; /// A structure representing this platform that holds references to all /// capsules for this platform. @@ -114,7 +114,7 @@ struct RedboardArtemisNano { temperature: &'static TemperatureDriver, humidity: &'static HumidityDriver, air_quality: &'static capsules_extra::air_quality::AirQualitySensor<'static>, - scheduler: &'static RoundRobinSched<'static>, + scheduler: &'static SchedulerObj, systick: cortexm4::systick::SysTick, } @@ -144,7 +144,7 @@ impl KernelResources> for Redb type SyscallDriverLookup = Self; type SyscallFilter = (); type ProcessFault = (); - type Scheduler = RoundRobinSched<'static>; + type Scheduler = SchedulerObj; type SchedulerTimer = cortexm4::systick::SysTick; type WatchDog = (); type ContextSwitchCallback = (); diff --git a/boards/arty_e21/src/main.rs b/boards/arty_e21/src/main.rs index c5a0ec9cf4..d430c85a98 100644 --- a/boards/arty_e21/src/main.rs +++ b/boards/arty_e21/src/main.rs @@ -15,7 +15,6 @@ use kernel::component::Component; use kernel::hil; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::priority::PrioritySched; use kernel::{create_capability, debug, static_init}; #[allow(dead_code)] @@ -44,6 +43,12 @@ static mut PROCESS_PRINTER: Option<&'static capsules_system::process_printer::Pr kernel::stack_size! {0x1000} +struct ProcessManagementCapabilityObj {} +unsafe impl capabilities::ProcessManagementCapability for ProcessManagementCapabilityObj {} + +type SchedulerObj = + components::sched::priority::PriorityComponentType; + /// A structure representing this platform that holds references to all /// capsules for this platform. struct ArtyE21 { @@ -60,7 +65,7 @@ struct ArtyE21 { >, button: &'static capsules_core::button::Button<'static, arty_e21_chip::gpio::GpioPin<'static>>, // ipc: kernel::ipc::IPC, - scheduler: &'static PrioritySched, + scheduler: &'static SchedulerObj, } /// Mapping of integer syscalls to objects that implement syscalls. @@ -89,7 +94,7 @@ impl KernelResources ( chip.enable_all_interrupts(); - let scheduler = components::sched::priority::PriorityComponent::new(board_kernel) - .finalize(components::priority_component_static!()); + let scheduler = components::sched::priority::PriorityComponent::new( + board_kernel, + ProcessManagementCapabilityObj {}, + ) + .finalize(components::priority_component_static!( + ProcessManagementCapabilityObj + )); let artye21 = ArtyE21 { console, diff --git a/boards/clue_nrf52840/src/main.rs b/boards/clue_nrf52840/src/main.rs index 41880aa08c..2a38638732 100644 --- a/boards/clue_nrf52840/src/main.rs +++ b/boards/clue_nrf52840/src/main.rs @@ -27,7 +27,6 @@ use kernel::hil::usb::Client; use kernel::platform::chip::Chip; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::round_robin::RoundRobinSched; #[allow(unused_imports)] use kernel::{create_capability, debug, debug_gpio, debug_verbose, static_init}; @@ -151,6 +150,8 @@ type Ieee802154Driver = components::ieee802154::Ieee802154ComponentType< nrf52840::aes::AesECB<'static>, >; +type SchedulerObj = components::sched::round_robin::RoundRobinComponentType; + /// Supported drivers by the platform pub struct Platform { ble_radio: &'static capsules_extra::ble_advertising_driver::BLE< @@ -195,7 +196,7 @@ pub struct Platform { adc: &'static capsules_core::adc::AdcVirtualized<'static>, temperature: &'static TemperatureDriver, humidity: &'static HumidityDriver, - scheduler: &'static RoundRobinSched<'static>, + scheduler: &'static SchedulerObj, systick: cortexm4::systick::SysTick, } @@ -231,7 +232,7 @@ impl KernelResources; + type Scheduler = SchedulerObj; type SchedulerTimer = cortexm4::systick::SysTick; type WatchDog = (); type ContextSwitchCallback = (); diff --git a/boards/components/src/sched/cooperative.rs b/boards/components/src/sched/cooperative.rs index 465b4cecc3..1421d48ff2 100644 --- a/boards/components/src/sched/cooperative.rs +++ b/boards/components/src/sched/cooperative.rs @@ -15,24 +15,29 @@ // Author: Hudson Ayers +use capsules_system::scheduler::cooperative::{CoopProcessNode, CooperativeSched}; use core::mem::MaybeUninit; use kernel::component::Component; use kernel::process::ProcessArray; -use kernel::scheduler::cooperative::{CoopProcessNode, CooperativeSched}; #[macro_export] macro_rules! cooperative_component_static { ($N:expr $(,)?) => {{ let coop_sched = - kernel::static_buf!(kernel::scheduler::cooperative::CooperativeSched<'static>); + kernel::static_buf!(capsules_system::scheduler::cooperative::CooperativeSched<'static>); let coop_nodes = kernel::static_buf!( - [core::mem::MaybeUninit>; $N] + [core::mem::MaybeUninit< + capsules_system::scheduler::cooperative::CoopProcessNode<'static>, + >; $N] ); (coop_sched, coop_nodes) };}; } +pub type CooperativeComponentType = + capsules_system::scheduler::cooperative::CooperativeSched<'static>; + pub struct CooperativeComponent { processes: &'static ProcessArray, } diff --git a/boards/components/src/sched/mlfq.rs b/boards/components/src/sched/mlfq.rs index 1dff55d9f9..8271a9dca3 100644 --- a/boards/components/src/sched/mlfq.rs +++ b/boards/components/src/sched/mlfq.rs @@ -12,10 +12,10 @@ use core::mem::MaybeUninit; use capsules_core::virtualizers::virtual_alarm::{MuxAlarm, VirtualMuxAlarm}; +use capsules_system::scheduler::mlfq::{MLFQProcessNode, MLFQSched}; use kernel::component::Component; use kernel::hil::time; use kernel::process::ProcessArray; -use kernel::scheduler::mlfq::{MLFQProcessNode, MLFQSched}; #[macro_export] macro_rules! mlfq_component_static { @@ -24,19 +24,23 @@ macro_rules! mlfq_component_static { capsules_core::virtualizers::virtual_alarm::VirtualMuxAlarm<'static, $A> ); let mlfq_sched = kernel::static_buf!( - kernel::scheduler::mlfq::MLFQSched< + capsules_system::scheduler::mlfq::MLFQSched< 'static, capsules_core::virtualizers::virtual_alarm::VirtualMuxAlarm<'static, $A>, > ); let mlfq_node = kernel::static_buf!( - [core::mem::MaybeUninit>; $N] + [core::mem::MaybeUninit>; + $N] ); (alarm, mlfq_sched, mlfq_node) };}; } +pub type MLFQComponentType = + capsules_system::scheduler::mlfq::MLFQSched<'static, VirtualMuxAlarm<'static, A>>; + pub struct MLFQComponent, const NUM_PROCS: usize> { alarm_mux: &'static MuxAlarm<'static, A>, processes: &'static ProcessArray, diff --git a/boards/components/src/sched/priority.rs b/boards/components/src/sched/priority.rs index 731d5768e3..24651fce37 100644 --- a/boards/components/src/sched/priority.rs +++ b/boards/components/src/sched/priority.rs @@ -14,32 +14,36 @@ //! .finalize(components::priority_component_static!()); //! ``` +use capsules_system::scheduler::priority::PrioritySched; use core::mem::MaybeUninit; +use kernel::capabilities::ProcessManagementCapability; use kernel::component::Component; -use kernel::scheduler::priority::PrioritySched; #[macro_export] macro_rules! priority_component_static { - () => {{ - kernel::static_buf!(kernel::scheduler::priority::PrioritySched) + ($CAP:ty $(,)?) => {{ + kernel::static_buf!(capsules_system::scheduler::priority::PrioritySched<$CAP>) };}; } -pub struct PriorityComponent { +pub type PriorityComponentType = capsules_system::scheduler::priority::PrioritySched; + +pub struct PriorityComponent { board_kernel: &'static kernel::Kernel, + cap: CAP, } -impl PriorityComponent { - pub fn new(board_kernel: &'static kernel::Kernel) -> PriorityComponent { - PriorityComponent { board_kernel } +impl PriorityComponent { + pub fn new(board_kernel: &'static kernel::Kernel, cap: CAP) -> Self { + Self { board_kernel, cap } } } -impl Component for PriorityComponent { - type StaticInput = &'static mut MaybeUninit; - type Output = &'static mut PrioritySched; +impl Component for PriorityComponent { + type StaticInput = &'static mut MaybeUninit>; + type Output = &'static mut PrioritySched; fn finalize(self, static_buffer: Self::StaticInput) -> Self::Output { - static_buffer.write(PrioritySched::new(self.board_kernel)) + static_buffer.write(PrioritySched::new(self.board_kernel, self.cap)) } } diff --git a/boards/components/src/sched/round_robin.rs b/boards/components/src/sched/round_robin.rs index 07fc1cf011..9b4d9810ce 100644 --- a/boards/components/src/sched/round_robin.rs +++ b/boards/components/src/sched/round_robin.rs @@ -16,25 +16,29 @@ // Author: Hudson Ayers // Last modified: 03/31/2020 +use capsules_system::scheduler::round_robin::{RoundRobinProcessNode, RoundRobinSched}; use core::mem::MaybeUninit; use kernel::component::Component; use kernel::process::ProcessArray; -use kernel::scheduler::round_robin::{RoundRobinProcessNode, RoundRobinSched}; #[macro_export] macro_rules! round_robin_component_static { ($N:expr $(,)?) => {{ let rr_sched = - kernel::static_buf!(kernel::scheduler::round_robin::RoundRobinSched<'static>); + kernel::static_buf!(capsules_system::scheduler::round_robin::RoundRobinSched<'static>); let rr_nodes = kernel::static_buf!( - [core::mem::MaybeUninit>; - $N] + [core::mem::MaybeUninit< + capsules_system::scheduler::round_robin::RoundRobinProcessNode<'static>, + >; $N] ); (rr_sched, rr_nodes) };}; } +pub type RoundRobinComponentType = + capsules_system::scheduler::round_robin::RoundRobinSched<'static>; + pub struct RoundRobinComponent { processes: &'static ProcessArray, } diff --git a/boards/configurations/microbit_v2/microbit_v2-test-dynamic-app-load/src/main.rs b/boards/configurations/microbit_v2/microbit_v2-test-dynamic-app-load/src/main.rs index ec5a78e154..79219346a2 100644 --- a/boards/configurations/microbit_v2/microbit_v2-test-dynamic-app-load/src/main.rs +++ b/boards/configurations/microbit_v2/microbit_v2-test-dynamic-app-load/src/main.rs @@ -17,7 +17,6 @@ use kernel::component::Component; use kernel::hil::time::Counter; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::round_robin::RoundRobinSched; #[allow(unused_imports)] use kernel::{create_capability, debug, debug_gpio, debug_verbose, static_init}; @@ -93,6 +92,8 @@ type DynamicBinaryStorage<'a> = kernel::dynamic_binary_storage::SequentialDynami kernel::process::ProcessStandardDebugFull, NonVolatilePages, >; +type SchedulerObj = components::sched::round_robin::RoundRobinComponentType; + /// Supported drivers by the platform pub struct MicroBit { ble_radio: &'static capsules_extra::ble_advertising_driver::BLE< @@ -155,7 +156,7 @@ pub struct MicroBit { DynamicBinaryStorage<'static>, >, - scheduler: &'static RoundRobinSched<'static>, + scheduler: &'static SchedulerObj, systick: cortexm4::systick::SysTick, } @@ -195,7 +196,7 @@ impl KernelResources; + type Scheduler = SchedulerObj; type SchedulerTimer = cortexm4::systick::SysTick; type WatchDog = (); type ContextSwitchCallback = (); diff --git a/boards/configurations/nrf52840dk/nrf52840dk-test-appid-ecdsap256/src/main.rs b/boards/configurations/nrf52840dk/nrf52840dk-test-appid-ecdsap256/src/main.rs index ab26c5d40b..9de184db3b 100644 --- a/boards/configurations/nrf52840dk/nrf52840dk-test-appid-ecdsap256/src/main.rs +++ b/boards/configurations/nrf52840dk/nrf52840dk-test-appid-ecdsap256/src/main.rs @@ -14,7 +14,6 @@ use kernel::hil::led::LedLow; use kernel::hil::time::Counter; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::round_robin::RoundRobinSched; use kernel::{capabilities, create_capability, static_init}; use nrf52840::gpio::Pin; use nrf52840::interrupt_service::Nrf52840DefaultPeripherals; @@ -66,6 +65,8 @@ type SignatureVerifyInMemoryKeys = 64, >; +type SchedulerObj = components::sched::round_robin::RoundRobinComponentType; + /// Supported drivers by the platform pub struct Platform { console: &'static capsules_core::console::Console<'static>, @@ -75,7 +76,7 @@ pub struct Platform { 4, >, alarm: &'static AlarmDriver, - scheduler: &'static RoundRobinSched<'static>, + scheduler: &'static SchedulerObj, systick: cortexm4::systick::SysTick, } @@ -117,7 +118,7 @@ impl KernelResources; + type Scheduler = SchedulerObj; type SchedulerTimer = cortexm4::systick::SysTick; type WatchDog = (); type ContextSwitchCallback = (); diff --git a/boards/configurations/nrf52840dk/nrf52840dk-test-appid-sha256/src/main.rs b/boards/configurations/nrf52840dk/nrf52840dk-test-appid-sha256/src/main.rs index 74b0d2f9c7..95addda9a8 100644 --- a/boards/configurations/nrf52840dk/nrf52840dk-test-appid-sha256/src/main.rs +++ b/boards/configurations/nrf52840dk/nrf52840dk-test-appid-sha256/src/main.rs @@ -13,7 +13,6 @@ use kernel::hil::led::LedLow; use kernel::hil::time::Counter; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::round_robin::RoundRobinSched; use kernel::{capabilities, create_capability, static_init}; use nrf52840::gpio::Pin; use nrf52840::interrupt_service::Nrf52840DefaultPeripherals; @@ -55,6 +54,8 @@ kernel::stack_size! {0x2000} type AlarmDriver = components::alarm::AlarmDriverComponentType>; +type SchedulerObj = components::sched::round_robin::RoundRobinComponentType; + /// Supported drivers by the platform pub struct Platform { console: &'static capsules_core::console::Console<'static>, @@ -64,7 +65,7 @@ pub struct Platform { 4, >, alarm: &'static AlarmDriver, - scheduler: &'static RoundRobinSched<'static>, + scheduler: &'static SchedulerObj, systick: cortexm4::systick::SysTick, } @@ -106,7 +107,7 @@ impl KernelResources; + type Scheduler = SchedulerObj; type SchedulerTimer = cortexm4::systick::SysTick; type WatchDog = (); type ContextSwitchCallback = (); diff --git a/boards/configurations/nrf52840dk/nrf52840dk-test-appid-tbf/src/main.rs b/boards/configurations/nrf52840dk/nrf52840dk-test-appid-tbf/src/main.rs index 74d60bae63..b1ce301a0f 100644 --- a/boards/configurations/nrf52840dk/nrf52840dk-test-appid-tbf/src/main.rs +++ b/boards/configurations/nrf52840dk/nrf52840dk-test-appid-tbf/src/main.rs @@ -14,7 +14,6 @@ use kernel::hil::time::Counter; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; use kernel::process::ProcessLoadingAsync; -use kernel::scheduler::round_robin::RoundRobinSched; use kernel::{capabilities, create_capability, static_init}; use nrf52840::gpio::Pin; use nrf52840::interrupt_service::Nrf52840DefaultPeripherals; @@ -58,6 +57,8 @@ kernel::stack_size! {0x2000} type AlarmDriver = components::alarm::AlarmDriverComponentType>; +type SchedulerObj = components::sched::round_robin::RoundRobinComponentType; + /// Supported drivers by the platform pub struct Platform { console: &'static capsules_core::console::Console<'static>, @@ -67,7 +68,7 @@ pub struct Platform { 4, >, alarm: &'static AlarmDriver, - scheduler: &'static RoundRobinSched<'static>, + scheduler: &'static SchedulerObj, systick: cortexm4::systick::SysTick, processes: &'static ProcessArray, } @@ -110,7 +111,7 @@ impl KernelResources; + type Scheduler = SchedulerObj; type SchedulerTimer = cortexm4::systick::SysTick; type WatchDog = (); type ContextSwitchCallback = (); diff --git a/boards/configurations/nrf52840dk/nrf52840dk-test-dynamic-app-load/src/main.rs b/boards/configurations/nrf52840dk/nrf52840dk-test-dynamic-app-load/src/main.rs index 87e7d21bb1..07e13fc499 100644 --- a/boards/configurations/nrf52840dk/nrf52840dk-test-dynamic-app-load/src/main.rs +++ b/boards/configurations/nrf52840dk/nrf52840dk-test-dynamic-app-load/src/main.rs @@ -14,7 +14,6 @@ use kernel::hil::time::Counter; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; use kernel::process::ProcessLoadingAsync; -use kernel::scheduler::round_robin::RoundRobinSched; use kernel::{capabilities, create_capability, static_init}; use nrf52840::gpio::Pin; use nrf52840::interrupt_service::Nrf52840DefaultPeripherals; @@ -75,6 +74,8 @@ type DynamicBinaryStorage<'a> = kernel::dynamic_binary_storage::SequentialDynami NonVolatilePages, >; +type SchedulerObj = components::sched::round_robin::RoundRobinComponentType; + /// Supported drivers by the platform pub struct Platform { console: &'static capsules_core::console::Console<'static>, @@ -86,7 +87,7 @@ pub struct Platform { 4, >, alarm: &'static AlarmDriver, - scheduler: &'static RoundRobinSched<'static>, + scheduler: &'static SchedulerObj, systick: cortexm4::systick::SysTick, processes: &'static ProcessArray, dynamic_app_loader: &'static capsules_extra::app_loader::AppLoader< @@ -136,7 +137,7 @@ impl KernelResources; + type Scheduler = SchedulerObj; type SchedulerTimer = cortexm4::systick::SysTick; type WatchDog = (); type ContextSwitchCallback = (); diff --git a/boards/configurations/nrf52840dk/nrf52840dk-test-invs/src/main.rs b/boards/configurations/nrf52840dk/nrf52840dk-test-invs/src/main.rs index 255a7e3af3..a0ddac3883 100644 --- a/boards/configurations/nrf52840dk/nrf52840dk-test-invs/src/main.rs +++ b/boards/configurations/nrf52840dk/nrf52840dk-test-invs/src/main.rs @@ -13,7 +13,6 @@ use kernel::hil::led::LedLow; use kernel::hil::time::Counter; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::round_robin::RoundRobinSched; use kernel::{capabilities, create_capability, static_init}; use nrf52840::gpio::Pin; use nrf52840::interrupt_service::Nrf52840DefaultPeripherals; @@ -76,6 +75,8 @@ type InvsDriver = components::isolated_nonvolatile_storage::IsolatedNonvolatileS APP_STORAGE_REGION_SIZE, >; +type SchedulerObj = components::sched::round_robin::RoundRobinComponentType; + /// Supported drivers by the platform pub struct Platform { console: &'static capsules_core::console::Console<'static>, @@ -86,7 +87,7 @@ pub struct Platform { >, alarm: &'static AlarmDriver, invs: &'static InvsDriver, - scheduler: &'static RoundRobinSched<'static>, + scheduler: &'static SchedulerObj, systick: cortexm4::systick::SysTick, } @@ -129,7 +130,7 @@ impl KernelResources; + type Scheduler = SchedulerObj; type SchedulerTimer = cortexm4::systick::SysTick; type WatchDog = (); type ContextSwitchCallback = (); diff --git a/boards/configurations/nrf52840dk/nrf52840dk-test-kernel/src/main.rs b/boards/configurations/nrf52840dk/nrf52840dk-test-kernel/src/main.rs index d8a87485f8..9b8ae75f3f 100644 --- a/boards/configurations/nrf52840dk/nrf52840dk-test-kernel/src/main.rs +++ b/boards/configurations/nrf52840dk/nrf52840dk-test-kernel/src/main.rs @@ -14,7 +14,6 @@ use kernel::component::Component; use kernel::hil::time::Counter; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::round_robin::RoundRobinSched; use kernel::utilities::cells::NumericCellExt; use kernel::{capabilities, create_capability, static_init}; use nrf52840::chip::Nrf52DefaultPeripherals; @@ -51,9 +50,11 @@ kernel::stack_size! {0x2000} // SYSCALL DRIVER TYPE DEFINITIONS //------------------------------------------------------------------------------ +type SchedulerObj = components::sched::round_robin::RoundRobinComponentType; + /// Supported drivers by the platform pub struct Platform { - scheduler: &'static RoundRobinSched<'static>, + scheduler: &'static SchedulerObj, systick: cortexm4::systick::SysTick, } @@ -127,7 +128,7 @@ impl KernelResources; + type Scheduler = SchedulerObj; type SchedulerTimer = cortexm4::systick::SysTick; type WatchDog = (); type ContextSwitchCallback = (); diff --git a/boards/cy8cproto_62_4343_w/src/main.rs b/boards/cy8cproto_62_4343_w/src/main.rs index 5c4c03e183..c73a49b50c 100644 --- a/boards/cy8cproto_62_4343_w/src/main.rs +++ b/boards/cy8cproto_62_4343_w/src/main.rs @@ -20,7 +20,6 @@ use kernel::component::Component; use kernel::hil::led::LedHigh; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::round_robin::RoundRobinSched; use kernel::{capabilities, create_capability, static_init}; #[allow(unused)] @@ -47,6 +46,8 @@ static mut CHIP: Option<&'static Psoc62xa> = None; static mut PROCESS_PRINTER: Option<&'static capsules_system::process_printer::ProcessPrinterText> = None; +type SchedulerObj = components::sched::round_robin::RoundRobinComponentType; + /// Supported drivers by the platform pub struct Cy8cproto0624343w { console: &'static capsules_core::console::Console<'static>, @@ -57,7 +58,7 @@ pub struct Cy8cproto0624343w { led: &'static capsules_core::led::LedDriver<'static, LedHigh<'static, GpioPin<'static>>, 1>, button: &'static capsules_core::button::Button<'static, GpioPin<'static>>, gpio: &'static capsules_core::gpio::GPIO<'static, psoc62xa::gpio::GpioPin<'static>>, - scheduler: &'static RoundRobinSched<'static>, + scheduler: &'static SchedulerObj, systick: cortexm0p::systick::SysTick, } @@ -81,7 +82,7 @@ impl KernelResources>> for type SyscallDriverLookup = Self; type SyscallFilter = (); type ProcessFault = (); - type Scheduler = RoundRobinSched<'static>; + type Scheduler = SchedulerObj; type SchedulerTimer = cortexm0p::systick::SysTick; type WatchDog = (); type ContextSwitchCallback = (); diff --git a/boards/esp32-c3-devkitM-1/src/main.rs b/boards/esp32-c3-devkitM-1/src/main.rs index e852c0f614..6f4f286fd5 100644 --- a/boards/esp32-c3-devkitM-1/src/main.rs +++ b/boards/esp32-c3-devkitM-1/src/main.rs @@ -18,7 +18,6 @@ use kernel::component::Component; use kernel::platform::scheduler_timer::VirtualSchedulerTimer; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::priority::PrioritySched; use kernel::utilities::registers::interfaces::ReadWriteable; use kernel::{create_capability, debug, hil, static_init}; use rv32i::csr; @@ -66,6 +65,12 @@ kernel::stack_size! {0x900} type RngDriver = components::rng::RngComponentType>; +struct ProcessManagementCapabilityObj {} +unsafe impl capabilities::ProcessManagementCapability for ProcessManagementCapabilityObj {} + +type SchedulerObj = + components::sched::priority::PriorityComponentType; + /// A structure representing this platform that holds references to all /// capsules for this platform. We've included an alarm and console. struct Esp32C3Board { @@ -75,7 +80,7 @@ struct Esp32C3Board { 'static, VirtualMuxAlarm<'static, esp32_c3::timg::TimG<'static>>, >, - scheduler: &'static PrioritySched, + scheduler: &'static SchedulerObj, scheduler_timer: &'static VirtualSchedulerTimer>, rng: &'static RngDriver, } @@ -103,7 +108,7 @@ impl KernelResources>; type WatchDog = (); @@ -276,8 +281,13 @@ unsafe fn setup() -> ( static _eappmem: u8; } - let scheduler = components::sched::priority::PriorityComponent::new(board_kernel) - .finalize(components::priority_component_static!()); + let scheduler = components::sched::priority::PriorityComponent::new( + board_kernel, + ProcessManagementCapabilityObj {}, + ) + .finalize(components::priority_component_static!( + ProcessManagementCapabilityObj + )); // PROCESS CONSOLE let process_console = components::process_console::ProcessConsoleComponent::new( diff --git a/boards/hail/src/main.rs b/boards/hail/src/main.rs index 962e2ab86a..197b684d38 100644 --- a/boards/hail/src/main.rs +++ b/boards/hail/src/main.rs @@ -18,7 +18,6 @@ use kernel::hil::led::LedLow; use kernel::hil::Controller; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::round_robin::RoundRobinSched; #[allow(unused_imports)] use kernel::{create_capability, debug, debug_gpio, static_init}; use sam4l::chip::Sam4lDefaultPeripherals; @@ -53,6 +52,8 @@ type TemperatureDriver = components::temperature::TemperatureComponentType; type RngDriver = components::rng::RngComponentType>; +type SchedulerObj = components::sched::round_robin::RoundRobinComponentType; + /// A structure representing this platform that holds references to all /// capsules for this platform. struct Hail { @@ -88,7 +89,7 @@ struct Hail { ipc: kernel::ipc::IPC<{ NUM_PROCS as u8 }>, crc: &'static capsules_extra::crc::CrcDriver<'static, sam4l::crccu::Crccu<'static>>, dac: &'static capsules_extra::dac::Dac<'static>, - scheduler: &'static RoundRobinSched<'static>, + scheduler: &'static SchedulerObj, systick: cortexm4::systick::SysTick, } @@ -129,7 +130,7 @@ impl KernelResources> for Hail { type SyscallDriverLookup = Self; type SyscallFilter = (); type ProcessFault = (); - type Scheduler = RoundRobinSched<'static>; + type Scheduler = SchedulerObj; type SchedulerTimer = cortexm4::systick::SysTick; type WatchDog = (); type ContextSwitchCallback = (); diff --git a/boards/hifive1/src/main.rs b/boards/hifive1/src/main.rs index 0bbfdaacd3..f2135c5c97 100644 --- a/boards/hifive1/src/main.rs +++ b/boards/hifive1/src/main.rs @@ -20,7 +20,6 @@ use kernel::hil::led::LedLow; use kernel::platform::scheduler_timer::VirtualSchedulerTimer; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::cooperative::CooperativeSched; use kernel::utilities::registers::interfaces::ReadWriteable; use kernel::Kernel; use kernel::{create_capability, debug, static_init}; @@ -46,6 +45,8 @@ const FAULT_RESPONSE: capsules_system::process_policies::PanicFaultPolicy = kernel::stack_size! {0x900} +type SchedulerObj = components::sched::cooperative::CooperativeComponentType; + /// A structure representing this platform that holds references to all /// capsules for this platform. We've included an alarm and console. struct HiFive1 { @@ -63,7 +64,7 @@ struct HiFive1 { 'static, VirtualMuxAlarm<'static, e310_g002::chip::E310xClint<'static>>, >, - scheduler: &'static CooperativeSched<'static>, + scheduler: &'static SchedulerObj, scheduler_timer: &'static VirtualSchedulerTimer< VirtualMuxAlarm<'static, e310_g002::chip::E310xClint<'static>>, >, @@ -91,7 +92,7 @@ impl KernelResources; + type Scheduler = SchedulerObj; type SchedulerTimer = VirtualSchedulerTimer>>; type WatchDog = (); diff --git a/boards/hifive_inventor/src/main.rs b/boards/hifive_inventor/src/main.rs index ee9c9e11c7..8f0d8d086f 100644 --- a/boards/hifive_inventor/src/main.rs +++ b/boards/hifive_inventor/src/main.rs @@ -17,7 +17,6 @@ use kernel::hil; use kernel::platform::scheduler_timer::VirtualSchedulerTimer; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::cooperative::CooperativeSched; use kernel::utilities::registers::interfaces::ReadWriteable; use kernel::{create_capability, debug, static_init}; use rv32i::csr; @@ -42,6 +41,8 @@ const FAULT_RESPONSE: capsules_system::process_policies::PanicFaultPolicy = kernel::stack_size! {0x1500} +type SchedulerObj = components::sched::cooperative::CooperativeComponentType; + /// A structure representing this platform that holds references to all /// capsules for this platform. We've included an alarm and console. struct HiFiveInventor { @@ -54,7 +55,7 @@ struct HiFiveInventor { 'static, VirtualMuxAlarm<'static, e310_g003::chip::E310xClint<'static>>, >, - scheduler: &'static CooperativeSched<'static>, + scheduler: &'static SchedulerObj, scheduler_timer: &'static VirtualSchedulerTimer< VirtualMuxAlarm<'static, e310_g003::chip::E310xClint<'static>>, >, @@ -81,7 +82,7 @@ impl KernelResources; + type Scheduler = SchedulerObj; type SchedulerTimer = VirtualSchedulerTimer>>; type WatchDog = (); diff --git a/boards/imix/src/main.rs b/boards/imix/src/main.rs index 333d3a17d9..cecd49adc4 100644 --- a/boards/imix/src/main.rs +++ b/boards/imix/src/main.rs @@ -31,7 +31,6 @@ use kernel::hil::radio::{RadioConfig, RadioData}; use kernel::hil::symmetric_encryption::AES128; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::round_robin::RoundRobinSched; //use kernel::hil::time::Alarm; use kernel::hil::led::LedHigh; @@ -119,6 +118,8 @@ type Rf233 = capsules_extra::rf233::RF233< type Ieee802154MacDevice = components::ieee802154::Ieee802154ComponentMacDeviceType>; +type SchedulerObj = components::sched::round_robin::RoundRobinComponentType; + struct Imix { pconsole: &'static capsules_core::process_console::ProcessConsole< 'static, @@ -165,7 +166,7 @@ struct Imix { nrf51822: &'static capsules_extra::nrf51822_serialization::Nrf51822Serialization<'static>, nonvolatile_storage: &'static capsules_extra::nonvolatile_storage_driver::NonvolatileStorage<'static>, - scheduler: &'static RoundRobinSched<'static>, + scheduler: &'static SchedulerObj, systick: cortexm4::systick::SysTick, } @@ -205,7 +206,7 @@ impl KernelResources> for Imix { type SyscallDriverLookup = Self; type SyscallFilter = (); type ProcessFault = (); - type Scheduler = RoundRobinSched<'static>; + type Scheduler = SchedulerObj; type SchedulerTimer = cortexm4::systick::SysTick; type WatchDog = (); type ContextSwitchCallback = (); diff --git a/boards/imxrt1050-evkb/src/main.rs b/boards/imxrt1050-evkb/src/main.rs index 5bb2ca390e..254ceaac1d 100644 --- a/boards/imxrt1050-evkb/src/main.rs +++ b/boards/imxrt1050-evkb/src/main.rs @@ -21,7 +21,6 @@ use kernel::hil::gpio::Configure; use kernel::hil::led::LedLow; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::round_robin::RoundRobinSched; use kernel::{create_capability, static_init}; // use components::fxos8700::Fxos8700Component; @@ -68,6 +67,8 @@ static BOOT_HDR: [u8; 8192] = boot_header::BOOT_HDR; kernel::stack_size! {0x2000} +type SchedulerObj = components::sched::round_robin::RoundRobinComponentType; + // const NUM_LEDS: usize = 1; /// A structure representing this platform that holds references to all @@ -88,7 +89,7 @@ struct Imxrt1050EVKB { >, ninedof: &'static capsules_extra::ninedof::NineDof<'static>, - scheduler: &'static RoundRobinSched<'static>, + scheduler: &'static SchedulerObj, systick: cortexm7::systick::SysTick, } @@ -117,7 +118,7 @@ impl KernelResources; + type Scheduler = SchedulerObj; type SchedulerTimer = cortexm7::systick::SysTick; type WatchDog = (); type ContextSwitchCallback = (); diff --git a/boards/litex/arty/src/main.rs b/boards/litex/arty/src/main.rs index 151114e5a5..a6b731c0da 100644 --- a/boards/litex/arty/src/main.rs +++ b/boards/litex/arty/src/main.rs @@ -17,7 +17,6 @@ use kernel::platform::chip::InterruptService; use kernel::platform::scheduler_timer::VirtualSchedulerTimer; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::mlfq::MLFQSched; use kernel::utilities::registers::interfaces::ReadWriteable; use kernel::utilities::StaticRef; use kernel::{create_capability, debug, static_init}; @@ -111,6 +110,10 @@ const FAULT_RESPONSE: capsules_system::process_policies::PanicFaultPolicy = kernel::stack_size! {0x2000} +type AlarmHw = + litex_vexriscv::timer::LiteXAlarm<'static, 'static, socc::SoCRegisterFmt, socc::ClockFrequency>; +type SchedulerObj = components::sched::mlfq::MLFQComponentType; + /// A structure representing this platform that holds references to all /// capsules for this platform. struct LiteXArty { @@ -151,18 +154,7 @@ struct LiteXArty { >, >, ipc: kernel::ipc::IPC<{ NUM_PROCS as u8 }>, - scheduler: &'static MLFQSched< - 'static, - VirtualMuxAlarm< - 'static, - litex_vexriscv::timer::LiteXAlarm< - 'static, - 'static, - socc::SoCRegisterFmt, - socc::ClockFrequency, - >, - >, - >, + scheduler: &'static SchedulerObj, scheduler_timer: &'static VirtualSchedulerTimer< VirtualMuxAlarm< 'static, @@ -199,18 +191,7 @@ impl KernelResources, - >, - >; + type Scheduler = SchedulerObj; type SchedulerTimer = VirtualSchedulerTimer< VirtualMuxAlarm< 'static, @@ -609,17 +590,8 @@ unsafe fn start() -> ( ) .finalize(components::low_level_debug_component_static!()); - let scheduler = components::sched::mlfq::MLFQComponent::new(mux_alarm, processes).finalize( - components::mlfq_component_static!( - litex_vexriscv::timer::LiteXAlarm< - 'static, - 'static, - socc::SoCRegisterFmt, - socc::ClockFrequency, - >, - NUM_PROCS - ), - ); + let scheduler = components::sched::mlfq::MLFQComponent::new(mux_alarm, processes) + .finalize(components::mlfq_component_static!(AlarmHw, NUM_PROCS)); let litex_arty = LiteXArty { console, diff --git a/boards/litex/sim/src/main.rs b/boards/litex/sim/src/main.rs index 68a4139d9a..72668336db 100644 --- a/boards/litex/sim/src/main.rs +++ b/boards/litex/sim/src/main.rs @@ -16,7 +16,6 @@ use kernel::platform::chip::InterruptService; use kernel::platform::scheduler_timer::VirtualSchedulerTimer; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::mlfq::MLFQSched; use kernel::utilities::registers::interfaces::ReadWriteable; use kernel::utilities::StaticRef; use kernel::{create_capability, debug, static_init}; @@ -111,6 +110,10 @@ const FAULT_RESPONSE: capsules_system::process_policies::PanicFaultPolicy = kernel::stack_size! {0x2000} +type AlarmHw = + litex_vexriscv::timer::LiteXAlarm<'static, 'static, socc::SoCRegisterFmt, socc::ClockFrequency>; +type SchedulerObj = components::sched::mlfq::MLFQComponentType; + /// A structure representing this platform that holds references to all /// capsules for this platform. struct LiteXSim { @@ -148,18 +151,7 @@ struct LiteXSim { >, >, ipc: kernel::ipc::IPC<{ NUM_PROCS as u8 }>, - scheduler: &'static MLFQSched< - 'static, - VirtualMuxAlarm< - 'static, - litex_vexriscv::timer::LiteXAlarm< - 'static, - 'static, - socc::SoCRegisterFmt, - socc::ClockFrequency, - >, - >, - >, + scheduler: &'static SchedulerObj, scheduler_timer: &'static VirtualSchedulerTimer< VirtualMuxAlarm< 'static, @@ -198,18 +190,7 @@ impl KernelResources, - >, - >; + type Scheduler = SchedulerObj; type SchedulerTimer = VirtualSchedulerTimer< VirtualMuxAlarm< 'static, @@ -682,17 +663,8 @@ unsafe fn start() -> ( ) .finalize(components::low_level_debug_component_static!()); - let scheduler = components::sched::mlfq::MLFQComponent::new(mux_alarm, processes).finalize( - components::mlfq_component_static!( - litex_vexriscv::timer::LiteXAlarm< - 'static, - 'static, - socc::SoCRegisterFmt, - socc::ClockFrequency, - >, - NUM_PROCS - ), - ); + let scheduler = components::sched::mlfq::MLFQComponent::new(mux_alarm, processes) + .finalize(components::mlfq_component_static!(AlarmHw, NUM_PROCS)); let litex_sim = LiteXSim { gpio_driver, diff --git a/boards/makepython-nrf52840/src/main.rs b/boards/makepython-nrf52840/src/main.rs index 5319900250..a3540bd7d3 100644 --- a/boards/makepython-nrf52840/src/main.rs +++ b/boards/makepython-nrf52840/src/main.rs @@ -19,7 +19,6 @@ use kernel::hil::time::Counter; use kernel::hil::usb::Client; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::round_robin::RoundRobinSched; #[allow(unused_imports)] use kernel::{create_capability, debug, debug_gpio, debug_verbose, static_init}; @@ -120,6 +119,8 @@ type Ieee802154Driver = components::ieee802154::Ieee802154ComponentType< >; type RngDriver = components::rng::RngComponentType>; +type SchedulerObj = components::sched::round_robin::RoundRobinComponentType; + /// Supported drivers by the platform pub struct Platform { ble_radio: &'static capsules_extra::ble_advertising_driver::BLE< @@ -154,7 +155,7 @@ pub struct Platform { button: &'static capsules_core::button::Button<'static, nrf52840::gpio::GPIOPin<'static>>, screen: &'static ScreenDriver, udp_driver: &'static capsules_extra::net::udp::UDPDriver<'static>, - scheduler: &'static RoundRobinSched<'static>, + scheduler: &'static SchedulerObj, systick: cortexm4::systick::SysTick, } @@ -187,7 +188,7 @@ impl KernelResources; + type Scheduler = SchedulerObj; type SchedulerTimer = cortexm4::systick::SysTick; type WatchDog = (); type ContextSwitchCallback = (); diff --git a/boards/microbit_v2/src/main.rs b/boards/microbit_v2/src/main.rs index be7a3e07af..3df7e5c036 100644 --- a/boards/microbit_v2/src/main.rs +++ b/boards/microbit_v2/src/main.rs @@ -17,7 +17,6 @@ use kernel::component::Component; use kernel::hil::time::Counter; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::round_robin::RoundRobinSched; #[allow(unused_imports)] use kernel::{create_capability, debug, debug_gpio, debug_verbose, static_init}; @@ -86,6 +85,8 @@ type RngDriver = components::rng::RngComponentType type Ieee802154RawDriver = components::ieee802154::Ieee802154RawComponentType>; +type SchedulerObj = components::sched::round_robin::RoundRobinComponentType; + /// Supported drivers by the platform pub struct MicroBit { ble_radio: &'static capsules_extra::ble_advertising_driver::BLE< @@ -144,7 +145,7 @@ pub struct MicroBit { app_flash: &'static capsules_extra::app_flash_driver::AppFlash<'static>, sound_pressure: &'static capsules_extra::sound_pressure::SoundPressureSensor<'static>, - scheduler: &'static RoundRobinSched<'static>, + scheduler: &'static SchedulerObj, systick: cortexm4::systick::SysTick, } @@ -183,7 +184,7 @@ impl KernelResources; + type Scheduler = SchedulerObj; type SchedulerTimer = cortexm4::systick::SysTick; type WatchDog = (); type ContextSwitchCallback = (); diff --git a/boards/msp_exp432p401r/src/main.rs b/boards/msp_exp432p401r/src/main.rs index cf5e392c15..67329265cd 100644 --- a/boards/msp_exp432p401r/src/main.rs +++ b/boards/msp_exp432p401r/src/main.rs @@ -16,7 +16,6 @@ use kernel::component::Component; use kernel::hil::gpio::Configure; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::round_robin::RoundRobinSched; use kernel::{create_capability, debug, static_init}; /// Support routines for debugging I/O. @@ -43,6 +42,8 @@ const FAULT_RESPONSE: capsules_system::process_policies::PanicFaultPolicy = kernel::stack_size! {0x1000} +type SchedulerObj = components::sched::round_robin::RoundRobinComponentType; + /// A structure representing this platform that holds references to all /// capsules for this platform. struct MspExp432P401R { @@ -64,7 +65,7 @@ struct MspExp432P401R { ipc: kernel::ipc::IPC<{ NUM_PROCS as u8 }>, adc: &'static capsules_core::adc::AdcDedicated<'static, msp432::adc::Adc<'static>>, wdt: &'static msp432::wdt::Wdt, - scheduler: &'static RoundRobinSched<'static>, + scheduler: &'static SchedulerObj, systick: cortexm4::systick::SysTick, } @@ -74,7 +75,7 @@ impl KernelResources; + type Scheduler = SchedulerObj; type SchedulerTimer = cortexm4::systick::SysTick; type WatchDog = msp432::wdt::Wdt; type ContextSwitchCallback = (); diff --git a/boards/nano33ble/src/main.rs b/boards/nano33ble/src/main.rs index 5243115287..704e0c64de 100644 --- a/boards/nano33ble/src/main.rs +++ b/boards/nano33ble/src/main.rs @@ -22,7 +22,6 @@ use kernel::hil::usb::Client; use kernel::platform::chip::Chip; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::round_robin::RoundRobinSched; #[allow(unused_imports)] use kernel::{create_capability, debug, debug_gpio, debug_verbose, static_init}; @@ -128,6 +127,8 @@ type Ieee802154Driver = components::ieee802154::Ieee802154ComponentType< >; type RngDriver = components::rng::RngComponentType>; +type SchedulerObj = components::sched::round_robin::RoundRobinComponentType; + /// Supported drivers by the platform pub struct Platform { ble_radio: &'static capsules_extra::ble_advertising_driver::BLE< @@ -169,7 +170,7 @@ pub struct Platform { >, >, udp_driver: &'static capsules_extra::net::udp::UDPDriver<'static>, - scheduler: &'static RoundRobinSched<'static>, + scheduler: &'static SchedulerObj, systick: cortexm4::systick::SysTick, } @@ -203,7 +204,7 @@ impl KernelResources; + type Scheduler = SchedulerObj; type SchedulerTimer = cortexm4::systick::SysTick; type WatchDog = (); type ContextSwitchCallback = (); diff --git a/boards/nano33ble_rev2/src/main.rs b/boards/nano33ble_rev2/src/main.rs index 1b4b98f4e6..99c4449604 100644 --- a/boards/nano33ble_rev2/src/main.rs +++ b/boards/nano33ble_rev2/src/main.rs @@ -22,7 +22,6 @@ use kernel::hil::usb::Client; use kernel::platform::chip::Chip; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::round_robin::RoundRobinSched; #[allow(unused_imports)] use kernel::{create_capability, debug, debug_gpio, debug_verbose, static_init}; @@ -125,6 +124,8 @@ type Ieee802154Driver = components::ieee802154::Ieee802154ComponentType< >; type RngDriver = components::rng::RngComponentType>; +type SchedulerObj = components::sched::round_robin::RoundRobinComponentType; + /// Supported drivers by the platform pub struct Platform { ble_radio: &'static capsules_extra::ble_advertising_driver::BLE< @@ -176,7 +177,7 @@ pub struct Platform { >, >, udp_driver: &'static capsules_extra::net::udp::UDPDriver<'static>, - scheduler: &'static RoundRobinSched<'static>, + scheduler: &'static SchedulerObj, systick: cortexm4::systick::SysTick, } @@ -211,7 +212,7 @@ impl KernelResources; + type Scheduler = SchedulerObj; type SchedulerTimer = cortexm4::systick::SysTick; type WatchDog = (); type ContextSwitchCallback = (); diff --git a/boards/nano_rp2040_connect/src/main.rs b/boards/nano_rp2040_connect/src/main.rs index 50cdf120e7..a834d2a5f5 100644 --- a/boards/nano_rp2040_connect/src/main.rs +++ b/boards/nano_rp2040_connect/src/main.rs @@ -22,7 +22,6 @@ use kernel::hil::led::LedHigh; use kernel::hil::usb::Client; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::round_robin::RoundRobinSched; use kernel::syscall::SyscallDriver; use kernel::{capabilities, create_capability, static_init}; use rp2040::adc::{Adc, Channel}; @@ -69,6 +68,8 @@ type TemperatureRp2040Sensor = components::temperature_rp2040::TemperatureRp2040 >; type TemperatureDriver = components::temperature::TemperatureComponentType; +type SchedulerObj = components::sched::round_robin::RoundRobinComponentType; + /// Supported drivers by the platform pub struct NanoRP2040Connect { ipc: kernel::ipc::IPC<{ NUM_PROCS as u8 }>, @@ -90,7 +91,7 @@ pub struct NanoRP2040Connect { >, >, - scheduler: &'static RoundRobinSched<'static>, + scheduler: &'static SchedulerObj, systick: cortexm0p::systick::SysTick, } @@ -118,7 +119,7 @@ impl KernelResources>> for Nan type SyscallDriverLookup = Self; type SyscallFilter = (); type ProcessFault = (); - type Scheduler = RoundRobinSched<'static>; + type Scheduler = SchedulerObj; type SchedulerTimer = cortexm0p::systick::SysTick; type WatchDog = (); type ContextSwitchCallback = (); diff --git a/boards/nordic/nrf52840_dongle/src/main.rs b/boards/nordic/nrf52840_dongle/src/main.rs index f5f4a42361..42209a0c48 100644 --- a/boards/nordic/nrf52840_dongle/src/main.rs +++ b/boards/nordic/nrf52840_dongle/src/main.rs @@ -22,7 +22,6 @@ use kernel::hil::symmetric_encryption::AES128; use kernel::hil::time::Counter; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::round_robin::RoundRobinSched; #[allow(unused_imports)] use kernel::{capabilities, create_capability, debug, debug_gpio, debug_verbose, static_init}; use nrf52840::gpio::Pin; @@ -87,6 +86,8 @@ type Ieee802154Driver = components::ieee802154::Ieee802154ComponentType< nrf52840::aes::AesECB<'static>, >; +type SchedulerObj = components::sched::round_robin::RoundRobinComponentType; + /// Supported drivers by the platform pub struct Platform { ble_radio: &'static capsules_extra::ble_advertising_driver::BLE< @@ -123,7 +124,7 @@ pub struct Platform { nrf52840::rtc::Rtc<'static>, >, >, - scheduler: &'static RoundRobinSched<'static>, + scheduler: &'static SchedulerObj, systick: cortexm4::systick::SysTick, } @@ -155,7 +156,7 @@ impl KernelResources; + type Scheduler = SchedulerObj; type SchedulerTimer = cortexm4::systick::SysTick; type WatchDog = (); type ContextSwitchCallback = (); diff --git a/boards/nordic/nrf52840dk/src/lib.rs b/boards/nordic/nrf52840dk/src/lib.rs index 1d4b0963f5..e12371bcef 100644 --- a/boards/nordic/nrf52840dk/src/lib.rs +++ b/boards/nordic/nrf52840dk/src/lib.rs @@ -82,7 +82,6 @@ use kernel::hil::time::Counter; use kernel::hil::usb::Client; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::round_robin::RoundRobinSched; #[allow(unused_imports)] use kernel::{capabilities, create_capability, debug, debug_gpio, debug_verbose, static_init}; use nrf52840::gpio::Pin; @@ -194,6 +193,8 @@ pub type Ieee802154Driver = components::ieee802154::Ieee802154ComponentType< /// Userspace EUI64 driver. pub type Eui64Driver = components::eui64::Eui64ComponentType; +type SchedulerObj = components::sched::round_robin::RoundRobinComponentType; + /// Supported drivers by the platform pub struct Platform { ble_radio: &'static capsules_extra::ble_advertising_driver::BLE< @@ -237,7 +238,7 @@ pub struct Platform { >, >, kv_driver: &'static KVDriver, - scheduler: &'static RoundRobinSched<'static>, + scheduler: &'static SchedulerObj, systick: cortexm4::systick::SysTick, } @@ -270,7 +271,7 @@ impl KernelResources for Platform { type SyscallDriverLookup = Self; type SyscallFilter = (); type ProcessFault = (); - type Scheduler = RoundRobinSched<'static>; + type Scheduler = SchedulerObj; type SchedulerTimer = cortexm4::systick::SysTick; type WatchDog = (); type ContextSwitchCallback = (); diff --git a/boards/nordic/nrf52dk/src/main.rs b/boards/nordic/nrf52dk/src/main.rs index 90b6369a86..0296910b8b 100644 --- a/boards/nordic/nrf52dk/src/main.rs +++ b/boards/nordic/nrf52dk/src/main.rs @@ -77,7 +77,6 @@ use kernel::hil::led::LedLow; use kernel::hil::time::Counter; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::round_robin::RoundRobinSched; #[allow(unused_imports)] use kernel::{capabilities, create_capability, debug, debug_gpio, debug_verbose, static_init}; use nrf52832::gpio::Pin; @@ -139,6 +138,8 @@ type TemperatureDriver = components::temperature::TemperatureComponentType>; type RngDriver = components::rng::RngComponentType>; +type SchedulerObj = components::sched::round_robin::RoundRobinComponentType; + /// Supported drivers by the platform pub struct Platform { ble_radio: &'static capsules_extra::ble_advertising_driver::BLE< @@ -174,7 +175,7 @@ pub struct Platform { nrf52832::rtc::Rtc<'static>, >, >, - scheduler: &'static RoundRobinSched<'static>, + scheduler: &'static SchedulerObj, systick: cortexm4::systick::SysTick, } @@ -205,7 +206,7 @@ impl KernelResources; + type Scheduler = SchedulerObj; type SchedulerTimer = cortexm4::systick::SysTick; type WatchDog = (); type ContextSwitchCallback = (); diff --git a/boards/nucleo_f429zi/src/main.rs b/boards/nucleo_f429zi/src/main.rs index 98fbc4a93c..e5169e719f 100644 --- a/boards/nucleo_f429zi/src/main.rs +++ b/boards/nucleo_f429zi/src/main.rs @@ -19,7 +19,6 @@ use kernel::component::Component; use kernel::hil::led::LedHigh; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::round_robin::RoundRobinSched; use kernel::{create_capability, debug, static_init}; use stm32f429zi::chip_specs::Stm32f429Specs; @@ -57,6 +56,8 @@ type TemperatureSTMSensor = components::temperature_stm::TemperatureSTMComponent type TemperatureDriver = components::temperature::TemperatureComponentType; type RngDriver = components::rng::RngComponentType>; +type SchedulerObj = components::sched::round_robin::RoundRobinComponentType; + /// Nucleo F429ZI HSE frequency in MHz pub const NUCLEO_F429ZI_HSE_FREQUENCY_MHZ: usize = 8; @@ -81,7 +82,7 @@ struct NucleoF429ZI { gpio: &'static capsules_core::gpio::GPIO<'static, stm32f429zi::gpio::Pin<'static>>, rng: &'static RngDriver, - scheduler: &'static RoundRobinSched<'static>, + scheduler: &'static SchedulerObj, systick: cortexm4::systick::SysTick, can: &'static capsules_extra::can::CanCapsule<'static, stm32f429zi::can::Can<'static>>, date_time: &'static capsules_extra::date_time::DateTimeCapsule< @@ -125,7 +126,7 @@ impl type SyscallDriverLookup = Self; type SyscallFilter = (); type ProcessFault = (); - type Scheduler = RoundRobinSched<'static>; + type Scheduler = SchedulerObj; type SchedulerTimer = cortexm4::systick::SysTick; type WatchDog = (); type ContextSwitchCallback = (); diff --git a/boards/nucleo_f446re/src/main.rs b/boards/nucleo_f446re/src/main.rs index 3a739d27e1..74234ff9e3 100644 --- a/boards/nucleo_f446re/src/main.rs +++ b/boards/nucleo_f446re/src/main.rs @@ -20,7 +20,6 @@ use kernel::hil::gpio::Configure; use kernel::hil::led::LedHigh; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::round_robin::RoundRobinSched; use kernel::{create_capability, debug, static_init}; use stm32f446re::chip_specs::Stm32f446Specs; use stm32f446re::clocks::hsi::HSI_FREQUENCY_MHZ; @@ -59,6 +58,8 @@ type TemperatureSTMSensor = components::temperature_stm::TemperatureSTMComponent >; type TemperatureDriver = components::temperature::TemperatureComponentType; +type SchedulerObj = components::sched::round_robin::RoundRobinComponentType; + /// A structure representing this platform that holds references to all /// capsules for this platform. struct NucleoF446RE { @@ -79,7 +80,7 @@ struct NucleoF446RE { temperature: &'static TemperatureDriver, gpio: &'static capsules_core::gpio::GPIO<'static, stm32f446re::gpio::Pin<'static>>, - scheduler: &'static RoundRobinSched<'static>, + scheduler: &'static SchedulerObj, systick: cortexm4::systick::SysTick, } @@ -114,7 +115,7 @@ impl type SyscallDriverLookup = Self; type SyscallFilter = (); type ProcessFault = (); - type Scheduler = RoundRobinSched<'static>; + type Scheduler = SchedulerObj; type SchedulerTimer = cortexm4::systick::SysTick; type WatchDog = (); type ContextSwitchCallback = (); diff --git a/boards/opentitan/earlgrey-cw310/src/main.rs b/boards/opentitan/earlgrey-cw310/src/main.rs index 7165ca970f..4f52358459 100644 --- a/boards/opentitan/earlgrey-cw310/src/main.rs +++ b/boards/opentitan/earlgrey-cw310/src/main.rs @@ -33,7 +33,6 @@ use kernel::hil::symmetric_encryption::AES128; use kernel::platform::scheduler_timer::VirtualSchedulerTimer; use kernel::platform::{KernelResources, SyscallDriverLookup, TbfHeaderFilterDefaultAllow}; use kernel::process::ProcessArray; -use kernel::scheduler::priority::PrioritySched; use kernel::utilities::registers::interfaces::ReadWriteable; use kernel::{create_capability, debug, static_init}; use lowrisc::flash_ctrl::FlashMPConfig; @@ -164,6 +163,12 @@ const FAULT_RESPONSE: capsules_system::process_policies::PanicFaultPolicy = kernel::stack_size! {0x1400} +struct ProcessManagementCapabilityObj {} +unsafe impl capabilities::ProcessManagementCapability for ProcessManagementCapabilityObj {} + +type SchedulerObj = + components::sched::priority::PriorityComponentType; + /// A structure representing this platform that holds references to all /// capsules for this platform. We've included an alarm and console. struct EarlGrey { @@ -229,7 +234,7 @@ struct EarlGrey { >, >, syscall_filter: &'static TbfHeaderFilterDefaultAllow, - scheduler: &'static PrioritySched, + scheduler: &'static SchedulerObj, scheduler_timer: &'static VirtualSchedulerTimer< VirtualMuxAlarm<'static, earlgrey::timer::RvTimer<'static, ChipConfig>>, >, @@ -263,7 +268,7 @@ impl KernelResources for EarlGrey { type SyscallDriverLookup = Self; type SyscallFilter = TbfHeaderFilterDefaultAllow; type ProcessFault = (); - type Scheduler = PrioritySched; + type Scheduler = SchedulerObj; type SchedulerTimer = VirtualSchedulerTimer< VirtualMuxAlarm<'static, earlgrey::timer::RvTimer<'static, ChipConfig>>, >; @@ -846,8 +851,13 @@ unsafe fn setup() -> ( hil::symmetric_encryption::AES128::set_client(gcm_client, ccm_client); let syscall_filter = static_init!(TbfHeaderFilterDefaultAllow, TbfHeaderFilterDefaultAllow {}); - let scheduler = components::sched::priority::PriorityComponent::new(board_kernel) - .finalize(components::priority_component_static!()); + let scheduler = components::sched::priority::PriorityComponent::new( + board_kernel, + ProcessManagementCapabilityObj {}, + ) + .finalize(components::priority_component_static!( + ProcessManagementCapabilityObj + )); let watchdog = &peripherals.watchdog; let earlgrey = static_init!( diff --git a/boards/particle_boron/src/main.rs b/boards/particle_boron/src/main.rs index cee8c541f6..ac24c08d8b 100644 --- a/boards/particle_boron/src/main.rs +++ b/boards/particle_boron/src/main.rs @@ -24,7 +24,6 @@ use kernel::hil::symmetric_encryption::AES128; use kernel::hil::time::Counter; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::round_robin::RoundRobinSched; #[allow(unused_imports)] use kernel::{capabilities, create_capability, debug, debug_gpio, debug_verbose, static_init}; use nrf52840::gpio::Pin; @@ -97,6 +96,8 @@ type Ieee802154Driver = components::ieee802154::Ieee802154ComponentType< nrf52840::aes::AesECB<'static>, >; +type SchedulerObj = components::sched::round_robin::RoundRobinComponentType; + /// Supported drivers by the platform pub struct Platform { ble_radio: &'static capsules_extra::ble_advertising_driver::BLE< @@ -128,7 +129,7 @@ pub struct Platform { nrf52840::rtc::Rtc<'static>, >, >, - scheduler: &'static RoundRobinSched<'static>, + scheduler: &'static SchedulerObj, systick: cortexm4::systick::SysTick, } @@ -161,7 +162,7 @@ impl KernelResources; + type Scheduler = SchedulerObj; type SchedulerTimer = cortexm4::systick::SysTick; type WatchDog = (); type ContextSwitchCallback = (); diff --git a/boards/pico_explorer_base/src/main.rs b/boards/pico_explorer_base/src/main.rs index e593cc6982..3c73f6cc45 100644 --- a/boards/pico_explorer_base/src/main.rs +++ b/boards/pico_explorer_base/src/main.rs @@ -21,7 +21,6 @@ use kernel::hil::led::LedHigh; use kernel::hil::usb::Client; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::round_robin::RoundRobinSched; use kernel::{capabilities, create_capability, static_init}; use kernel::{debug, hil}; @@ -72,6 +71,8 @@ type TemperatureRp2040Sensor = components::temperature_rp2040::TemperatureRp2040 >; type TemperatureDriver = components::temperature::TemperatureComponentType; +type SchedulerObj = components::sched::round_robin::RoundRobinComponentType; + /// Supported drivers by the platform pub struct PicoExplorerBase { ipc: kernel::ipc::IPC<{ NUM_PROCS as u8 }>, @@ -101,7 +102,7 @@ pub struct PicoExplorerBase { button: &'static capsules_core::button::Button<'static, RPGpioPin<'static>>, screen: &'static capsules_extra::screen::screen::Screen<'static>, - scheduler: &'static RoundRobinSched<'static>, + scheduler: &'static SchedulerObj, systick: cortexm0p::systick::SysTick, } @@ -130,7 +131,7 @@ impl KernelResources>> for Pic type SyscallDriverLookup = Self; type SyscallFilter = (); type ProcessFault = (); - type Scheduler = RoundRobinSched<'static>; + type Scheduler = SchedulerObj; type SchedulerTimer = cortexm0p::systick::SysTick; type WatchDog = (); type ContextSwitchCallback = (); diff --git a/boards/qemu_i486_q35/src/main.rs b/boards/qemu_i486_q35/src/main.rs index 91665c7645..cee18f3230 100644 --- a/boards/qemu_i486_q35/src/main.rs +++ b/boards/qemu_i486_q35/src/main.rs @@ -26,7 +26,6 @@ use kernel::platform::chip::InterruptService; use kernel::platform::scheduler_timer::VirtualSchedulerTimer; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::cooperative::CooperativeSched; use kernel::syscall::SyscallDriver; use kernel::utilities::cells::OptionalCell; use kernel::{create_capability, static_init}; @@ -68,6 +67,8 @@ const FAULT_RESPONSE: capsules_system::process_policies::PanicFaultPolicy = kernel::stack_size! {0x1000} +type SchedulerObj = components::sched::cooperative::CooperativeComponentType; + // Static allocations used for page tables // // These are placed into custom sections so they can be properly aligned and padded in layout.ld @@ -152,7 +153,7 @@ pub struct QemuI386Q35Platform { VirtualMuxAlarm<'static, Pit<'static, RELOAD_1KHZ>>, >, ipc: IPC<{ NUM_PROCS as u8 }>, - scheduler: &'static CooperativeSched<'static>, + scheduler: &'static SchedulerObj, scheduler_timer: &'static VirtualSchedulerTimer>>, rng: Option<&'static RngDriver<'static, VirtIORng<'static, 'static>>>, @@ -196,7 +197,7 @@ impl KernelResources for QemuI386Q35Platform &() } - type Scheduler = CooperativeSched<'static>; + type Scheduler = SchedulerObj; fn scheduler(&self) -> &Self::Scheduler { self.scheduler } diff --git a/boards/qemu_rv32_virt/src/lib.rs b/boards/qemu_rv32_virt/src/lib.rs index 939cdc3d30..ada31c3da8 100644 --- a/boards/qemu_rv32_virt/src/lib.rs +++ b/boards/qemu_rv32_virt/src/lib.rs @@ -15,7 +15,6 @@ use kernel::platform::scheduler_timer::VirtualSchedulerTimer; use kernel::platform::KernelResources; use kernel::platform::SyscallDriverLookup; use kernel::process::ProcessArray; -use kernel::scheduler::cooperative::CooperativeSched; use kernel::utilities::registers::interfaces::ReadWriteable; use kernel::{create_capability, debug, static_init}; use qemu_rv32_virt_chip::chip::{QemuRv32VirtChip, QemuRv32VirtDefaultPeripherals}; @@ -41,6 +40,8 @@ type RngDriver = components::rng::RngRandomComponentType< >; pub type ScreenHw = qemu_rv32_virt_chip::virtio::devices::virtio_gpu::VirtIOGPU<'static, 'static>; +type SchedulerObj = components::sched::cooperative::CooperativeComponentType; + kernel::stack_size! {0x8000} /// A structure representing this platform that holds references to all @@ -65,7 +66,7 @@ pub struct QemuRv32VirtPlatform { VirtualMuxAlarm<'static, qemu_rv32_virt_chip::chip::QemuRv32VirtClint<'static>>, >, pub ipc: kernel::ipc::IPC<{ NUM_PROCS as u8 }>, - scheduler: &'static CooperativeSched<'static>, + scheduler: &'static SchedulerObj, scheduler_timer: &'static VirtualSchedulerTimer< VirtualMuxAlarm<'static, qemu_rv32_virt_chip::chip::QemuRv32VirtClint<'static>>, >, @@ -128,7 +129,7 @@ impl type SyscallDriverLookup = Self; type SyscallFilter = (); type ProcessFault = (); - type Scheduler = CooperativeSched<'static>; + type Scheduler = SchedulerObj; type SchedulerTimer = VirtualSchedulerTimer< VirtualMuxAlarm<'static, qemu_rv32_virt_chip::chip::QemuRv32VirtClint<'static>>, >; diff --git a/boards/raspberry_pi_pico/src/main.rs b/boards/raspberry_pi_pico/src/main.rs index f6fc9e3e0e..4ce5d688b6 100644 --- a/boards/raspberry_pi_pico/src/main.rs +++ b/boards/raspberry_pi_pico/src/main.rs @@ -26,7 +26,6 @@ use kernel::hil::led::LedHigh; use kernel::hil::usb::Client; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::round_robin::RoundRobinSched; use kernel::syscall::SyscallDriver; use kernel::{capabilities, create_capability, static_init}; @@ -76,6 +75,8 @@ type TemperatureRp2040Sensor = components::temperature_rp2040::TemperatureRp2040 >; type TemperatureDriver = components::temperature::TemperatureComponentType; +type SchedulerObj = components::sched::round_robin::RoundRobinComponentType; + /// Supported drivers by the platform pub struct RaspberryPiPico { ipc: kernel::ipc::IPC<{ NUM_PROCS as u8 }>, @@ -92,7 +93,7 @@ pub struct RaspberryPiPico { date_time: &'static capsules_extra::date_time::DateTimeCapsule<'static, rp2040::rtc::Rtc<'static>>, - scheduler: &'static RoundRobinSched<'static>, + scheduler: &'static SchedulerObj, systick: cortexm0p::systick::SysTick, } @@ -120,7 +121,7 @@ impl KernelResources>> for Ras type SyscallDriverLookup = Self; type SyscallFilter = (); type ProcessFault = (); - type Scheduler = RoundRobinSched<'static>; + type Scheduler = SchedulerObj; type SchedulerTimer = cortexm0p::systick::SysTick; type WatchDog = (); type ContextSwitchCallback = (); diff --git a/boards/raspberry_pi_pico_2/src/main.rs b/boards/raspberry_pi_pico_2/src/main.rs index 88e67cdf9f..e68ff929bc 100644 --- a/boards/raspberry_pi_pico_2/src/main.rs +++ b/boards/raspberry_pi_pico_2/src/main.rs @@ -22,7 +22,6 @@ use kernel::component::Component; use kernel::hil::led::LedHigh; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::round_robin::RoundRobinSched; use kernel::syscall::SyscallDriver; use kernel::{capabilities, create_capability, static_init, Kernel}; @@ -73,11 +72,13 @@ static mut CHIP: Option<&'static Rp2350>> = No static mut PROCESS_PRINTER: Option<&'static capsules_system::process_printer::ProcessPrinterText> = None; +type SchedulerObj = components::sched::round_robin::RoundRobinComponentType; + /// Supported drivers by the platform pub struct RaspberryPiPico2 { ipc: kernel::ipc::IPC<{ NUM_PROCS as u8 }>, console: &'static capsules_core::console::Console<'static>, - scheduler: &'static RoundRobinSched<'static>, + scheduler: &'static SchedulerObj, systick: cortexm33::systick::SysTick, alarm: &'static capsules_core::alarm::AlarmDriver< 'static, @@ -107,7 +108,7 @@ impl KernelResources>> for Ras type SyscallDriverLookup = Self; type SyscallFilter = (); type ProcessFault = (); - type Scheduler = RoundRobinSched<'static>; + type Scheduler = SchedulerObj; type SchedulerTimer = cortexm33::systick::SysTick; type WatchDog = (); type ContextSwitchCallback = (); diff --git a/boards/redboard_redv/src/main.rs b/boards/redboard_redv/src/main.rs index e4e3fa0cf9..133da2ce61 100644 --- a/boards/redboard_redv/src/main.rs +++ b/boards/redboard_redv/src/main.rs @@ -23,7 +23,6 @@ use kernel::hil::led::LedLow; use kernel::platform::scheduler_timer::VirtualSchedulerTimer; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::cooperative::CooperativeSched; use kernel::utilities::registers::interfaces::ReadWriteable; use kernel::{create_capability, debug, static_init}; use rv32i::csr; @@ -49,6 +48,8 @@ const FAULT_RESPONSE: capsules_system::process_policies::PanicFaultPolicy = kernel::stack_size! {0x900} +type SchedulerObj = components::sched::cooperative::CooperativeComponentType; + /// A structure representing this platform that holds references to all /// capsules for this platform. We've included an alarm and console. struct RedV { @@ -66,7 +67,7 @@ struct RedV { 'static, VirtualMuxAlarm<'static, e310_g002::chip::E310xClint<'static>>, >, - scheduler: &'static CooperativeSched<'static>, + scheduler: &'static SchedulerObj, scheduler_timer: &'static VirtualSchedulerTimer< VirtualMuxAlarm<'static, e310_g002::chip::E310xClint<'static>>, >, @@ -94,7 +95,7 @@ impl KernelResources; + type Scheduler = SchedulerObj; type SchedulerTimer = VirtualSchedulerTimer>>; type WatchDog = (); diff --git a/boards/sma_q3/src/main.rs b/boards/sma_q3/src/main.rs index 1476077a8e..d0bc527f65 100644 --- a/boards/sma_q3/src/main.rs +++ b/boards/sma_q3/src/main.rs @@ -28,7 +28,6 @@ use kernel::hil::symmetric_encryption::AES128; use kernel::hil::time::Counter; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::round_robin::RoundRobinSched; #[allow(unused_imports)] use kernel::{capabilities, create_capability, debug, debug_gpio, debug_verbose, static_init}; use nrf52840::gpio::Pin; @@ -89,6 +88,8 @@ type Ieee802154Driver = components::ieee802154::Ieee802154ComponentType< nrf52840::aes::AesECB<'static>, >; +type SchedulerObj = components::sched::round_robin::RoundRobinComponentType; + /// Supported drivers by the platform pub struct Platform { temperature: &'static TemperatureDriver, @@ -126,7 +127,7 @@ pub struct Platform { >, >, screen: &'static capsules_extra::screen::screen::Screen<'static>, - scheduler: &'static RoundRobinSched<'static>, + scheduler: &'static SchedulerObj, systick: cortexm4::systick::SysTick, } @@ -159,7 +160,7 @@ impl KernelResources; + type Scheduler = SchedulerObj; type SchedulerTimer = cortexm4::systick::SysTick; type WatchDog = (); type ContextSwitchCallback = (); diff --git a/boards/stm32f3discovery/src/main.rs b/boards/stm32f3discovery/src/main.rs index db1f3ebffd..3cc67bfea9 100644 --- a/boards/stm32f3discovery/src/main.rs +++ b/boards/stm32f3discovery/src/main.rs @@ -24,7 +24,6 @@ use kernel::hil::led::LedHigh; use kernel::hil::time::Counter; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::round_robin::RoundRobinSched; use kernel::{create_capability, debug, static_init}; use stm32f303xc::chip::Stm32f3xxDefaultPeripherals; use stm32f303xc::wdt; @@ -63,6 +62,8 @@ type L3GD20Sensor = components::l3gd20::L3gd20ComponentType< >; type TemperatureDriver = components::temperature::TemperatureComponentType; +type SchedulerObj = components::sched::round_robin::RoundRobinComponentType; + /// A structure representing this platform that holds references to all /// capsules for this platform. struct STM32F3Discovery { @@ -93,7 +94,7 @@ struct STM32F3Discovery { nonvolatile_storage: &'static capsules_extra::nonvolatile_storage_driver::NonvolatileStorage<'static>, - scheduler: &'static RoundRobinSched<'static>, + scheduler: &'static SchedulerObj, systick: cortexm4::systick::SysTick, watchdog: &'static wdt::WindoWdg<'static>, } @@ -135,7 +136,7 @@ impl type SyscallDriverLookup = Self; type SyscallFilter = (); type ProcessFault = (); - type Scheduler = RoundRobinSched<'static>; + type Scheduler = SchedulerObj; type SchedulerTimer = cortexm4::systick::SysTick; type WatchDog = wdt::WindoWdg<'static>; type ContextSwitchCallback = (); diff --git a/boards/stm32f412gdiscovery/src/main.rs b/boards/stm32f412gdiscovery/src/main.rs index 3126850a42..049d0c7ae2 100644 --- a/boards/stm32f412gdiscovery/src/main.rs +++ b/boards/stm32f412gdiscovery/src/main.rs @@ -22,7 +22,6 @@ use kernel::hil::led::LedLow; use kernel::hil::screen::ScreenRotation; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::round_robin::RoundRobinSched; use kernel::{create_capability, debug, static_init}; use stm32f412g::chip_specs::Stm32f412Specs; use stm32f412g::clocks::hsi::HSI_FREQUENCY_MHZ; @@ -56,6 +55,8 @@ type TemperatureDriver = components::temperature::TemperatureComponentType>; type ScreenDriver = components::screen::ScreenComponentType; +type SchedulerObj = components::sched::round_robin::RoundRobinComponentType; + /// A structure representing this platform that holds references to all /// capsules for this platform. struct STM32F412GDiscovery { @@ -78,7 +79,7 @@ struct STM32F412GDiscovery { temperature: &'static TemperatureDriver, rng: &'static RngDriver, - scheduler: &'static RoundRobinSched<'static>, + scheduler: &'static SchedulerObj, systick: cortexm4::systick::SysTick, } @@ -116,7 +117,7 @@ impl type SyscallDriverLookup = Self; type SyscallFilter = (); type ProcessFault = (); - type Scheduler = RoundRobinSched<'static>; + type Scheduler = SchedulerObj; type SchedulerTimer = cortexm4::systick::SysTick; type WatchDog = (); type ContextSwitchCallback = (); diff --git a/boards/stm32f429idiscovery/src/main.rs b/boards/stm32f429idiscovery/src/main.rs index 4a2ca971fa..2cf7c6c2ec 100644 --- a/boards/stm32f429idiscovery/src/main.rs +++ b/boards/stm32f429idiscovery/src/main.rs @@ -19,7 +19,6 @@ use kernel::component::Component; use kernel::hil::led::LedHigh; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::round_robin::RoundRobinSched; use kernel::{create_capability, debug, static_init}; use stm32f429zi::chip_specs::Stm32f429Specs; @@ -52,6 +51,8 @@ type TemperatureSTMSensor = components::temperature_stm::TemperatureSTMComponent >; type TemperatureDriver = components::temperature::TemperatureComponentType; +type SchedulerObj = components::sched::round_robin::RoundRobinComponentType; + /// A structure representing this platform that holds references to all /// capsules for this platform. struct STM32F429IDiscovery { @@ -71,7 +72,7 @@ struct STM32F429IDiscovery { temperature: &'static TemperatureDriver, gpio: &'static capsules_core::gpio::GPIO<'static, stm32f429zi::gpio::Pin<'static>>, - scheduler: &'static RoundRobinSched<'static>, + scheduler: &'static SchedulerObj, systick: cortexm4::systick::SysTick, } @@ -106,7 +107,7 @@ impl type SyscallDriverLookup = Self; type SyscallFilter = (); type ProcessFault = (); - type Scheduler = RoundRobinSched<'static>; + type Scheduler = SchedulerObj; type SchedulerTimer = cortexm4::systick::SysTick; type WatchDog = (); type ContextSwitchCallback = (); diff --git a/boards/teensy40/src/main.rs b/boards/teensy40/src/main.rs index 9d6d06f6d1..696ec09f44 100644 --- a/boards/teensy40/src/main.rs +++ b/boards/teensy40/src/main.rs @@ -25,7 +25,6 @@ use kernel::hil::{gpio::Configure, led::LedHigh}; use kernel::platform::chip::ClockInterface; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::round_robin::RoundRobinSched; use kernel::{create_capability, static_init}; /// Number of concurrent processes this platform supports @@ -37,6 +36,8 @@ static mut PROCESSES: Option<&'static ProcessArray> = None; const FAULT_RESPONSE: capsules_system::process_policies::PanicFaultPolicy = capsules_system::process_policies::PanicFaultPolicy {}; +type SchedulerObj = components::sched::round_robin::RoundRobinComponentType; + /// Teensy 4 platform struct Teensy40 { led: &'static capsules_core::led::LedDriver< @@ -54,7 +55,7 @@ struct Teensy40 { >, >, - scheduler: &'static RoundRobinSched<'static>, + scheduler: &'static SchedulerObj, systick: cortexm7::systick::SysTick, } @@ -79,7 +80,7 @@ impl KernelResources; + type Scheduler = SchedulerObj; type SchedulerTimer = cortexm7::systick::SysTick; type WatchDog = (); type ContextSwitchCallback = (); diff --git a/boards/veer_el2_sim/src/main.rs b/boards/veer_el2_sim/src/main.rs index cd53c78c22..bea4466c66 100644 --- a/boards/veer_el2_sim/src/main.rs +++ b/boards/veer_el2_sim/src/main.rs @@ -15,7 +15,6 @@ use kernel::hil; use kernel::platform::scheduler_timer::VirtualSchedulerTimer; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::cooperative::CooperativeSched; use kernel::utilities::registers::interfaces::ReadWriteable; use kernel::{create_capability, debug, static_init}; use rv32i::csr; @@ -45,6 +44,8 @@ const FAULT_RESPONSE: capsules_system::process_policies::PanicFaultPolicy = kernel::stack_size! {0x900} +type SchedulerObj = components::sched::cooperative::CooperativeComponentType; + /// A structure representing this platform that holds references to all /// capsules for this platform. struct VeeR { @@ -53,7 +54,7 @@ struct VeeR { 'static, VirtualMuxAlarm<'static, Clint<'static>>, >, - scheduler: &'static CooperativeSched<'static>, + scheduler: &'static SchedulerObj, scheduler_timer: &'static VirtualSchedulerTimer>>, } @@ -75,7 +76,7 @@ impl KernelResources for VeeR { type SyscallDriverLookup = Self; type SyscallFilter = (); type ProcessFault = (); - type Scheduler = CooperativeSched<'static>; + type Scheduler = SchedulerObj; type SchedulerTimer = VirtualSchedulerTimer>>; type WatchDog = (); type ContextSwitchCallback = (); diff --git a/boards/weact_f401ccu6/src/main.rs b/boards/weact_f401ccu6/src/main.rs index dddad7dec3..6a02599b22 100644 --- a/boards/weact_f401ccu6/src/main.rs +++ b/boards/weact_f401ccu6/src/main.rs @@ -19,7 +19,6 @@ use kernel::component::Component; use kernel::hil::led::LedLow; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::round_robin::RoundRobinSched; use kernel::{create_capability, debug, static_init}; use stm32f401cc::chip_specs::Stm32f401Specs; @@ -46,6 +45,8 @@ const FAULT_RESPONSE: capsules_system::process_policies::PanicFaultPolicy = kernel::stack_size! {0x2000} +type SchedulerObj = components::sched::round_robin::RoundRobinComponentType; + /// A structure representing this platform that holds references to all /// capsules for this platform. struct WeactF401CC { @@ -63,7 +64,7 @@ struct WeactF401CC { VirtualMuxAlarm<'static, stm32f401cc::tim2::Tim2<'static>>, >, gpio: &'static capsules_core::gpio::GPIO<'static, stm32f401cc::gpio::Pin<'static>>, - scheduler: &'static RoundRobinSched<'static>, + scheduler: &'static SchedulerObj, systick: cortexm4::systick::SysTick, } @@ -92,7 +93,7 @@ impl KernelResources; + type Scheduler = SchedulerObj; type SchedulerTimer = cortexm4::systick::SysTick; type WatchDog = (); type ContextSwitchCallback = (); diff --git a/boards/wm1110dev/src/main.rs b/boards/wm1110dev/src/main.rs index c796ce0c4c..49ac5ae007 100644 --- a/boards/wm1110dev/src/main.rs +++ b/boards/wm1110dev/src/main.rs @@ -20,7 +20,6 @@ use kernel::hil::spi::SpiMaster; use kernel::hil::time::Counter; use kernel::platform::{KernelResources, SyscallDriverLookup}; use kernel::process::ProcessArray; -use kernel::scheduler::round_robin::RoundRobinSched; #[allow(unused_imports)] use kernel::{create_capability, debug, debug_gpio, debug_verbose, static_init}; @@ -94,6 +93,8 @@ type RngDriver = components::rng::RngComponentType type NonvolatileDriver = components::nonvolatile_storage::NonvolatileStorageComponentType; +type SchedulerObj = components::sched::round_robin::RoundRobinComponentType; + /// Supported drivers by the platform pub struct Platform { console: &'static capsules_core::console::Console<'static>, @@ -123,7 +124,7 @@ pub struct Platform { nrf52840::spi::SPIM<'static>, >, >, - scheduler: &'static RoundRobinSched<'static>, + scheduler: &'static SchedulerObj, systick: cortexm4::systick::SysTick, } @@ -157,7 +158,7 @@ impl KernelResources; + type Scheduler = SchedulerObj; type SchedulerTimer = cortexm4::systick::SysTick; type WatchDog = (); type ContextSwitchCallback = ();