第一步、使能任务统计功能
修改文件 os_cfg.h中的 OS_CFG_STAT_TASK_STK_CHK_EN宏。
/* -------------------------- TASK MANAGEMENT -------------------------- */
#define OS_CFG_STAT_TASK_EN DEF_ENABLED /* Enable (DEF_ENABLED) the statistics task */
#define OS_CFG_STAT_TASK_STK_CHK_EN DEF_ENABLED /* Check task stacks (DEF_ENABLED) from the statistic task */
第二步、创建任务时开启任务统计功能
创建任务函数如下:
void OSTaskCreate (OS_TCB *p_tcb,
CPU_CHAR const*p_name,
OS_TASK_PTR p_task,
void *p_arg,
OS_PRIO prio,
CPU_STK *p_stk_base,
CPU_STK_SIZE stk_limit,
CPU_STK_SIZE stk_size,
OS_MSG_QTY q_size,
OS_TICK time_quanta,
void *p_ext,
OS_OPT opt,
OS_ERR *p_err)
倒数第二个形参opt,参数可选择如下:
* opt contains additional information (or options) about the behavior of the task.
* See OS_OPT_TASK_xxx in OS.H. Current choices are:
*
* OS_OPT_TASK_NONE No option selected
* OS_OPT_TASK_STK_CHK Stack checking to be allowed for the task
* OS_OPT_TASK_STK_CLR Clear the stack when the task is created
* OS_OPT_TASK_SAVE_FP If the CPU has floating-point registers, save them
* during a context switch.
* OS_OPT_TASK_NO_TLS If the caller doesn't want or need TLS (Thread Local
* Storage) support for the task. If you do not include this
* option, TLS will be supported by default.
则在创建任务时加入 OS_OPT_TASK_STK_CHK标志,则任务在创建时会开启统计功能。
第三步、获取任务统计信息
函数如下:
/*
************************************************************************************************************************
* STACK CHECKING
*
* Description: This function is called to calculate the amount of free memory left on the specified task's stack.
*
* Arguments : p_tcb is a pointer to the TCB of the task to check. If you specify a NULL pointer then
* you are specifying that you want to check the stack of the current task.
*
* p_free is a pointer to a variable that will receive the number of free 'entries' on the task's stack.
*
* p_used is a pointer to a variable that will receive the number of used 'entries' on the task's stack.
*
* p_err is a pointer to a variable that will contain an error code.
*
* OS_ERR_NONE Upon success
* OS_ERR_PTR_INVALID If either 'p_free' or 'p_used' are NULL pointers
* OS_ERR_TASK_NOT_EXIST If the stack pointer of the task is a NULL pointer
* OS_ERR_TASK_OPT If you did NOT specified OS_OPT_TASK_STK_CHK when the task
* was created
* OS_ERR_TASK_STK_CHK_ISR You called this function from an ISR
*
* Returns : none
*
* Note(s) : none
************************************************************************************************************************
*/
void OSTaskStkChk (OS_TCB *p_tcb,
CPU_STK_SIZE *p_free,
CPU_STK_SIZE *p_used,
OS_ERR *p_err);
- p_tcb:所需信息的任务控制块
- p_free:指针变量,保存当前任务控制块的剩余任务栈
- p_used:指针变量,保存当前任务控制块的使用任务栈
p_free和p_used的和就是创建任务时设置的任务栈总大小。