aboutsummaryrefslogtreecommitdiff
path: root/apps/systemcmds
diff options
context:
space:
mode:
authorpx4dev <px4@purgatory.org>2012-10-14 23:35:32 -0700
committerpx4dev <px4@purgatory.org>2012-10-14 23:35:32 -0700
commitc1958bdaa916560ea45cb6756fe6da25fe79f091 (patch)
tree2a4de015e1e9efd4a8616248b893646b438498be /apps/systemcmds
parentdb0ec8eb0293b96b8698a649fb26951739f77915 (diff)
downloadpx4-firmware-c1958bdaa916560ea45cb6756fe6da25fe79f091.tar.gz
px4-firmware-c1958bdaa916560ea45cb6756fe6da25fe79f091.tar.bz2
px4-firmware-c1958bdaa916560ea45cb6756fe6da25fe79f091.zip
Teach top how to precisely determine stack usage.
Diffstat (limited to 'apps/systemcmds')
-rw-r--r--apps/systemcmds/top/top.c25
1 files changed, 22 insertions, 3 deletions
diff --git a/apps/systemcmds/top/top.c b/apps/systemcmds/top/top.c
index e6248dd43..f4e260211 100644
--- a/apps/systemcmds/top/top.c
+++ b/apps/systemcmds/top/top.c
@@ -135,9 +135,9 @@ int top_main(int argc, char *argv[])
memset(header_spaces, ' ', CONFIG_TASK_NAME_SIZE);
header_spaces[CONFIG_TASK_NAME_SIZE] = '\0';
#if CONFIG_RR_INTERVAL > 0
- printf("\033[KPID\tCOMMAND%s CPU TOTAL \t%%CPU CURR \tMIN STACK USE\tCURR (BASE) PRIO\tRR SLICE\n", header_spaces);
+ printf("\033[KPID\tCOMMAND%s CPU TOTAL \t%%CPU CURR \tSTACK USE\tCURR (BASE) PRIO\tRR SLICE\n", header_spaces);
#else
- printf("\033[KPID\tCOMMAND%s CPU TOTAL \t%%CPU CURR \tMIN STACK USE\tCURR (BASE) PRIO\n", header_spaces);
+ printf("\033[KPID\tCOMMAND%s CPU TOTAL \t%%CPU CURR \tSTACK USE\tCURR (BASE) PRIO\n", header_spaces);
#endif
} else {
@@ -190,7 +190,26 @@ int top_main(int argc, char *argv[])
runtime_spaces = "";
}
- printf("\033[K % 2d\t%s%s % 8lld ms%s \t % 2d.%03d \t % 6d B", (int)system_load.tasks[i].tcb->pid, system_load.tasks[i].tcb->name, spaces, (system_load.tasks[i].total_runtime / 1000), runtime_spaces, (int)(curr_loads[i] * 100), (int)(curr_loads[i] * 100000.0f - (int)(curr_loads[i] * 1000.0f) * 100), (uint32_t)system_load.tasks[i].tcb->adj_stack_ptr - (uint32_t)system_load.tasks[i].tcb->xcp.regs[REG_R13]);
+ unsigned stack_size = (uintptr_t)system_load.tasks[i].tcb->adj_stack_ptr -
+ (uintptr_t)system_load.tasks[i].tcb->stack_alloc_ptr;
+ unsigned stack_free = 0;
+ uint8_t *stack_sweeper = (uint8_t *)system_load.tasks[i].tcb->stack_alloc_ptr;
+ while (stack_free < stack_size) {
+ if (*stack_sweeper++ != 0xff)
+ break;
+ stack_free++;
+ }
+
+ printf("\033[K % 2d\t%s%s % 8lld ms%s \t % 2d.%03d \t % 4u / % 4u",
+ (int)system_load.tasks[i].tcb->pid,
+ system_load.tasks[i].tcb->name,
+ spaces,
+ (system_load.tasks[i].total_runtime / 1000),
+ runtime_spaces,
+ (int)(curr_loads[i] * 100),
+ (int)(curr_loads[i] * 100000.0f - (int)(curr_loads[i] * 1000.0f) * 100),
+ stack_size - stack_free,
+ stack_size);
/* Print scheduling info with RR time slice */
#if CONFIG_RR_INTERVAL > 0
printf("\t%d\t(%d)\t\t%d\n", (int)system_load.tasks[i].tcb->sched_priority, (int)system_load.tasks[i].tcb->base_priority, (int)system_load.tasks[i].tcb->timeslice);