OpenEdv-开源电子网

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

任务初始化函数

[复制链接]

30

主题

73

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2016-6-5
在线时间
85 小时
发表于 2017-9-29 17:52:17 | 显示全部楼层 |阅读模式
1金钱
#if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) || ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) )
    {
        /* Fill the stack with a known value to assist debugging. */
        ( void ) memset( pxNewTCB->pxStack, ( int ) tskSTACK_FILL_BYTE, ( size_t ) ulStackDepth * sizeof( StackType_t ) );    //1如果使能了堆栈的溢出检测功能或者追踪功能的话使用一个定值tskSTACK_FILL_BYTE来填充任务堆栈,这个值为0xa5U
    }
    #endif /* ( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) || ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) ) ) */

    /* Calculate the top of stack address.  This depends on whether the stack
    grows from high memory to low (as per the 80x86) or vice versa.
    portSTACK_GROWTH is used to make the result positive or negative as required
    by the port. */
    #if( portSTACK_GROWTH < 0 )
    {
        pxTopOfStack = pxNewTCB->pxStack + ( ulStackDepth - ( uint32_t ) 1 );        //2 计算堆栈栈顶pxTopOfStack初始化任务堆栈的时候用到

     请问pxNewTCB->pxStack 是栈底还是整个堆栈  怎么理解

最佳答案

查看完整内容[请看2#楼]

首先,不管是堆还是栈,归根到底都还是内存,在单片机中都是用ram实现的. 额,就像我们操作数组一样,我们仅仅需要知道数组的首地址和长度。这里的pxNewTCB->pxStack就是这个数组的首地址,而ulStackDepth就是这个数组的长度。 但是呢,栈跟数组又不一样,栈是向下增长的。高地址->低地址。 我们需要的栈顶指针就类似与数组最后一个元素的地址。所以就是数组首地址+数组长度。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
发表于 2017-9-29 17:52:18 | 显示全部楼层
首先,不管是堆还是栈,归根到底都还是内存,在单片机中都是用ram实现的.
额,就像我们操作数组一样,我们仅仅需要知道数组的首地址和长度。这里的pxNewTCB->pxStack就是这个数组的首地址,而ulStackDepth就是这个数组的长度。

但是呢,栈跟数组又不一样,栈是向下增长的。高地址->低地址。

我们需要的栈顶指针就类似与数组最后一个元素的地址。所以就是数组首地址+数组长度。

电子爱好者
回复

使用道具 举报

4

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2017-6-15
在线时间
23 小时
发表于 2017-10-10 19:23:33 | 显示全部楼层
楼上说的不错
回复

使用道具 举报

1

主题

15

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2016-9-26
在线时间
7 小时
发表于 2017-12-5 19:40:14 | 显示全部楼层
这个楼主单步断点走一下就知道了。STM32来说 任务开辟的堆栈实际上是uxHEap(当然也可以链接到头文件的堆里面),其中低地址是栈,高地址是堆。随着堆得增加,栈竟然蹭蹭的往低地址移动。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-26 06:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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