diff --git a/sys/Jamfile b/sys/Jamfile index 5a618de0f5..3966421631 100644 --- a/sys/Jamfile +++ b/sys/Jamfile @@ -30,6 +30,7 @@ SubDir TOP sys ; Module swtimer : swtimer.c : hwtimer ; Module posix_io : posix_io.c ; Module shell : shell.c : hashtable hash_string ; +Module ps : ps ; Module auto_init : auto_init.c ; diff --git a/sys/include/ps.h b/sys/include/ps.h new file mode 100644 index 0000000000..876edab77f --- /dev/null +++ b/sys/include/ps.h @@ -0,0 +1,7 @@ +#ifndef __PS_H +#define __PS_H + +void thread_print_all(); +void _ps_handler(char*); + +#endif /* __PS_H */ diff --git a/sys/ps.c b/sys/ps.c new file mode 100644 index 0000000000..a54c8bc35b --- /dev/null +++ b/sys/ps.c @@ -0,0 +1,56 @@ +#include +#include +#include +#include + +/* list of states copied from tcb.h */ +const char *state_names[] = { + "running", + "pending", + "stopped", + "sleeping", + "bl mutex", + "bl rx", + "bl send", + "bl reply" +}; + +/** + * @brief Prints a list of running threads including stack usage to stdout. + */ +void thread_print_all(void) +{ + extern unsigned long hwtimer_now(void); + const char queued_name[] = {'_', 'Q'}; + int i; + int overall_stacksz = 0; + + printf("\tpid | %-21s| %-9sQ | pri | stack ( used) location | runtime | switches \n", "name", "state"); + for( i = 0; i < MAXTHREADS; i++ ) { + tcb* p = (tcb*)fk_threads[i]; + + if( p != NULL ) { + int state = p->status; // copy state + int statebit = number_of_highest_bit(state >> 1); // get state index + const char* sname = state_names[statebit]; // get state name + const char* queued = queued_name + (state & BIT0); // get queued flag + int stacksz = p->stack_size; // get max used stack + double runtime = 0/0.0; + int switches = -1; +#if SCHEDSTATISTICS + runtime = pidlist[i].runtime / (double) hwtimer_now() * 100; + switches = pidlist[i].schedules; +#endif + overall_stacksz += stacksz; + stacksz -= fk_measure_stack_free(p->stack_start); + printf("\t%3u | %-21s| %-8s %.1s | %3i | %5i (%5i) %p | %6.3f%% | %8i\n", + p->pid, p->name, sname, queued, p->priority, p->stack_size, stacksz, p->stack_start, runtime, switches); + } + } + printf("\t%5s %-21s|%13s%6s %5i\n", "|", "SUM", "|", "|", overall_stacksz); +} + +void _ps_handler(char* unnused) { + thread_print_all(); +} +