详解μC/OS-II如何检测任务堆栈实际使用情况——即如何设置ucosii任务堆栈大小

不少屌丝同学都有类似经历吧,在使用ucosii创建任务时,关于任务堆栈大小设为多大合适搞的不清不楚,郁闷之下就随便整个数,比如就1024吧,呵呵,反正也没见得出问题,那就不多想了。

我想大多数同学都是这样做的吧。这样只是因为在一般情况下,1024确实已经足够大了,堆栈溢出的可能性很小而已。那么,如果你任务实际使用率只有很小的百分之几,一旦被你知道了,你会痛心不?我想你不痛心,μC/OS-II也会痛心的,它会觉得这个coder真是浪费啊,哈哈!顺便提醒下大家,堆和栈是完全不同的两个概念,出于国内习惯,还是称之为堆栈罢了!

下面,我就来告诉大家怎么知道运行中任务的堆栈实际使用情况,然后就知道应该分配多少堆栈大小合适了!开始正题。

1、首先需要知道,μC/OS-II中创建任务的函数有两个: OSTaskCreate()和OSTaskCreateExt()

(1)OSTaskCreate() //创建普通任务

由于重点在下面的创建扩展任务函数,故本函数就不多说了!确实,要想实现检测目标任务栈实际使用情况的功能,是不能使用这个函数来创建目标任务的,必须使用OSTaskCreateExt() 。

(2)OSTaskCreateExt() //创建扩展任务

函数接口原型为:

#if OS_TASK_CREATE_EXT_EN > 0

INT8U OSTaskCreateExt

(

void (*task)(void *pd), //建立扩展任务(任务代码指针

void *pdata, //传递参数指针

OS_STK *ptos, //分配任务堆栈栈顶指针

INT8U prio, //分配任务优先级

INT16U id, //(未来的)优先级标识(与优先级相同)

OS_STK *pbos, //分配任务堆栈栈底指针

INT32U stk_size, //指定堆栈的容量(检验用)

void *pext, //指向用户附加的数据域的指针

INT16U opt //建立任务设定选项

)

#endif

2、其次需要知道μC/OS-II中有这么个函数:OSTaskStkChk()

不错,检测任务堆栈实际使用情况正是用的这个函数,下面来本函数的接口原型:

INT8U OSTaskStkChk

(

INT8U prio,  //待测任务的优先级

OS_STK_DATA *pdata //指向一个类型为OS_STK_DATA的结构体

)

3、再次需要知道一个结构体:

#if OS_TASK_CREATE_EXT_EN > 0

typedef struct

{

INT32U OSFree; //堆栈中未使用的字节数

INT32U OSUsed; //堆栈中已使用的字节数

} OS_STK_DATA;

#endif

参数: prio 为指定要获取堆栈信息的任务优先级,也可以指定参数OS_PRIO_SELF,获取调用任务本身的

信息。

pdata 指向一个类型为OS_STK_DATA的数据结构,其中包含如下信息:

INT32U OSFree; // 堆栈中未使用的字节数

INT32U OSUsed; // 堆栈中已使用的字节数

4、有了上述三个知识点后就可以啦,具体方法为:

(1)将函数的最后一个参数opt 设置为:OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR

(2)定义一个变量:OS_STK_DATA  StackBytes;

(3)调用函数OSTaskStkChk(TestTaskPRIO, &StackBytes)

(4)StackBytes.OSFree的值即为被测任务堆栈未使用的字节数,

StackBytes.OSUsed的值即为被测任务堆栈已使用的字节数。

5、需要设置宏:OS_TASK_OPT_STK_CLR为1

6、最后一点建议:

(1)将被测任务经历最坏的堆栈使用状态,测出来的使用率才可靠

(2)堆栈使用率最好在%50~%80之间,太小浪费空间,太大不安全

(3)最好在工程中单独建立一个优先级较低延时较长的任务来测试其它任务的堆栈使用情况,不用时可以挂起该任务

时间: 2024-10-12 08:37:39

详解μC/OS-II如何检测任务堆栈实际使用情况——即如何设置ucosii任务堆栈大小的相关文章

全面inux主机安全配置详解--系统OS安全(第一部分)

