diff --git a/include/kernel.h b/include/kernel.h index 12c62c17bb7..dd5fa1e4c89 100644 --- a/include/kernel.h +++ b/include/kernel.h @@ -102,6 +102,34 @@ enum execution_context_types { K_PREEMPT_THREAD, }; +/** + * @defgroup profiling_apis Profiling APIs + * @ingroup kernel_apis + * @{ + */ + +/** + * @brief Analyze the main, idle, interrupt and system workqueue call stacks + * + * This routine calls @ref stack_analyze on the 4 call stacks declared and + * maintained by the kernel. The sizes of those 4 call stacks are defined by: + * + * CONFIG_MAIN_STACK_SIZE + * CONFIG_IDLE_STACK_SIZE + * CONFIG_ISR_STACK_SIZE + * CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE + * + * @note CONFIG_INIT_STACKS and CONFIG_PRINTK must be set for this function to + * produce output. + * + * @return N/A + */ +extern void k_call_stacks_analyze(void); + +/** + * @} end defgroup profiling_apis + */ + /** * @defgroup thread_apis Thread APIs * @ingroup kernel_apis diff --git a/kernel/init.c b/kernel/init.c index 6f78ab34ab9..617f0acd064 100644 --- a/kernel/init.c +++ b/kernel/init.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -118,6 +119,28 @@ char __noinit __stack _interrupt_stack[CONFIG_ISR_STACK_SIZE]; extern void idle(void *unused1, void *unused2, void *unused3); +void k_call_stacks_analyze(void) +{ +#if defined(CONFIG_INIT_STACKS) && defined(CONFIG_PRINTK) + extern char sys_work_q_stack[CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE]; +#if defined(CONFIG_ARC) + extern char _firq_stack[CONFIG_FIRQ_STACK_SIZE]; +#endif /* CONFIG_ARC */ + + printk("Kernel stacks:\n"); + stack_analyze("main ", _main_stack, sizeof(_main_stack)); + stack_analyze("idle ", _idle_stack, sizeof(_idle_stack)); +#if defined(CONFIG_ARC) + stack_analyze("firq ", _firq_stack, sizeof(_firq_stack)); +#endif /* CONFIG_ARC */ + stack_analyze("interrupt", _interrupt_stack, + sizeof(_interrupt_stack)); + stack_analyze("workqueue", sys_work_q_stack, + sizeof(sys_work_q_stack)); + +#endif /* CONFIG_INIT_STACKS && CONFIG_PRINTK */ +} + /** * * @brief Clear BSS diff --git a/kernel/system_work_q.c b/kernel/system_work_q.c index 6236c61861f..8e1151d4dc4 100644 --- a/kernel/system_work_q.c +++ b/kernel/system_work_q.c @@ -24,7 +24,7 @@ #include #include -static char __stack sys_work_q_stack[CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE]; +char __noinit __stack sys_work_q_stack[CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE]; struct k_work_q k_sys_work_q;