OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 30828|回复: 36

ucosii的任务堆栈的大小分配

[复制链接]

67

主题

151

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2011-11-15
在线时间
4 小时
发表于 2011-12-11 13:17:30 | 显示全部楼层 |阅读模式
ucosii中创建任务的时候,都会传递一个数组,这个数组在分配的时候该分配多大的空间?依据是什么?
OSTaskCreate(TaskLed, (void * )0, (OS_STK *)&TASK_LED_STK[LED_STK_SIZE-1], LED_TASK_Prio);
LED_STK_SIZE的大小如何确定?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

39

主题

597

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2111
金钱
2111
注册时间
2011-9-3
在线时间
120 小时
发表于 2011-12-11 14:40:37 | 显示全部楼层
UCOSII里面有个函数可以测试任务所用堆栈大小的,LZ可以试试。。。
回复 支持 1 反对 0

使用道具 举报

28

主题

1489

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1656
金钱
1656
注册时间
2013-7-24
在线时间
1 小时
发表于 2014-6-11 14:58:40 | 显示全部楼层
编译会产生*.htm文件,里面详细介绍了栈的使用情况。
于20150522停用该账号:http://www.microstar.club
回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165359
金钱
165359
注册时间
2010-12-1
在线时间
2110 小时
发表于 2013-10-17 13:05:04 | 显示全部楼层
邵贝贝书本 第四章 任务管理,4.3节 堆栈检查:

4.3    堆栈检验,OSTaskStkChk()fficeffice" />

     有时候决定任务实际所需的堆栈空间大小是很有必要的。因为这样用户就可以避免为任务分配过多的堆栈空间,从而减少自己的应用程序代码所需的RAM(内存)数量。?C/OS-Ⅱ提供的OSTaskStkChk()函数可以为用户提供这种有价值的信息。

    在图4.2中,笔者假定堆栈是从上往下递减的(OS_STK_GROWTH被置为1),但以下的讨论也同样适用于从下往上长的堆栈[F4.2(1)]?C/OS-Ⅱ是通过查看堆栈本身的内容来决定堆栈的方向的。只有内核或是任务发出堆栈检验的命令时,堆栈检验才会被执行,它不会自动地去不断检验任务的堆栈使用情况。在堆栈检验时,?C/OS-Ⅱ要求在任务建立的时候堆栈中存储的必须是0(即堆栈被清零)[F4.2(2)]。另外,?C/OS-Ⅱ还需要知道堆栈栈底(BOS)的位置和分配给任务的堆栈的大小[F4.2(2)]。在任务建立的时候,BOS的位置及堆栈的这两个值储存在任务的OS_TCB中。

    为了使用?C/OS-Ⅱ的堆栈检验功能,用户必须要做以下几件事情:

l  OS_CFG.H文件中设OS_TASK_CREATE_EXT1

l  OSTaskCreateExt()建立任务,并给予任务比实际需要更多的内存空间。

l  OSTaskCreateExt()中,将参数opt设置为OS_TASK_OPT_STK_CHK+OS_TASK_OPT_STK_

CLR。注意如果用户的程序启动代码清除了所有的RAM,并且从未删除过已建立了的任务,那么用户就不必设置选项OS_TASK_OPT_STK_CLR了。这样就会减少OSTaskCreateExt()的执行时间。

l  将用户想检验的任务的优先级作为OSTaskStkChk()的参数并调用之。

