panics better

This commit is contained in:
Ulrich Mohr 2023-11-15 12:36:23 +01:00
parent 7414756241
commit e538dd132e
2 changed files with 37 additions and 12 deletions

View File

@ -2,7 +2,7 @@
#include "semphr.h" #include "semphr.h"
#include "task.h" #include "task.h"
#define NUMBER_OF_TASKS 300 #define NUMBER_OF_TASKS 1
SemaphoreHandle_t taskMutex = NULL; SemaphoreHandle_t taskMutex = NULL;
StaticSemaphore_t taskMutexDescriptor; StaticSemaphore_t taskMutexDescriptor;
size_t nextFreeTaskDescriptor = 0; size_t nextFreeTaskDescriptor = 0;
@ -13,6 +13,14 @@ void initFreeRTOSHelper() {
taskMutex = xSemaphoreCreateRecursiveMutexStatic(&taskMutexDescriptor); taskMutex = xSemaphoreCreateRecursiveMutexStatic(&taskMutexDescriptor);
} }
const char * getTaskName() {
return pcTaskGetName( NULL );
}
void stopIt() {
taskENTER_CRITICAL();
}
// TODO return some error code? // TODO return some error code?
void *createTask(TaskFunction_t taskFunction, void *parameter, void *buffer, void *createTask(TaskFunction_t taskFunction, void *parameter, void *buffer,
size_t buffersize) { size_t buffersize) {

View File

@ -24,6 +24,19 @@ use core::panic::PanicInfo;
#[panic_handler] #[panic_handler]
fn panic(panic: &PanicInfo<'_>) -> ! { fn panic(panic: &PanicInfo<'_>) -> ! {
unsafe {
stopIt();
}
sif!("In Task \"");
unsafe {
let task_name = getTaskName();
let mut offset = 0;
while *task_name.offset(offset) != 0 {
sif!("{}", *task_name.offset(offset) as char);
offset = offset + 1;
}
}
sifln!("\":");
sifln!("{}", panic); sifln!("{}", panic);
//TODO: stop RTOS, exit if hosted //TODO: stop RTOS, exit if hosted
loop {} loop {}
@ -41,6 +54,9 @@ extern "C" {
buffersize: cty::size_t, buffersize: cty::size_t,
) -> *const cty::c_void; ) -> *const cty::c_void;
fn getTaskName() -> *const cty::c_char;
fn stopIt();
fn vTaskDelete(handle: *const cty::c_void); fn vTaskDelete(handle: *const cty::c_void);
fn task_delay(milliseconds: cty::uint32_t); fn task_delay(milliseconds: cty::uint32_t);
@ -104,18 +120,23 @@ impl<'a, const STACKSIZE: usize> PeriodicTask<'a, STACKSIZE> {
unsafe { unsafe {
instance.task = createTask(task_entry, runner_pointer, stack_pointer, STACKSIZE); instance.task = createTask(task_entry, runner_pointer, stack_pointer, STACKSIZE);
} }
if instance.task == 0 as *mut cty::c_void {
panic!("could not create Task");
}
instance instance
} }
} }
impl<'a, const STACKSIZE: usize> Drop for PeriodicTask<'a, STACKSIZE> { impl<'a, const STACKSIZE: usize> Drop for PeriodicTask<'a, STACKSIZE> {
fn drop(&mut self) { fn drop(&mut self) {
unsafe {vTaskDelete(self.task);} unsafe {
vTaskDelete(self.task);
}
} }
} }
struct Handler { struct Handler {
id: u32 id: u32,
} }
impl ExecutableObjectIF for Handler { impl ExecutableObjectIF for Handler {
@ -143,22 +164,18 @@ fn panics(a: &mut [i32]) {
a[4] = 3; a[4] = 3;
} }
fn mission() { fn mission() {
sifln!("Mission enter"); sifln!("Mission enter");
let mut h1 = Handler {id: 1}; let mut h1 = Handler { id: 1 };
let mut h2 = Handler {id: 2}; let mut h2 = Handler { id: 2 };
let _t1: PeriodicTask<'_, 512> = PeriodicTask::new(&mut h1); let _t1: PeriodicTask<'_, 512> = PeriodicTask::new(&mut h1);
let _t2: PeriodicTask<'_, 512> = PeriodicTask::new(&mut h2); let _t2: PeriodicTask<'_, 512> = PeriodicTask::new(&mut h2);
sifln!("Mission done delay"); sifln!("Mission done delay");
unsafe {task_delay(3000);} unsafe {
task_delay(3000);
}
} }