multi object periodic task

This commit is contained in:
Ulrich Mohr 2023-11-22 10:42:55 +01:00
parent e69e97eb4c
commit cc7844d21d

View File

@ -76,20 +76,16 @@ extern "C" {
extern "C" fn rust_main() { extern "C" fn rust_main() {
sifln!("Rust startup 🚀"); sifln!("Rust startup 🚀");
mission(); mission();
sifln!("Mission done"); sifln!("Mission done");
} }
#[no_mangle] #[no_mangle]
extern "C" fn task_entry(task_object: *mut cty::c_void) { extern "C" fn task_entry(task_object: *mut cty::c_void) {
sifln!("Task Entry");
sifln!("running pointer {:p}", task_object);
let task: &mut dyn TaskIF; let task: &mut dyn TaskIF;
unsafe { unsafe {
let pointer = task_object as *mut PeriodicTask; let pointer = task_object as *mut PeriodicTask;
task = &mut *pointer; task = &mut *pointer;
} }
sifln!("running cast {:p}", task);
task.run(); task.run();
} }
@ -108,26 +104,33 @@ struct PeriodicTask<'a> {
stack_size: cty::size_t, //TODO generic type and safety stack_size: cty::size_t, //TODO generic type and safety
task_handle: *const cty::c_void, task_handle: *const cty::c_void,
period: usize, period: usize,
task_object: &'a mut dyn ExecutableObjectIF, task_objects: &'a mut [&'a mut dyn ExecutableObjectIF],
} }
impl<'a> PeriodicTask<'a> { // TODO Passing the slice does not work, find out why...
fn new(object: &'a mut dyn ExecutableObjectIF, stack_size: usize, period: usize) -> Self { // impl<'a> PeriodicTask<'a> {
let instance = Self { // fn new(
stack_size: stack_size, // objects: &'a mut [&'a mut dyn ExecutableObjectIF],
task_handle: 0 as *const cty::c_void, // stack_size: usize,
period: period, // period: usize,
task_object: object, // ) -> Self {
}; // let instance = Self {
instance // stack_size: stack_size,
} // task_handle: 0 as *const cty::c_void,
} // period: period,
// task_objects: objects,
// };
// instance
// }
// }
impl<'a> TaskIF for PeriodicTask<'a> { impl<'a> TaskIF for PeriodicTask<'a> {
fn run(&mut self) { fn run(&mut self) {
sifln!("Task running {}", self.period);
loop { loop {
self.task_object.perform(); for object in self.task_objects.iter_mut() {
object.perform();
}
//TODO make this exact
unsafe { unsafe {
task_delay(self.period as cty::uint32_t); //TODO type of delay should be generic but safe (cap to max in C) task_delay(self.period as cty::uint32_t); //TODO type of delay should be generic but safe (cap to max in C)
} }
@ -157,7 +160,6 @@ impl<'a> TaskExecutor<'a> {
// this way, the reference is guaranteed to be valid over our // this way, the reference is guaranteed to be valid over our
// lifetime while the task is deleted at the end of our lifetime // lifetime while the task is deleted at the end of our lifetime
let task_pointer: *const cty::c_void = *task as *mut _ as *const cty::c_void; //TODO this does work without the "*" in front of the task -> Why?? let task_pointer: *const cty::c_void = *task as *mut _ as *const cty::c_void; //TODO this does work without the "*" in front of the task -> Why??
sifln!("create task {:p}", task_pointer);
let handle; let handle;
unsafe { unsafe {
handle = create_task(task_entry, task_pointer, task.get_stack_size()); handle = create_task(task_entry, task_pointer, task.get_stack_size());
@ -347,15 +349,19 @@ fn mission() {
// h2.other_handler = h1.command_queue.get_sender(); // h2.other_handler = h1.command_queue.get_sender();
let mut t1: PeriodicTask = PeriodicTask::new(&mut h1, 512, 200); let mut t1: PeriodicTask = PeriodicTask {
task_objects: &mut [&mut h1],
stack_size: 512,
period: 200,
task_handle: 0 as *const cty::c_void,
};
let mut t2: PeriodicTask = PeriodicTask::new(&mut h2, 512, 300); let mut t2: PeriodicTask = PeriodicTask {
task_objects: &mut [&mut h2],
sifln!("t1 {:p}", &t1); stack_size: 512,
period: 400,
let r1: &mut dyn TaskIF = &mut t1; task_handle: 0 as *const cty::c_void,
};
sifln!("as dyn {:p}", r1);
let mut task_executor = TaskExecutor { let mut task_executor = TaskExecutor {
tasks: &mut [&mut t1, &mut t2], tasks: &mut [&mut t1, &mut t2],
@ -371,8 +377,6 @@ fn mission() {
} }
sifln!("executor dropped"); sifln!("executor dropped");
drop(task_executor); drop(task_executor);
//t2.period = 100; //Invalid
h1.id = 2;
unsafe { unsafe {
task_delay(2000); task_delay(2000);
} }