Linux主机安全配置详解 系统安全分为: 第一部分: BIOS密码,更改合适启动选项(禁止改bios/禁止更改第一启动选项,防止恶意的引导) GRUB密码 系统密码(密码策略) 分区加密 第二部分: 最小权限法(su/sudo) 最小服务法 文件安全(suid/sgid/stick/chattr) pam模块的使用 升级系统和软件 系统安全: BIOS密码(bios/cmos) 调整BIOS引导设置 修改启动顺序,正确做法:第一启选项为磁盘 设置管理密码 禁用Ctrl+Alt+Del重启热键

全面inux主机安全配置详解--系统OS安全(第二部分)

系统安全 最小服务法 文件安全(suid/sgid/stick/chattr) 升级系统和软件 最小权限法(su/sudo) SSH安全建议 最小服务法(system v/xinetd) 关闭不需要的服务: # vim /root/service.sh #!/bin/bash service xinetd stop chkconfig xinetd off services="network sshd syslog lvm2-monitor messagebus sendmail crond g

黄聪:WordPress 多站点建站教程(二):后台(管理网络)设置详解,如何管理子站的用户、主题、插件、设置等功能

建立好了子站,我们需要有个地方配置所有子站的主题.插件等功能,我们可以在后台看到 我的站点--管理网络 如下图: 在 管理网络--仪表盘 里面,我们可以创新用户和站点,也提供了查询功能. 要注意的是:当你新上传的主题或者插件,都需要在管理网络那边的主题和插件里面将你上传的主题和插件开启.这样才可以在你的子站点中查看的到. 黄聪:WordPress 多站点建站教程(二):后台(管理网络)设置详解,如何管理子站的用户.主题.插件.设置等功能

go语言创建新进程过程详解 (os.StartProcess源码分析)

关于如何使用go语言实现新进程的创建和进程间通信,我在网上找了不少的资料,但是始终未能发现让自己满意的答案,因此我打算自己来分析这部分源代码,然后善加利用,并且分享给大家,期望大家能从中获得启发. 首先我们来看一段代码 proc, _ := os.StartProcess(name, args, attr) if err != nil { fmt.Println(err) } _, err = proc.Wait() if err != nil { fmt.Println(err) } 我们来看

详解OS X和iOS图像处理框架Core Image

转自:http://www.csdn.net/article/2015-02-13/2823961-core-image 摘要:本 文结合实例详解了OS X和iOS图像处理框架Core Image的使用,如何通过Core Image来创建和使用iOS的内置滤镜,非常适合初学者学习.虽然示例代码是用Swift写的iOS程序,不过实现概念很容易转换到 Objective-C和OS X. 这篇文章会为初学者介绍一下Core Image,一个OS X和iOS的图像处理框架. 如果你想跟着本文中的代码学习

python os.path模块常用方法详解

python os.path模块常用方法详解 1.   os.path.abspath(path)   返回path规范化的绝对路径. >>> import os    >>> os.path.abspath('pjc.txt')     '/home/pjc/pjc.txt' >>> os.path.abspath('c:\\test.csv')         #Windows主机指定完美的路径    'c:\\test.csv' 2.os.pat

python处理word文件:win32com用法详解

目标:用python处理doc文件 方法:引入win32com模块 ************************************************************************** 一.安装 ************************************************************************** 首先要先下载安装win32com模块(起先在linux下装不成功,后在windows下面成功了...) 下载地址:http

24、Linux启动流程和grub详解

还记得Windows的启动流程吗?相信大家能说出来个大概,为什么说出个大概呢,因为Windows是图形界面启动的,但是开机过程都做了什么,你知道吗,相反,Linux启动的时候,会把这些加载到屏幕上面显示,那接下来我们来看看Linux启动都发生了些什么把!!! Linux启动流程图 简解开机启动流程 当用户打开电源后,BIOS开机自检,确定启动设备,安装启动设备启动设备上面安装的GRUB开始引导Linux,Linux首先先进行内核引导,通过跟切换,执行init程序,init程序确定启动级别,根据启

函数章节详解

初识函数 什么是函数 为什么会有函数的出现 (函数的出现解决了以下的几个问题) 函数的定义 函数的注释 函数名的命名规则: 函数调用及返回值: 函数的参数:(实参与形参) 函数进阶 函数的命名空间和作用域 函数的嵌套和作用域链 函数名的本质 闭包 函数之装饰器 装饰器定义及原则 装饰器的主要功能及固定框架 装饰器的具体应用 函数之迭代器和生成器 迭代器 生成器 各种推导式 应用示例 内置函数和匿名函数 内置函数 匿名函数 章节小结 递归函数 初识递归 递归的深入了解 递归和三级菜单 递归和二分算