tasks usage is a bit more sane now; added sif macro

This commit is contained in:
2023-11-15 12:02:44 +01:00
parent 4782011fb8
commit 7414756241
3 changed files with 70 additions and 29 deletions

View File

@ -2,22 +2,39 @@
#include "semphr.h" #include "semphr.h"
#include "task.h" #include "task.h"
#define NUMBER_OF_TASKS 300
SemaphoreHandle_t taskMutex = NULL;
StaticSemaphore_t taskMutexDescriptor;
size_t nextFreeTaskDescriptor = 0;
StaticTask_t taskDescriptors[NUMBER_OF_TASKS];
StaticTask_t uhOhdeleteThisBuffer; // TODO check and return
void initFreeRTOSHelper() {
void * createTask(TaskFunction_t taskFunction, void * parameter, void *buffer, size_t buffersize){ taskMutex = xSemaphoreCreateRecursiveMutexStatic(&taskMutexDescriptor);
return xTaskCreateStatic(
taskFunction, /* The function that implements the task. */
"rust", /* The text name assigned to the task - for debug only as it is
not used by the kernel. */
buffersize / sizeof(StackType_t), /* The size of the stack to allocate to the task. */
parameter, /* The parameter passed to the task - not used in this
simple case. */
4, /* The priority assigned to the task. */
buffer, &uhOhdeleteThisBuffer);
} }
// TODO return some error code?
void *createTask(TaskFunction_t taskFunction, void *parameter, void *buffer,
size_t buffersize) {
if (xSemaphoreTakeRecursive(taskMutex, portMAX_DELAY) != pdTRUE) {
return NULL;
}
// we hold the task mutex and are now allowed to access the taskDescriptors
if (nextFreeTaskDescriptor >=
sizeof(taskDescriptors) / sizeof(*taskDescriptors)) {
return NULL;
}
TaskHandle_t newTask = xTaskCreateStatic(
taskFunction, "rust", buffersize / sizeof(StackType_t), parameter, 4,
buffer, taskDescriptors + nextFreeTaskDescriptor);
nextFreeTaskDescriptor++;
xSemaphoreGiveRecursive(taskMutex);
return newTask;
}
void task_delay(uint32_t milliseconds) { void task_delay(uint32_t milliseconds) {
vTaskDelay(pdMS_TO_TICKS(milliseconds)); vTaskDelay(pdMS_TO_TICKS(milliseconds));
} }

View File

@ -124,11 +124,15 @@ extern SemaphoreHandle_t malloc_mutex;
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/
void mission(void *); void mission(void *);
void initFreeRTOSHelper();
int main(void) { int main(void) {
/* Configure the hardware ready to run the demo. */ /* Configure the hardware ready to run the demo. */
prvSetupHardware(); prvSetupHardware();
initFreeRTOSHelper();
// printf("Booting Software\n"); // printf("Booting Software\n");
int taskParameters = 0; int taskParameters = 0;

View File

@ -1,11 +1,30 @@
#![no_std] #![no_std]
#[macro_export]
macro_rules! sifln {
($(,)?) => (
let mut stdout = Outbytes {};
writeln!(stdout);
);
($($arg:tt)*) => (
let mut stdout = Outbytes {};
let _alwaysok = writeln!(stdout, $($arg)*);
);
}
#[macro_export]
macro_rules! sif {
($($arg:tt)*) => (
let mut stdout = Outbytes {};
let _alwaysok = write!(stdout, $($arg)*);
);
}
use core::panic::PanicInfo; use core::panic::PanicInfo;
#[panic_handler] #[panic_handler]
fn panic(panic: &PanicInfo<'_>) -> ! { fn panic(panic: &PanicInfo<'_>) -> ! {
let mut stdout = Outbytes {}; sifln!("{}", panic);
let _ok = writeln!(&mut stdout, "{}", panic);
//TODO: stop RTOS, exit if hosted //TODO: stop RTOS, exit if hosted
loop {} loop {}
} }
@ -15,8 +34,6 @@ type TaskFunction = unsafe extern "C" fn(*mut cty::c_void);
extern "C" { extern "C" {
fn outbyte(c: cty::c_char); fn outbyte(c: cty::c_char);
//void * createTask(void (* taskFunction)( void * ), void * parameter, void *buffer, size_t buffersize){
fn createTask( fn createTask(
taskFunction: TaskFunction, taskFunction: TaskFunction,
parameter: *mut cty::c_void, parameter: *mut cty::c_void,
@ -31,12 +48,10 @@ extern "C" {
#[no_mangle] #[no_mangle]
extern "C" fn rust_main() { extern "C" fn rust_main() {
let mut stdout = Outbytes {}; sifln!("Rust startup");
let _ok = writeln!(&mut stdout, "Rust startup");
mission(); mission();
let _ok = writeln!(&mut stdout, "Mission done"); sifln!("Mission done");
} }
#[no_mangle] #[no_mangle]
@ -50,7 +65,7 @@ extern "C" fn task_entry(task_object: *mut cty::c_void) {
} }
trait ExecutableObjectIF { trait ExecutableObjectIF {
fn perform(&self); fn perform(&mut self);
} }
struct PeriodicTaskRunner<'a> { struct PeriodicTaskRunner<'a> {
@ -104,9 +119,8 @@ struct Handler {
} }
impl ExecutableObjectIF for Handler { impl ExecutableObjectIF for Handler {
fn perform(&self) { fn perform(&mut self) {
let mut stdout = Outbytes {}; sifln!("Handler {} performs", self.id);
let _ok = writeln!(&mut stdout, "Handler {} performs", self.id);
} }
} }
@ -129,16 +143,22 @@ fn panics(a: &mut [i32]) {
a[4] = 3; a[4] = 3;
} }
fn mission() {
let mut stdout = Outbytes {};
let _ok = writeln!(&mut stdout, "Mission enter");
fn mission() {
sifln!("Mission enter");
let mut h1 = Handler {id: 1}; let mut h1 = Handler {id: 1};
let mut h2 = Handler {id: 2};
let _t1: PeriodicTask<'_, 512> = PeriodicTask::new(&mut h1); let _t1: PeriodicTask<'_, 512> = PeriodicTask::new(&mut h1);
let _ok = writeln!(&mut stdout, "Mission done delay"); let _t2: PeriodicTask<'_, 512> = PeriodicTask::new(&mut h2);
sifln!("Mission done delay");
unsafe {task_delay(3000);} unsafe {task_delay(3000);}
} }