金牌会员
- 积分
- 1987
- 金钱
- 1987
- 注册时间
- 2014-7-1
- 在线时间
- 188 小时
|
楼主 |
发表于 2015-11-9 20:04:18
|
显示全部楼层
测试了下,2种方法都得到堆栈free和used的值,我把步骤写下。
1、建立一个任务。
/***************LED0任务************************/
//任务优先级
#define LED0_TASK_PRIO 4
//任务堆栈大小
#define LED0_TASK_SIZE 100//实际大小要乘 4
//任务控制块
OS_TCB Led0TaskTCB;//task control block
//任务堆栈
CPU_STK LED0_TASK_STK[LED0_TASK_SIZE];//task stack
//任务函数
void led0_task(void *p_arg);
//////////////////////////////////////////////////////////////////////////////////////
OS_CRITICAL_ENTER(); //进入临界区
OSTaskCreate((OS_TCB*)&Led0TaskTCB,//任务控制块地址
(CPU_CHAR*)"led0 task",//起一个任务名字
(OS_TASK_PTR)led0_task,//任务函数地址
(void *)0,//传递给任务函数的指针
(OS_PRIO )LED0_TASK_PRIO,//优先级
(CPU_STK *)&LED0_TASK_STK[0],//任务堆栈基地址
(CPU_STK_SIZE)LED0_TASK_SIZE/10,//任务堆栈深度
(CPU_STK_SIZE)LED0_TASK_SIZE,//任务堆栈大小
(OS_MSG_QTY)0,//消息队列大小
(OS_TICK)0,//时间片轮转
(void*)0,//用户补充的存储区
(OS_OPT)OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,//任务选项
(OS_ERR*)&err);//存储错误返回值
OS_CRITICAL_EXIT(); //退出临界区
////////////////////////////////////////////////////////////////////////
2、编写测试函数
void led0_task(void* p_arg)
{
u8 i=0;
OS_ERR err;
CPU_STK_SIZE free,used;
p_arg=p_arg;
while(1)
{
//used=Led0TaskTCB.StkUsed;
//free=Led0TaskTCB.StkFree;
OSTaskStkChk (&Led0TaskTCB,&free,&used,&err);
LCD_ShowxNum(53,164,used,1,16,0);
LCD_ShowxNum(36,164,used/10,1,16,0);
LCD_ShowxNum(20,164,used/100,1,16,0);
LCD_ShowxNum(53,104,free,1,16,0);
LCD_ShowxNum(36,104,free/10,1,16,0);
LCD_ShowxNum(20,104,free/100,1,16,0);
OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err);
}
}
3、结果
都有结果输出,不过有些差别。
而且使用
used=Led0TaskTCB.StkUsed;
free=Led0TaskTCB.StkFree;
得按下按键,才会有结果。
|
|