4.2          堆栈检验


 

   OSTaskStkChk()顺着堆栈的栈底开始计算空闲的堆栈空间大小,具体实现方法是统计储存值为0的连续堆栈入口的数目,直到发现储存值不为0的堆栈入口[F4.2(5)]。注意堆栈入口的储存值在进行检验时使用的是堆栈的数据类型(参看OS_CPU.H中的OS_STK)。换句话说,如果堆栈的入口有32位宽,对0值的比较也是按32位完成的。所用的堆栈的空间大小是指从用户在OSTaskCreateExt()中定义的堆栈大小中减去了储存值为0的连续堆栈入口以后的大小。OSTaskStkChk()实际上把空闲堆栈的字节数和已用堆栈的字节数放置在0S_STK_DATA数据结构中(参看?COS_.H)。注意在某个给定的时间,被检验的任务的堆栈指针可能会指向最初的堆栈栈顶(TOS)与堆栈最深处之间的任何位置[F4.2(7)]。每次在调用OSTaskStkChk()的时候,用户也可能会因为任务还没触及堆栈的最深处而得到不同的堆栈的空闲空间数。

    用户应该使自己的应用程序运行足够长的时间,并且经历最坏的堆栈使用情况,这样才能得到正确的数。一旦OSTaskStkChk()提供给用户最坏情况下堆栈的需求,用户就可以重新设置堆栈的最后容量了。为了适应系统以后的升级和扩展,用户应该多分配10%-100%的堆栈空间。在堆栈检验中,用户所得到的只是一个大致的堆栈使用情况,并不能说明堆栈使用的全部实际情况。

    OSTaskStkChk()函数的代码如程序清单 L4.10所示。0S_STK_DATA(参看?COS_.H)数据结构用来保存有关任务堆栈的信息。笔者打算用一个数据结构来达到两个目的。第一,把OSTaskStkChk()当作是查询类型的函数,并且使所有的查询函数用同样的方法返回,即返回查询数据到某个数据结构中。第二,在数据结构中传递数据使得笔者可以在不改变OSTaskStkChk()API(应用程序编程接口)的条件下为该数据结构增加其它域,从而扩展OSTaskStkChk()的功能。现在,0S_STK_DATA只包含两个域:OSFreeOSUsed。从代码中用户可看到,通过指定执行堆栈检验的任务的优先级可以调用OSTaskStkChk()。如果用户指定0S_PRIO_SELF[L4.10(1)],那么就表明用户想知道当前任务的堆栈信息。当然,前提是任务已经存在[L4.10(2)]。要执行堆栈检验,用户必须已用OSTaskCreateExt()建立了任务并且已经传递了选项OS_TASK_OPT_CHK[L4.10(3)]。如果所有的条件都满足了,OSTaskStkChk()就会象前面描述的那样从堆栈栈底开始统计堆栈的空闲空间[L4.10(4)]。最后,储存在0S_STK_DATA中的信息就被确定下来了[L4.10(5)]。注意函数所确定的是堆栈的实际空闲字节数和已被占用的字节数,而不是堆栈的总字节数。当然,堆栈的实际大小(用字节表示)就是该两项之和。

 

程序清单 L 4.10   堆栈检验函数

INT8U OSTaskStkChk (INT8U prio, OS_STK_DATA *pdata)

{

    OS_TCB  *ptcb;

    OS_STK  *pchk;

    INT32U   free;

    INT32U   size;

 

 

    pdata->OSFree = 0;

    pdata->OSUsed = 0;

    if (prio > OS_LOWEST_PRIO && prio != OS_PRIO_SELF) {

        return (OS_PRIO_INVALID);

    }

    OS_ENTER_CRITICAL();

    if (prio == OS_PRIO_SELF) {                                              (1)

        prio = OSTCBCur->OSTCBPrio;

    }

    ptcb = OSTCBPrioTbl[prio];

    if (ptcb == (OS_TCB *)0) {                                               (2)

        OS_EXIT_CRITICAL();

        return (OS_TASK_NOT_EXIST);

    }

    if ((ptcb->OSTCBOpt & OS_TASK_OPT_STK_CHK) == 0) {                   (3)

        OS_EXIT_CRITICAL();

        return (OS_TASK_OPT_ERR);

    }

    free = 0;                                                                  (4)

    size = ptcb->OSTCBStkSize;

    pchk = ptcb->OSTCBStkBottom;

    OS_EXIT_CRITICAL();

#if OS_STK_GROWTH == 1

    while (*pchk++ == 0) {

        free++;

    }

#else

    while (*pchk-- == 0) {

        free++;

    }

#endif

    pdata->OSFree = free * sizeof(OS_STK);                                 (5)

    pdata->OSUsed = (size - free) * sizeof(OS_STK);

    return (OS_NO_ERR);

}

 


