完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我创建了一个thread,里面只有一个64字节的变量,rt_thread_create时,参数stack_size为128时就运行不正常,而大于192就运行正常了,所以想了解这个stack_size如何定? 谢谢! |
|
相关推荐
7个回答
|
|
这个得需要你跟综调试下
不过你这个明显小了,光可预计的变量就有64了,还有那么多寄存器 变量虽然只有64字节 可是运行时还要很多空间的 比如原来int a; a = b; c = a; 和直接c =b ;比,并不会因为有int a;就省了空间 一般,我都是512 1024这样设置的 FINSH可以看到SP使用的最大值 ,但这个值 估计是只在切换的时候检查 并不是实际的最大值 ,实际的可能略大 所以,一般,要高出这个很多才行,都用OS了,不必太抠吧? |
|
|
|
finsh显示的就是实际最大的栈使用值,和那个栈溢出检查无关
|
|
|
|
栈开始有个初始值,在finsh里调用list_thread函数,会去读取线程栈,如果不是初始值就认为已经使用。
所以finsh里显示的max used是历史上线程栈使用的最大栈值。 |
|
|
|
我设定了一个thread的stack大小,让其可以正常运行了,但这个thread运行了几分钟后就报
warning: trd_Read stack is close to end of stack address. 再过两秒就报 thread:trd_Read stack overflow 请问这是什么原因呢? |
|
|
|
栈溢出了,线程栈不够大,被RTT的调度器检测到了,需要加大栈。
|
|
|
|
但为何不在第一次调度时就检测出来,要运行一段时间才报呢?而我在这个thread中只是开始声明了变量后就一直没再声明了.
|
|
|
|
你要知道的是并不是只有你定义变量才会增加栈的大小…..
有些运算是非常耗费资源的,栈在运行中是变化的. 你最好用JTAG来单步调试这个线程,看看是不是正常运行的时候栈溢出还是调度器把栈弄错了. 另外,你也太抠门了吧??????变量就有64字节的线程你竟然才给开128…. 而且,这个线程还会调用子函数….子函数的栈你有考虑没有? 另外,栈还要要保存寄存器,有十多个,每个4字节,不知道算下来有多大了… 你可以试下这个程序,在PC上面编译运行….每次都申请256K的栈,我在的电脑上,输入6还可以,输入7就溢出了 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
971 浏览 0 评论
AI模型部署边缘设备的奇妙之旅:如何在边缘端部署OpenCV
3205 浏览 0 评论
tms320280021 adc采样波形,为什么adc采样频率上来波形就不好了?
1434 浏览 0 评论
2085 浏览 0 评论
1604 浏览 0 评论
75208 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-27 05:10 , Processed in 0.814472 second(s), Total 83, Slave 67 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号