Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Kernel
关于RTT4.0任务栈空间溢出临界问题
发布于 2019-01-03 23:19:47 浏览:4584
订阅该版
实验环境 Stack_Size EQU 0x400; 1024Heap_Size EQU 0x200; 512Main 函数 栈空间2048字节。key_scan任务分配1025空间,关系如下 ![110,0](https://www.rt-thread.org/qa/forum.php?mod=image&aid=7134&size=300x300&key=8706b1ca2dfc1fe9&nocache=yes&type=fixnone) key_scan任务在空载运行时占用0x8D (141), 剩余内存是1025 - 141 = 884这时候在key_scan任务内申请一个uint8_t buf[884]={0}临界长度的数据,会循环触发warning: key_task stack is close to end of stack address.该操作只要触发了一次之后你无论重启,断电,或者把数值改小或该更大,都还是会循环触发。当数组数值884小到70%以下再烧录,该警报才会得以解除。 如果你一开始给数组直接赋值大于或小于884的值,不会发生该现象。大于884会报正常的堆栈溢出警告程序挂机卡死这是正常的。小于884,仅仅会报一次以上警告,不会疯狂循环输出。所以问题是,为什么任务内存占用**等于临界值**边缘会频繁触发(rt_ubase_t)thread->sp <= ((rt_ubase_t)thread->stack_addr + 32)恒成立,**接近并且小于临界段只会触发一次警告?** ![QQ截图20190103230647.png](https://oss-club.rt-thread.org/uploads/201901/03/230713ugmmmmaem22cz5z6.png)
查看更多
30
个回答
默认排序
按发布时间排序
lymzzyh
2019-01-04
这家伙很懒,什么也没写!
不理解 在不重新烧录代码的情况下如何变更 uint8_t buf[884]={0}的空间占用
lymzzyh
2019-01-04
这家伙很懒,什么也没写!
完全不能理解楼主在说什么 能上对应的代码吗?
lymzzyh
2019-01-04
这家伙很懒,什么也没写!
首先 buf 是个什么东西 是局部变量 静态变量还是全局变量 文中有提及 申请 那么是否是堆变量 一开始是什么意思 什么情况下是一开始改大改小是怎么改的 大是多大 小是多小 如果栈爆了 那就不再调度了 自然不会疯狂输出。。
lymzzyh
2019-01-04
这家伙很懒,什么也没写!
接近并且小于临界段 是接多近 小多少
bevis
2019-01-04
这家伙很懒,什么也没写!
>首先 buf 是个什么东西 是局部变量 静态变量还是全局变量 文中有提及 申请 那么是否是堆变量 一开始是什么 ... --- buf是key_scan任务内的一个局部变量。在定义buf前的key_scan任务占用的栈空间为空载占用,用key_scan任务总栈空间 - 空载占用得到 剩余任务栈空间(即临界值), 在开发板上电后第一次给任务内申请一个临界值大小的局部变量就会疯狂输出警告。如果开发板上电后第一次给任务内定义的局部变量长度不等于临界值(可大可小),就不会发生这样的现象
bevis
2019-01-04
这家伙很懒,什么也没写!
>接近并且小于临界段 是接多近 小多少 --- 没有具体,只要不等于这个临界值就行
bevis
2019-01-04
这家伙很懒,什么也没写!
>不理解 在不重新烧录代码的情况下如何变更 uint8_t buf[884]={0}的空间占用 --- 变更一次烧一次,只要你使用这个临界值就有有种BUG记忆效应的错觉,除非你下次更改buf大小是小于总的任务栈空间大约70%这样,异常才会解除
WKJay
认证专家
2019-01-05
wkjay.com
题主如果能提供一下错误源码大家就能更准确地找到问题了
bevis
2019-01-05
这家伙很懒,什么也没写!
>题主如果能提供一下错误源码大家就能更准确地找到问题了 --- main.c 放到以下路径,直接烧录运行必爆。 IoT_Board-master\examples\03_basic_key\applications
bernard
2019-01-06
这家伙很懒,什么也没写!
所以是,开启一个线程,在这个线程中定义了一个大数组以消耗这个栈空间。当这个数组到达一定大小时,触发了栈溢出?然后会频发打印一些信息(信息是栈使用深度接近到一定的临界值)? 这个看起来很正常,因为栈使用量检查是在任务切换时检查的。因为你程序中栈使用深度过量了。要知道,除了函数内局部变量占用一定栈空间以外,任务上下文保存也需要一定的栈空间。你这边开辟的是1025(系统内部会自动取整、对齐,会更小些),局部变量数组到884后出现警告。再加上任务上下文保存空间,然后就接近stack_size - 32的深度了。 出现这个警告后,也就提示你,任务栈空间需要加大了。
撰写答案
登录
注册新账号
关注者
0
被浏览
4.6k
关于作者
bevis
这家伙很懒,什么也没写!
提问
79
回答
266
被采纳
0
关注TA
发私信
相关问题
1
请教cpu使用率分析
2
选择FreeRTOS, 还是RT-Thread。
3
thread heap stack overflow ?
4
rtt消息队列delay问题
5
释放被删除线程的内存地方在哪里啊
6
请教:各线程结束后,释放其中的内存的连续性问题
7
STM32F103中断关于信号量、邮箱问题
8
RTT中的线程栈大小如何控制
9
关于线程由执行态变为挂起态的代码实现,,,
10
rt_malloc(rt_size_t size)内存分配函数最小分配尺寸问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
RT Thread 源码分析笔记 :线程和调度器
2
RT-Thread项目助手v0.2.0 - 支持Env Windows
3
RttreadV5.10上,GD32F450Z RTC时间显示问题
4
rt-smart启动流程分析
5
EtherKit快速上手PROFINET
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
聚散无由
2
篇文章
12
次点赞
Wade
2
篇文章
2
次点赞
xiaorui
1
篇文章
1
次点赞
zhuzhuzhu
1
篇文章
1
次点赞
catcatbing
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部