我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165359
金钱
165359
注册时间
2010-12-1
在线时间
2110 小时
发表于 2011-12-11 14:02:22 | 显示全部楼层
回复【楼主位】teclimber:
---------------------------------
看你任务的临时变量(局部变量大小),另外还需要考虑调用其他函数导致的堆栈增加.你可以先设置一个较大的值,然后慢慢缩减,如果不能正常运行了,说明你的堆栈就分配少了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165359
金钱
165359
注册时间
2010-12-1
在线时间
2110 小时
发表于 2011-12-11 14:43:04 | 显示全部楼层
回复【3楼】螃蟹爱虫:
---------------------------------
测试任务也要你把所有情况考虑到了才准。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

39

主题

597

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2111
金钱
2111
注册时间
2011-9-3
在线时间
120 小时
发表于 2011-12-11 14:45:15 | 显示全部楼层
看资料说测试越久就越精确,或者说测试的时候把最坏的情况测试出来,那得出的堆栈大小就比较准确了,LZ可以测试下,然后把测试结果贴上来大家一起看看。。
回复 支持 反对

使用道具 举报

67

主题

151

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2011-11-15
在线时间
4 小时
 楼主| 发表于 2011-12-11 15:53:20 | 显示全部楼层
好像是这个函数OSTaskStkChk
回复 支持 反对

使用道具 举报

39

主题

597

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2111
金钱
2111
注册时间
2011-9-3
在线时间
120 小时
发表于 2011-12-11 23:24:02 | 显示全部楼层
是的。
回复 支持 反对

使用道具 举报

38

主题

248

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
463
金钱
463
注册时间
2011-2-11
在线时间
12 小时
发表于 2011-12-12 12:44:39 | 显示全部楼层
你看mdk编出来的map文件,好像里面有说明本次编译的代码最大的栈数目。但对任务不知道是不是有效。
Openedv大力支持的开源RTOS  --Trochili RTOS(飞鸟)
回复 支持 反对

使用道具 举报

51

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
561
金钱
561
注册时间
2011-4-11
在线时间
43 小时
发表于 2012-12-21 15:40:54 | 显示全部楼层
学习了  以前都没有注意到这个  设置堆栈的时候就是乱设置
回复 支持 反对

使用道具 举报

86

主题

417

帖子

0

精华

高级会员

Rank: 4

积分
781
金钱
781
注册时间
2013-2-20
在线时间
0 小时
发表于 2013-5-28 13:04:31 | 显示全部楼层
回复【楼主位】teclimber:
---------------------------------
同样关心这个问题,楼主解决没呢?
乐于思考,敢于请教;问人不累,诲人不倦!本人CSDN博客:http://blog.csdn.net/dcx1205 学习嵌入式的同学不要错过啊!
回复 支持 反对

使用道具 举报

8

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2011-7-13
在线时间
0 小时
发表于 2014-6-11 13:24:11 | 显示全部楼层
可以用楼上原子的方法测试堆栈使用比例,先设置个大一点的数值,然后缩小。不过上述统计不完全准确,可以再留出些余量,测量结果的1.5--2倍之间。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2013-12-28
在线时间
6 小时
发表于 2014-7-9 22:02:47 | 显示全部楼层
回复【13楼】styleno1:
---------------------------------
这个文件确实提供了不少程序运行信息。赞
回复 支持 反对

使用道具 举报

4

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2014-9-10
在线时间
5 小时
发表于 2014-10-17 11:13:46 | 显示全部楼层
标记下先!!!
回复 支持 反对

使用道具 举报

3

主题

