tracing: first implementation of rtos-trace glue
This commit is contained in:
177
src/tracing.rs
Normal file
177
src/tracing.rs
Normal file
@@ -0,0 +1,177 @@
|
|||||||
|
#![allow(static_mut_refs)]
|
||||||
|
|
||||||
|
use log::*;
|
||||||
|
|
||||||
|
use crate::logging::RenderbugLogger;
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct TracedTask {
|
||||||
|
id: u32,
|
||||||
|
name: &'static str,
|
||||||
|
priority: u32,
|
||||||
|
running: bool,
|
||||||
|
ready: bool
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TracedTask {
|
||||||
|
fn new(id: u32) -> Self {
|
||||||
|
Self {
|
||||||
|
id,
|
||||||
|
name: "<unnamed task>",
|
||||||
|
priority: 0,
|
||||||
|
running: false,
|
||||||
|
ready: false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct Tracer {}
|
||||||
|
|
||||||
|
struct TracerState {
|
||||||
|
tasks: [core::mem::MaybeUninit<TracedTask>; 16],
|
||||||
|
num_tasks: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
static mut TRACER_STATE: TracerState = TracerState::new();
|
||||||
|
|
||||||
|
impl TracerState {
|
||||||
|
const fn new() -> Self {
|
||||||
|
Self {
|
||||||
|
tasks: [const { core::mem::MaybeUninit::uninit() }; 16],
|
||||||
|
num_tasks: 0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_task(&mut self, id: u32) -> &mut TracedTask {
|
||||||
|
for i in 0..self.num_tasks {
|
||||||
|
let info = unsafe { &mut *self.tasks[i].as_mut_ptr() };
|
||||||
|
if info.id == id {
|
||||||
|
return info;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Otherwise, we register a new task
|
||||||
|
if self.num_tasks < self.tasks.len() {
|
||||||
|
self.tasks[self.num_tasks].write(TracedTask::new(id));
|
||||||
|
self.num_tasks += 1;
|
||||||
|
} else {
|
||||||
|
panic!("too many tasks registered");
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe { &mut *self.tasks[self.num_tasks - 1].as_mut_ptr() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl rtos_trace::RtosTrace for Tracer {
|
||||||
|
fn start() {
|
||||||
|
warn!("rtos start");
|
||||||
|
}
|
||||||
|
|
||||||
|
fn stop() {
|
||||||
|
warn!("rtos stop");
|
||||||
|
}
|
||||||
|
|
||||||
|
fn task_new(id: u32) {
|
||||||
|
let task = unsafe { TRACER_STATE.get_task(id) };
|
||||||
|
warn!("rtos new task {task:?}");
|
||||||
|
}
|
||||||
|
|
||||||
|
fn task_send_info(id: u32, info: rtos_trace::TaskInfo) {
|
||||||
|
let task = unsafe { TRACER_STATE.get_task(id) };
|
||||||
|
task.name = info.name;
|
||||||
|
task.priority = info.priority;
|
||||||
|
warn!("rtos task info for task {task:?}");
|
||||||
|
}
|
||||||
|
|
||||||
|
fn task_new_stackless(id: u32, name: &'static str, priority: u32) {
|
||||||
|
let task = unsafe { TRACER_STATE.get_task(id) };
|
||||||
|
task.name = name;
|
||||||
|
task.priority = priority;
|
||||||
|
warn!("rtos new task {task:?} {name}");
|
||||||
|
}
|
||||||
|
|
||||||
|
fn task_terminate(id: u32) {
|
||||||
|
let task = unsafe { TRACER_STATE.get_task(id) };
|
||||||
|
warn!("rtos terminate {task:?}")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn task_exec_begin(id: u32) {
|
||||||
|
let task = unsafe { TRACER_STATE.get_task(id) };
|
||||||
|
task.running = true;
|
||||||
|
warn!("rtos exec {task:?}")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn task_exec_end() {
|
||||||
|
warn!("rtos exec end");
|
||||||
|
}
|
||||||
|
|
||||||
|
fn task_ready_begin(id: u32) {
|
||||||
|
let task = unsafe { TRACER_STATE.get_task(id) };
|
||||||
|
task.ready = true;
|
||||||
|
warn!("rtos ready {task:?}")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn task_ready_end(id: u32) {
|
||||||
|
let task = unsafe { TRACER_STATE.get_task(id) };
|
||||||
|
task.ready = false;
|
||||||
|
warn!("rtos suspend {task:?}")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn system_idle() {
|
||||||
|
warn!("rtos system idle");
|
||||||
|
}
|
||||||
|
|
||||||
|
fn isr_enter() {
|
||||||
|
warn!("rtos isr enter");
|
||||||
|
}
|
||||||
|
|
||||||
|
fn isr_exit() {
|
||||||
|
warn!("rtos isr exit");
|
||||||
|
}
|
||||||
|
|
||||||
|
fn isr_exit_to_scheduler() {
|
||||||
|
warn!("rtos isr exit to scheduler");
|
||||||
|
}
|
||||||
|
|
||||||
|
fn name_marker(id: u32, name: &'static str) {
|
||||||
|
warn!("rtos name marker {id}: {name}");
|
||||||
|
}
|
||||||
|
|
||||||
|
fn marker(id: u32) {
|
||||||
|
warn!("rtos marker {}", Self::name_for_marker(id));
|
||||||
|
}
|
||||||
|
|
||||||
|
fn marker_begin(id: u32) {
|
||||||
|
match id {
|
||||||
|
//1..2 => trace!("rtos marker begin {}", Self::name_for_marker(id)),
|
||||||
|
_ => {
|
||||||
|
warn!("rtos marker begin {}", Self::name_for_marker(id));
|
||||||
|
RenderbugLogger::set_level(LevelFilter::Trace);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
fn marker_end(id: u32) {
|
||||||
|
match id {
|
||||||
|
//1..2 => trace!("rtos marker end {}", Self::name_for_marker(id)),
|
||||||
|
_ => {
|
||||||
|
warn!("rtos marker end {}", Self::name_for_marker(id));
|
||||||
|
RenderbugLogger::reset_level();
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Tracer {
|
||||||
|
const fn name_for_marker(id: u32) -> &'static str {
|
||||||
|
match id {
|
||||||
|
0 => "run scheduler",
|
||||||
|
1 => "yield task",
|
||||||
|
2 => "timer tick",
|
||||||
|
3 => "process timer queue",
|
||||||
|
4 => "process embassy timer queue",
|
||||||
|
_ => "unknown",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user