ucosii 任务的堆栈使用情况检查函数OSTaskStkChk()的应用方法
2017-02-03 09:43
711 查看
本文重点介绍如果使用函数OSTaskStkChk()来检查我们Ucos 系统下各任务堆栈的使用情况。
关于OSTaskStkChk()函数的详细功能介绍和内部实现讲解可以百度一下,网上很多,不是本文重点,这里不多做介绍。
开头只简单介绍一下OSTaskStkChk()这个函数参数和返回值:
INT8U OSTaskStkChk(INT8U prio, OS_STK_DATA *p_stk_data)
参数prio : 被检测任务的优先级,也就是唯一标识被检任务的ID。
参数*p_stk_data:指向OS_STK_DATA 结构体的一个变量指针。
OS_STK_DATA 结构体如下:
typedef struct os_stk_data {
INT32U OSFree; /* Number of free entries on the stack */
INT32U OSUsed; /* Number of entries used on the stack */
} OS_STK_DATA;
返回值:0,表示函数返回成功,即:OS_ERR_NONE
异常返回值如下:
OS_ERR_PRIO_INVALID ; 被检测任务的优先级优先级设置错误,可能比最高优先级都高了。要小于最高优先级并大于最低优先级,同时不要和自己检测任务的优先级相同(if the priority you specify is higher that the maximum allowed (i.e. > OS_LOWEST_PRIO) or, you have not specified OS_PRIO_SELF.)
OS_ERR_TASK_NOT_EXIST ; 你要检测的任务没有被建立或者被分配到一个互斥PIP(if the desired task has not been created or is assigned to a Mutex PIP)
OS_ERR_TASK_OPT ; 被检任务在建立的时候OSTaskCreateExt函数最后一个参数没有设置为OS_TASK_OPT_STK_CHK (if you did NOT specified OS_TASK_OPT_STK_CHK when the task was created)
OS_ERR_PDATA_NULL ; 指针'p_stk_data可能为空了(if 'p_stk_data' is a NULL pointer)
详细步骤:
1 创建调用一个静态函数CheckStackTask。
这个数的作用有两方面:
一方面,它调用OSTaskStkChk()函数用于检测Ucos系统中任务堆栈使用情况。
另一方面,在检测任务堆栈时这个函数它本身做为一个任务线程,在系统中运行。(下一步将说到它被任务创建函数OSTaskCreateExt()调用。)
示例:
static void CheckStackTask(void* pArg)
{
u8 err1 =0,err2=0,err3=0,err4=0,err5=0;
while(1)
{
err1=OSTaskStkChk(TASK_PRI_1,&OSTKDataSize1);
OSTimeDly(100);
err2=OSTaskStkChk(TASK_PRI_2,&OSTKDataSize2);
OSTimeDly(100);
err3=OSTaskStkChk(TASK_PRI_3,&OSTKDataSize3);
OSTimeDly(100);
{
printf("Task1 FreeStack:%d ,UsedStack:%d ,err:%d\n",OSTKDataSize1.OSFree,OSTKDataSize1.OSUsed,err1);
printf("Task2 FreeStack:%d ,UsedStack:%d ,err:%d\n",OSTKDataSize2.OSFree,OSTKDataSize2.OSUsed,err2);
printf("Task3 FreeStack:%d ,UsedStack:%d ,err:%d\n",OSTKDataSize3.OSFree,OSTKDataSize3.OSUsed,err3);
printf("*******\n\n");
}
}
}
2 要用创建任务函数OSTaskCreateExt()创建一个任务,用于调用上一步的CheckStackTask()函数。
示例:
#define TASK_STK_SIZE_CHKTASK 64 //(定义任务堆栈,任务堆栈64就够大了)
#define TASK_PRI_CHKTASK 51 //(定义任务优先级,检测任务的优先级,要小于其他被检任务)
OSTaskCreateExt(CheckStackTask, NULL, \
&gaTaskCheckTask[TASK_STK_SIZE_CHKTASK-1], TASK_PRI_CHKTASK, TASK_PRI_CHKTASK, \
gaTaskCheckTask, TASK_STK_SIZE_CHKTASK, NULL, OS_TASK_OPT_STK_CLR);
3.检查被检测任务在创建时的最后一项参数,是不是添加了OS_TASK_OPT_STK_CHK项。
示例:
OSTaskCreateExt(TaskTmp1, NULL, \
&gaTaskStkTmp[TASK_STK_SIZE-1], TASK_PRI_1, TASK_PRI_1, \
gaTaskStkTmp, TASK_STK_SIZE_1, NULL, OS_TASK_OPT_STK_CLR|OS_TASK_OPT_STK_CHK);
4.检查宏OS_TASK_STAT_STK_CHK_EN是否为1,如果不是修改为1。
示例:
#define OS_TASK_STAT_STK_CHK_EN 1u /* Check task stacks from statistic task
以上这几步按步骤做了。用串口通过接收printf()打印的值,可以轻松看到当前堆栈的利用情况。
堆栈是随着任务运行过程而变化的,最好使任务多运行一会再观察堆栈的用量大小,这样比较准确。
关于OSTaskStkChk()函数的详细功能介绍和内部实现讲解可以百度一下,网上很多,不是本文重点,这里不多做介绍。
开头只简单介绍一下OSTaskStkChk()这个函数参数和返回值:
INT8U OSTaskStkChk(INT8U prio, OS_STK_DATA *p_stk_data)
参数prio : 被检测任务的优先级,也就是唯一标识被检任务的ID。
参数*p_stk_data:指向OS_STK_DATA 结构体的一个变量指针。
OS_STK_DATA 结构体如下:
typedef struct os_stk_data {
INT32U OSFree; /* Number of free entries on the stack */
INT32U OSUsed; /* Number of entries used on the stack */
} OS_STK_DATA;
返回值:0,表示函数返回成功,即:OS_ERR_NONE
异常返回值如下:
OS_ERR_PRIO_INVALID ; 被检测任务的优先级优先级设置错误,可能比最高优先级都高了。要小于最高优先级并大于最低优先级,同时不要和自己检测任务的优先级相同(if the priority you specify is higher that the maximum allowed (i.e. > OS_LOWEST_PRIO) or, you have not specified OS_PRIO_SELF.)
OS_ERR_TASK_NOT_EXIST ; 你要检测的任务没有被建立或者被分配到一个互斥PIP(if the desired task has not been created or is assigned to a Mutex PIP)
OS_ERR_TASK_OPT ; 被检任务在建立的时候OSTaskCreateExt函数最后一个参数没有设置为OS_TASK_OPT_STK_CHK (if you did NOT specified OS_TASK_OPT_STK_CHK when the task was created)
OS_ERR_PDATA_NULL ; 指针'p_stk_data可能为空了(if 'p_stk_data' is a NULL pointer)
详细步骤:
1 创建调用一个静态函数CheckStackTask。
这个数的作用有两方面:
一方面,它调用OSTaskStkChk()函数用于检测Ucos系统中任务堆栈使用情况。
另一方面,在检测任务堆栈时这个函数它本身做为一个任务线程,在系统中运行。(下一步将说到它被任务创建函数OSTaskCreateExt()调用。)
示例:
static void CheckStackTask(void* pArg)
{
u8 err1 =0,err2=0,err3=0,err4=0,err5=0;
while(1)
{
err1=OSTaskStkChk(TASK_PRI_1,&OSTKDataSize1);
OSTimeDly(100);
err2=OSTaskStkChk(TASK_PRI_2,&OSTKDataSize2);
OSTimeDly(100);
err3=OSTaskStkChk(TASK_PRI_3,&OSTKDataSize3);
OSTimeDly(100);
{
printf("Task1 FreeStack:%d ,UsedStack:%d ,err:%d\n",OSTKDataSize1.OSFree,OSTKDataSize1.OSUsed,err1);
printf("Task2 FreeStack:%d ,UsedStack:%d ,err:%d\n",OSTKDataSize2.OSFree,OSTKDataSize2.OSUsed,err2);
printf("Task3 FreeStack:%d ,UsedStack:%d ,err:%d\n",OSTKDataSize3.OSFree,OSTKDataSize3.OSUsed,err3);
printf("*******\n\n");
}
}
}
2 要用创建任务函数OSTaskCreateExt()创建一个任务,用于调用上一步的CheckStackTask()函数。
示例:
#define TASK_STK_SIZE_CHKTASK 64 //(定义任务堆栈,任务堆栈64就够大了)
#define TASK_PRI_CHKTASK 51 //(定义任务优先级,检测任务的优先级,要小于其他被检任务)
OSTaskCreateExt(CheckStackTask, NULL, \
&gaTaskCheckTask[TASK_STK_SIZE_CHKTASK-1], TASK_PRI_CHKTASK, TASK_PRI_CHKTASK, \
gaTaskCheckTask, TASK_STK_SIZE_CHKTASK, NULL, OS_TASK_OPT_STK_CLR);
3.检查被检测任务在创建时的最后一项参数,是不是添加了OS_TASK_OPT_STK_CHK项。
示例:
OSTaskCreateExt(TaskTmp1, NULL, \
&gaTaskStkTmp[TASK_STK_SIZE-1], TASK_PRI_1, TASK_PRI_1, \
gaTaskStkTmp, TASK_STK_SIZE_1, NULL, OS_TASK_OPT_STK_CLR|OS_TASK_OPT_STK_CHK);
4.检查宏OS_TASK_STAT_STK_CHK_EN是否为1,如果不是修改为1。
示例:
#define OS_TASK_STAT_STK_CHK_EN 1u /* Check task stacks from statistic task
以上这几步按步骤做了。用串口通过接收printf()打印的值,可以轻松看到当前堆栈的利用情况。
堆栈是随着任务运行过程而变化的,最好使任务多运行一会再观察堆栈的用量大小,这样比较准确。
相关文章推荐
- 【安防百科】HDSDI、960H、HDCVI、HDTVI、AHD方案对比
- [vagrant]vagrant centos静态ip设置
- 项目中获取服务器端时间在前台显示
- 453. Minimum Moves to Equal Array Elements [LeetCode]
- PHP之字符串截取函数
- Eclipse启动自动加载指定工作空间
- android 事件传递
- Windows 窗体的高级功能
- 怎么制作一个有序的思维导图
- 网管的自我修养-信息系统
- WeakHashMap的Weak原理
- 关于日立存储更换故障硬盘
- div子级float后高度不能自适应问题的解决
- android获得手机上应用的图标、应用名、包名
- 2017你该买房,还是卖房?
- asp.net页面间传值方式
- 八数码难题
- 晒一下图标(自娱自乐)
- 六角填数全排列
- Wrestling Match HDU5971