13

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2013-8-4
在线时间
0 小时
发表于 2014-11-27 10:32:26 | 显示全部楼层
回复【13楼】styleno1:
---------------------------------
好多Stack size unknown bytes
回复 支持 反对

使用道具 举报

头像被屏蔽

65

主题

277

帖子

0

精华

高级会员

Rank: 4

积分
674
金钱
674
注册时间
2013-8-11
在线时间
29 小时
发表于 2014-11-27 15:26:58 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

14

主题

97

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
204
金钱
204
注册时间
2014-12-16
在线时间
10 小时
发表于 2015-1-27 12:10:48 | 显示全部楼层
回复【13楼】styleno1:
---------------------------------
很有用,以前乱猜,猜到1024,2048,看了这个htm文件,弄个64,运行正常。
回复 支持 反对

使用道具 举报

0

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2015-1-16
在线时间
4 小时
发表于 2015-1-27 21:39:55 | 显示全部楼层
标记下先!!!
回复 支持 反对

使用道具 举报

5

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2014-8-29
在线时间
11 小时
发表于 2015-3-2 23:41:08 | 显示全部楼层
怎么收藏呢。。。
有深圳的大牛带我飞吗?
回复 支持 反对

使用道具 举报

0

主题

0

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2020-6-17
在线时间
0 小时
发表于 2015-9-28 20:55:55 | 显示全部楼层
mark
回复 支持 反对

使用道具 举报

2

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2015-10-24
在线时间
15 小时
发表于 2015-11-12 20:07:38 | 显示全部楼层
内存很受伤。。。
你艹我,我艹你,都一样。
回复 支持 反对

使用道具 举报

20

主题

468

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1679
金钱
1679
注册时间
2014-2-25
在线时间
229 小时
发表于 2015-11-24 19:25:07 | 显示全部楼层
回复【18楼】prettywolf:
---------------------------------
请问一下是怎么看出来的呀?
回复 支持 反对

使用道具 举报

20

主题

468

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1679
金钱
1679
注册时间
2014-2-25
在线时间
229 小时
发表于 2015-11-24 19:39:17 | 显示全部楼层
哦,懂了,直接用浏览器打开,然后搜索函数名。就会有相互的调用情况和堆栈深度了。赞!
回复 支持 反对

使用道具 举报

1

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1183
金钱
1183
注册时间
2015-5-28
在线时间
149 小时
发表于 2015-11-26 09:12:09 | 显示全部楼层
这个你要看UCOS的源码分析,对于如何分配 ucosii以前是有个系统检查功能的软件,可是实时监测线程堆栈的占用情况,上网找找,开启对应的服务任务就可以使用了(配置宏里面有),其实RTX不错,也很稳定,而且可以直接在keil的调试界面看到操作系统的很多运行情况
回复 支持 反对

使用道具 举报

20

主题

297

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1828
金钱
1828
注册时间
2013-7-29
在线时间
276 小时
发表于 2015-11-30 00:44:22 | 显示全部楼层
今晚又学习了,很好!
回复 支持 反对

使用道具 举报

29

主题

244

帖子

0

精华

高级会员

Rank: 4

积分
944
金钱
944
注册时间
2014-10-9
在线时间
93 小时
发表于 2016-4-20 15:33:23 | 显示全部楼层
这个好
回复 支持 反对

使用道具 举报

4

主题

52

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
282
金钱
282
注册时间
2014-2-20
在线时间
27 小时
发表于 2016-8-1 17:54:59 | 显示全部楼层
prettywolf 发表于 2015-1-27 12:10
回复【13楼】styleno1:
---------------------------------
很有用,以前乱猜,猜到1024,2048,看了这个htm ...

怎么看这个,htm
回复 支持 反对

使用道具 举报

13

主题

296

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2066
金钱
2066
注册时间
2012-5-26
在线时间
291 小时
发表于 2016-8-22 08:34:55 | 显示全部楼层
styleno1 发表于 2014-6-11 14:58
编译会产生*.htm文件,里面详细介绍了栈的使用情况。

