forked from ROMEO/obsw
panics better
This commit is contained in:
parent
7414756241
commit
e538dd132e
@ -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) {
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user