mirror of
https://github.com/esp-rs/esp-hal.git
synced 2025-09-27 12:20:56 +00:00
Add task priority to the preempt driver (#4064)
This commit is contained in:
parent
b9dd86258a
commit
445f6fc1ad
@ -321,10 +321,16 @@ impl esp_radio_preempt_driver::Scheduler for Scheduler {
|
||||
timer::yield_task()
|
||||
}
|
||||
|
||||
fn max_task_priority(&self) -> u32 {
|
||||
255
|
||||
}
|
||||
|
||||
fn task_create(
|
||||
&self,
|
||||
task: extern "C" fn(*mut c_void),
|
||||
param: *mut c_void,
|
||||
_priority: u32,
|
||||
_pin_to_core: Option<u32>,
|
||||
task_stack_size: usize,
|
||||
) -> *mut c_void {
|
||||
let task = Box::new_in(Context::new(task, param, task_stack_size), InternalMemory);
|
||||
|
@ -284,7 +284,7 @@ register_timer_implementation!(Timer);
|
||||
/// Initializes the `timer` task for the Wi-Fi driver.
|
||||
pub(crate) fn create_timer_task() {
|
||||
// schedule the timer task
|
||||
SCHEDULER.task_create(timer_task, core::ptr::null_mut(), 8192);
|
||||
SCHEDULER.task_create(timer_task, core::ptr::null_mut(), 1, None, 8192);
|
||||
}
|
||||
|
||||
/// Entry point for the timer task responsible for handling scheduled timer
|
||||
|
@ -46,9 +46,12 @@ unsafe extern "Rust" {
|
||||
fn esp_preempt_disable();
|
||||
fn esp_preempt_yield_task();
|
||||
fn esp_preempt_current_task() -> *mut c_void;
|
||||
fn esp_preempt_max_task_priority() -> u32;
|
||||
fn esp_preempt_task_create(
|
||||
task: extern "C" fn(*mut c_void),
|
||||
param: *mut c_void,
|
||||
priority: u32,
|
||||
pin_to_core: Option<u32>,
|
||||
task_stack_size: usize,
|
||||
) -> *mut c_void;
|
||||
fn esp_preempt_schedule_task_deletion(task_handle: *mut c_void);
|
||||
@ -96,14 +99,29 @@ macro_rules! scheduler_impl {
|
||||
<$t as $crate::Scheduler>::current_task(&$name)
|
||||
}
|
||||
|
||||
#[unsafe(no_mangle)]
|
||||
#[inline]
|
||||
fn esp_preempt_max_task_priority() -> u32 {
|
||||
<$t as $crate::Scheduler>::max_task_priority(&$name)
|
||||
}
|
||||
|
||||
#[unsafe(no_mangle)]
|
||||
#[inline]
|
||||
fn esp_preempt_task_create(
|
||||
task: extern "C" fn(*mut c_void),
|
||||
param: *mut c_void,
|
||||
priority: u32,
|
||||
core_id: Option<u32>,
|
||||
task_stack_size: usize,
|
||||
) -> *mut c_void {
|
||||
<$t as $crate::Scheduler>::task_create(&$name, task, param, task_stack_size)
|
||||
<$t as $crate::Scheduler>::task_create(
|
||||
&$name,
|
||||
task,
|
||||
param,
|
||||
priority,
|
||||
core_id,
|
||||
task_stack_size,
|
||||
)
|
||||
}
|
||||
|
||||
#[unsafe(no_mangle)]
|
||||
@ -153,12 +171,18 @@ pub trait Scheduler: Send + Sync + 'static {
|
||||
/// This function is called by `esp_radio::init` to retrieve a pointer to the current task.
|
||||
fn current_task(&self) -> *mut c_void;
|
||||
|
||||
/// This function returns the maximum task priority level.
|
||||
/// Higher number is considered to be higher priority.
|
||||
fn max_task_priority(&self) -> u32;
|
||||
|
||||
/// This function is used to create threads.
|
||||
/// It should allocate the stack.
|
||||
fn task_create(
|
||||
&self,
|
||||
task: extern "C" fn(*mut c_void),
|
||||
param: *mut c_void,
|
||||
priority: u32,
|
||||
core_id: Option<u32>,
|
||||
task_stack_size: usize,
|
||||
) -> *mut c_void;
|
||||
|
||||
@ -218,6 +242,14 @@ pub fn current_task() -> *mut c_void {
|
||||
unsafe { esp_preempt_current_task() }
|
||||
}
|
||||
|
||||
/// Returns the maximum priority a task can have.
|
||||
///
|
||||
/// This function assumes that a bigger number means higher priority.
|
||||
#[inline]
|
||||
pub fn max_task_priority() -> u32 {
|
||||
unsafe { esp_preempt_max_task_priority() }
|
||||
}
|
||||
|
||||
/// Creates a new task with the given initial parameter and stack size.
|
||||
///
|
||||
/// ## Safety
|
||||
@ -228,9 +260,11 @@ pub fn current_task() -> *mut c_void {
|
||||
pub unsafe fn task_create(
|
||||
task: extern "C" fn(*mut c_void),
|
||||
param: *mut c_void,
|
||||
priority: u32,
|
||||
pin_to_core: Option<u32>,
|
||||
task_stack_size: usize,
|
||||
) -> *mut c_void {
|
||||
unsafe { esp_preempt_task_create(task, param, task_stack_size) }
|
||||
unsafe { esp_preempt_task_create(task, param, priority, pin_to_core, task_stack_size) }
|
||||
}
|
||||
|
||||
/// Schedules the given task for deletion.
|
||||
|
@ -166,7 +166,13 @@ unsafe extern "C" fn task_create(
|
||||
extern "C" fn(*mut esp_wifi_sys::c_types::c_void),
|
||||
>(func);
|
||||
|
||||
let task = crate::preempt::task_create(task_func, param, stack_depth as usize);
|
||||
let task = crate::preempt::task_create(
|
||||
task_func,
|
||||
param,
|
||||
prio,
|
||||
if core_id < 2 { Some(core_id) } else { None },
|
||||
stack_depth as usize,
|
||||
);
|
||||
*(handle as *mut usize) = task as usize;
|
||||
}
|
||||
|
||||
|
@ -395,7 +395,13 @@ unsafe extern "C" fn task_create(
|
||||
unsafe {
|
||||
let task_func = transmute::<*mut c_void, extern "C" fn(*mut c_void)>(task_func);
|
||||
|
||||
let task = crate::preempt::task_create(task_func, param, stack_depth as usize);
|
||||
let task = crate::preempt::task_create(
|
||||
task_func,
|
||||
param,
|
||||
prio,
|
||||
if core_id < 2 { Some(core_id) } else { None },
|
||||
stack_depth as usize,
|
||||
);
|
||||
*(task_handle as *mut usize) = task as usize;
|
||||
}
|
||||
|
||||
|
@ -456,7 +456,13 @@ pub unsafe extern "C" fn task_create_pinned_to_core(
|
||||
extern "C" fn(*mut esp_wifi_sys::c_types::c_void),
|
||||
>(task_func);
|
||||
|
||||
let task = crate::preempt::task_create(task_func, param, stack_depth as usize);
|
||||
let task = crate::preempt::task_create(
|
||||
task_func,
|
||||
param,
|
||||
prio,
|
||||
if core_id < 2 { Some(core_id) } else { None },
|
||||
stack_depth as usize,
|
||||
);
|
||||
*(task_handle as *mut usize) = task as usize;
|
||||
|
||||
1
|
||||
@ -583,7 +589,7 @@ pub unsafe extern "C" fn task_get_current_task() -> *mut c_void {
|
||||
/// *************************************************************************
|
||||
pub unsafe extern "C" fn task_get_max_priority() -> i32 {
|
||||
trace!("task_get_max_priority");
|
||||
255
|
||||
crate::preempt::max_task_priority() as i32
|
||||
}
|
||||
|
||||
/// **************************************************************************
|
||||
|
Loading…
x
Reference in New Issue
Block a user