这个htm文件怎么编译出来的
活着才是王道!健康是一切的前提!
回复 支持 反对

使用道具 举报

80

主题

268

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
441
金钱
441
注册时间
2014-8-11
在线时间
84 小时
发表于 2016-9-7 15:09:49 | 显示全部楼层
mark一下
回复 支持 反对

使用道具 举报

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2014-5-25
在线时间
18 小时
发表于 2016-10-25 11:55:13 | 显示全部楼层
mark,学习学习
回复 支持 反对

使用道具 举报

20

主题

143

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2015-8-28
在线时间
108 小时
发表于 2016-11-16 15:54:38 | 显示全部楼层
AppTaskStart (Thumb, 52 bytes, Stack size 0 bytes, main.o(i.AppTaskStart))

[Stack]
•Max Depth = 60 + Unknown Stack Size
•Call Chain = AppTaskStart ⇒ BSP_Init ⇒ BSP_CPU_ClkFreq ⇒ RCC_GetClocksFreq

这个60  是什么单位?字节吗?
如果是字节,是不是堆栈大小设置为120个字节应该可以?
回复 支持 反对

使用道具 举报

19

主题

107

帖子

0

精华

初级会员

Rank: 2

积分
195
金钱
195
注册时间
2015-3-5
在线时间
44 小时
发表于 2016-12-29 15:46:48 | 显示全部楼层
无帝老三 发表于 2016-11-16 15:54
AppTaskStart (Thumb, 52 bytes, Stack size 0 bytes, main.o(i.AppTaskStart))

[Stack]

<P><STRONG><a name="[67]"></a>main_task</STRONG> (Thumb, 188 bytes, Stack size 16 bytes, main.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 140 + Unknown Stack Size
<LI>Call Chain = main_task &rArr; LCD_ShowxNum &rArr; LCD_ShowChar &rArr; LCD_Fast_DrawPoint &rArr; LCD_WriteReg

同问,140的单位是字节吗?
在mini板中有这么一段话,说明堆栈的单位是4字节
typedef unsigned int   OS_STK;                        /* Each stack entry is 32-bit wide*/

那么 main_task 这个任务我该给多大的堆栈呢?
回复 支持 反对

使用道具 举报

35

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
362
金钱
362
注册时间
2014-7-30
在线时间
49 小时
发表于 2017-6-26 16:32:55 | 显示全部楼层
正点原子 发表于 2013-10-17 13:05
邵贝贝书本 第四章 任务管理,4.3节 堆栈检查:
4.3&nbsp;&nbsp;&nbsp; 堆栈检验,OSTaskStkChk()
&nbsp; ...

mark
我就是我,是颜色不一样的烟火。
回复 支持 反对

使用道具 举报

35

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
362
金钱
362
注册时间
2014-7-30
在线时间
49 小时
发表于 2017-6-26 16:33:06 | 显示全部楼层
正点原子 发表于 2013-10-17 13:05
邵贝贝书本 第四章 任务管理,4.3节 堆栈检查:
4.3&nbsp;&nbsp;&nbsp; 堆栈检验,OSTaskStkChk()
&nbsp; ...

                                          mark
我就是我,是颜色不一样的烟火。
回复 支持 反对

使用道具 举报

35

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
362
金钱
362
注册时间
2014-7-30
在线时间
49 小时
发表于 2017-6-26 16:33:28 | 显示全部楼层
正点原子 发表于 2013-10-17 13:05
邵贝贝书本 第四章 任务管理,4.3节 堆栈检查:
4.3&nbsp;&nbsp;&nbsp; 堆栈检验,OSTaskStkChk()
&nbsp; ...

                     
我就是我,是颜色不一样的烟火。
回复 支持 反对

使用道具 举报

1

主题

20

帖子

0

精华

高级会员

Rank: 4

积分
531
金钱
531
注册时间
2015-10-16
在线时间
65 小时
发表于 2017-7-11 23:19:33 | 显示全部楼层
Mark
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-12-18 16:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表