UCOS-Ⅲ查看任务堆栈空间:OSTaskStkChk()函数

UCOS-Ⅲ查看任务堆栈空间:OSTaskStkChk()函数


前言

硬件的RAM资源有限,UCOSⅢ提供了一个系统函数OSTaskStkChk()用来检测创建任务的堆栈空间大小,用户可以根据检测结果,通过重新编译代码,给每一个任务分配更加合理的栈空间数值。

一、准备工作

硬件:STM32F407探索版
系统:UCOSⅢ
软件:串口助手

二、使用步骤

1.创建堆栈检测任务

检测任务的优先级最好设置为在本系统中最低的那一个。

代码如下:

//任务优先级
#define STORAGESTACK_PRIO		10
//任务堆栈大小	
#define STORAGESTACK_STK_SIZE 		128
//任务控制块
OS_TCB STORAGESTACK_TCB;
//任务堆栈	
CPU_STK STORAGESTACK_STK[STORAGESTACK_STK_SIZE];
//任务函数
void storagestack_task(void *p_arg);
//创建STORAGESTACK任务
	OSTaskCreate((OS_TCB 	* )&STORAGESTACK_TCB,		
				 (CPU_CHAR	* )"storagestack task", 		
                 (OS_TASK_PTR )storagestack_task, 			
                 (void		* )0,					
                 (OS_PRIO	  )STORAGESTACK_PRIO,     	
                 (CPU_STK   * )&STORAGESTACK_STK[0],	
                 (CPU_STK_SIZE)STORAGESTACK_STK_SIZE/10,	
                 (CPU_STK_SIZE)STORAGESTACK_STK_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);	

2.在头文件os_cfg.h开启宏OS_CFG_STAT_TASK_STK_CHK_EN

代码如下:

#define OS_CFG_STAT_TASK_STK_CHK_EN     1u   /* Check task stacks from statistic task                                 */

3.在堆栈检测任务使用OSTaskStkChk()函数

3.1.了解OSTaskStkChk()的参数

void  OSTaskStkChk (OS_TCB        *p_tcb,	//待检测任务的TCB块
                    CPU_STK_SIZE  *p_free,	//待检测任务的空闲堆栈字节数
                    CPU_STK_SIZE  *p_used,  //待检测任务的使用堆栈字节数
                    OS_ERR        *p_err)	//返回的错误码

3.2 使用OSTaskStkChk()函数

void storagestack_task(void *p_arg)
{
	OS_ERR err;
	CPU_STK_SIZE myfree,myused;
	p_arg = p_arg;
	
	while(1)
	{
		OSTaskStkChk (&Task1_TaskTCB,&myfree,&myused,&err);
		printf("Task1_Task has free:%d, Usage:%%%d\r\n",myfree,(myused*100)/(myfree+myused));	//计算任务1的空闲字节数和堆栈使用率
		
		OSTaskStkChk (&Task2_TaskTCB,&myfree,&myused,&err);
		printf("Task2_Task has free:%d, Usage:%%%d\r\n",myfree,(myused*100)/(myfree+myused));	//计算任务2的空闲字节数和堆栈使用率
		
		OSTaskStkChk (&STORAGESTACK_TCB,&myfree,&myused,&err);
		printf("STORAGESTACK_TCB has free:%d, Usage:%%%d\r\n",myfree,(myused*100)/(myfree+myused));	//计算本任务的空闲字节数和堆栈使用率
		
		printf("--------------------------------------------\r\n\r\n");
		
		OSTimeDlyHMSM(0,0,3,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时3s
	}		
}

三、结果

三个任务的堆栈空间笔者都设置为128字节,任务处理的内容不同堆栈使用率也不同
三个任务的堆栈空间笔者都设置为128字节,任务处理的内容不同堆栈使用率也不同

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值