打印

STM32中,使用ucos堆栈是怎么分配的啊

[复制链接]
8113|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ZUI135|  楼主 | 2009-8-13 15:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在使用ucos时候(IAR编译器),一个任务需要用到2K的堆栈,但是设置的时候,
-D_CSTACK_SIZE=A00
-D_HEAP_SIZE=600
这里设置的CSTACK_SIZE好像是只能最大到0XAA0吧,我有多个任务,一用就程序跑飞掉了,调试的时候看IAR上的stack也没用多少,是怎么回事啊,香主和各路高人能否详细的告诉下,被这地方折腾的不行了。。。
沙发
Neoo| | 2009-8-13 15:20 | 只看该作者
IAR不是很了解,但是对于操作系统而言,一个task用的堆栈的定义存储在这个task的控制块(TCB)中的,和IAR链接时候的这些堆栈没有关系的,在初始化任务的时候应该对任务的堆栈进行初始化。您所提到的堆栈只用于main函数进入操作系统的堆栈和操作系统内核运行所用到的堆栈。它的大小和main函数中调用关系的多少,以及操作系统中运行task的数量的多少有关,和实际的任务所用的堆栈大小无关。

使用特权

评论回复
板凳
ZUI135|  楼主 | 2009-8-13 15:38 | 只看该作者
不是很明白,我现在建立两个任务,一个128 B,一个2048 B的堆栈,lnkarm_flash.XCL里面的设置项
-D_CSTACK_SIZE=A00
好像是整个系统能使用的堆栈size,在任务调用其他函数的时候,临时变量应该是是保存到2048里面吧 ?
按照这个想法,我的这个2048应该用的差不多才对,但查看堆栈使用情况,用的很少,不明白是怎么回事?

使用特权

评论回复
地板
自然的天逸| | 2009-8-13 16:40 | 只看该作者
IAR 不清楚 ucos 里面的每个人任务的堆栈 我是静态的分配
/*
****************************************************************************************
* 定义任务堆栈大小
****************************************************************************************
*/
#define TASK_STACK_SIZE1                        200                        /* 任务1         */
#define TASK_STACK_SIZE2                        200                        /* 任务2         */
#define TASK_STACK_SIZE3                        200                        /* 任务3         */
#define TASK_STACK_SIZE4                        200                        /* 任务4         */
#define TASK_STACK_SIZE5                        200                        /* 任务5         */
#define TASK_STACK_SIZE6                        200                        /* 任务6         */
#define TASK_STACK_SIZE7                        200                        /* 任务7         */
#define TASK_STACK_SIZE8                        200                        /* 任务8         */
#define TASK_STACK_SIZE9                        200                        /* 任务6         */
#define TASK_STACK_SIZE10                        200                        /* 任务7         */
#define TASK_STACK_SIZE11                        200                        /* 任务7         */
/*
****************************************************************************************
* Private variables
****************************************************************************************
*/
OS_STK        Task1Stk[TASK_STACK_SIZE1];                                /* 任务1堆栈                 */
OS_STK        Task2Stk[TASK_STACK_SIZE2];                                /* 任务2堆栈                 */
OS_STK        Task3Stk[TASK_STACK_SIZE3];                                /* 任务3堆栈                 */
OS_STK        Task4Stk[TASK_STACK_SIZE4];                                /* 任务4堆栈                 */
OS_STK        Task5Stk[TASK_STACK_SIZE5];                                /* 任务5堆栈                 */
OS_STK        Task6Stk[TASK_STACK_SIZE6];                                /* 任务6堆栈                 */
OS_STK        Task7Stk[TASK_STACK_SIZE7];                                /* 任务7堆栈                 */
OS_STK        Task8Stk[TASK_STACK_SIZE8];                                /* 任务8堆栈                 */
OS_STK        Task9Stk[TASK_STACK_SIZE9];                                /* 任务9堆栈                 */
OS_STK        Task10Stk[TASK_STACK_SIZE10];                                /* 任务10堆栈                 */
OS_STK        Task11Stk[TASK_STACK_SIZE11];                                /* 任务11堆栈                 */

使用特权

评论回复
5
自然的天逸| | 2009-8-13 16:44 | 只看该作者
就是定义了一个数组,任务TCB 会把数组的最后地址保存到里面,切换那个任务运行 相应的使用哪个数组做堆栈

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

182

帖子

1

粉丝