Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
请问一个thread所用到的static size如何定?
发布于 2009-10-25 22:54:04 浏览:9724
订阅该版
我创建了一个thread,里面只有一个64字节的变量,rt_thread_create时,参数stack_size为128时就运行不正常,而大于192就运行正常了,所以想了解这个stack_size如何定? 谢谢! 
查看更多
15
个回答
默认排序
按发布时间排序
aozima
2009-10-25
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
>我创建了一个thread,里面只有一个64字节的变量,rt_thread_create时,参数stack_size为128时就运行不正常,而大于192就运行正常了,所以想了解这个stack_size如何定? > >谢谢! --- 这个得需要你跟综调试下 不过你这个明显小了,光可预计的变量就有64了,还有那么多寄存器 变量虽然只有64字节 可是运行时还要很多空间的 比如原来int a; a = b; c = a; 和直接c =b ;比,并不会因为有int a;就省了空间 一般,我都是512 1024这样设置的 FINSH可以看到SP使用的最大值 ,但这个值 估计是只在切换的时候检查 并不是实际的最大值 ,实际的可能略大 所以,一般,要高出这个很多才行,都用OS了,不必太抠吧? [s:179] [s:179]
ffxz
2009-10-26
这家伙很懒,什么也没写!
finsh显示的就是实际最大的栈使用值,和那个栈溢出检查无关
aozima
2009-10-26
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
那不知FINSH中显示的那个值是怎么取来的呢? 比如刚好运行中都没有切换任务, 程序调用一个子函数,往STACK里面压了好多数据,然后返回时又弹出了,还是原样,这样,那个max used是当前的SP还是子函数里面的SP最大值呢?
bernard
2009-10-26
这家伙很懒,什么也没写!
栈开始有个初始值,在finsh里调用list_thread函数,会去读取线程栈,如果不是初始值就认为已经使用。 所以finsh里显示的max used是历史上线程栈使用的最大栈值。
zhangzq71
2009-10-28
这家伙很懒,什么也没写!
我设定了一个thread的stack大小,让其可以正常运行了,但这个thread运行了几分钟后就报 warning: trd_Read stack is close to end of stack address. 再过两秒就报 thread:trd_Read stack overflow 请问这是什么原因呢?
bernard
2009-10-29
这家伙很懒,什么也没写!
栈溢出了,线程栈不够大,被RTT的调度器检测到了,需要加大栈。
zhangzq71
2009-10-29
这家伙很懒,什么也没写!
但为何不在第一次调度时就检测出来,要运行一段时间才报呢?而我在这个thread中只是开始声明了变量后就一直没再声明了.
aozima
2009-10-29
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
>但为何不在第一次调度时就检测出来,要运行一段时间才报呢?而我在这个thread中只是开始声明了变量后就一直没再声明了. --- 你要知道的是并不是只有你定义变量才会增加栈的大小..... 有些运算是非常耗费资源的,栈在运行中是变化的. 你最好用JTAG来单步调试这个线程,看看是不是正常运行的时候栈溢出还是调度器把栈弄错了. 另外,你也太抠门了吧??????变量就有64字节的线程你竟然才给开128.... 而且,这个线程还会调用子函数....子函数的栈你有考虑没有? 另外,栈还要要保存寄存器,有十多个,每个4字节,不知道算下来有多大了... 你可以试下这个程序,在PC上面编译运行....每次都申请256K的栈,我在的电脑上,输入6还可以,输入7就溢出了 ``` #include
void fun(unsigned int i) { volatile unsigned char test[1024*256];//stack 256K if (i>0) { fun(--i); printf("addr : 0x%08X ",test); printf("%d ",i); } } int main(int argc,char * argv[]) { if (argc == 2) { printf("argv[1]:%s ",argv[1] ); fun(atoi(argv[1])); } else { printf("have no argv[1] "); } return 0; } ```
zhangzq71
2009-10-29
这家伙很懒,什么也没写!
你这个程序在每次递归中就声明了一次变量,跟我的情况好象有点不一样。我是只声明了一次变量。如果在thread中的大循环中,执行步骤都一样,只要第一次循环不出错,就应该一直不会出错,是否可以这样说?
aozima
2009-10-29
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
发一下你那个线程的代码看看
撰写答案
登录
注册新账号
关注者
0
被浏览
9.7k
关于作者
zhangzq71
这家伙很懒,什么也没写!
提问
4
回答
10
被采纳
0
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
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项目助手v0.3 | Ubuntu与MacOS平台的RT-Thread Env
2
【FRA156测评DM-MCX】- 环境配置篇
3
【基于HPM6750+RW007的网页服务器】---SD卡文件系统
4
有关RT_thread studio使用WDT的一点经验
5
ART-PI2 上手记录(一)
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
rt-smart
RTC
FAL
I2C_IIC
ESP8266
UART
cubemx
WIZnet_W5500
ota在线升级
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
GD32
定时器
ADC
flashDB
编译报错
socket
中断
rt_mq_消息队列_msg_queue
Debug
keil_MDK
SFUD
msh
ulog
C++_cpp
MicroPython
本月问答贡献
lchnu
3
个答案
2
次被采纳
张世争
1
个答案
2
次被采纳
a1012112796
9
个答案
1
次被采纳
三世执戟
7
个答案
1
次被采纳
crystal266
4
个答案
1
次被采纳
本月文章贡献
jinchanchan
9
篇文章
13
次点赞
ssdd45555
3
篇文章
2
次点赞
聚散无由
1
篇文章
4
次点赞
rvcore
1
篇文章
1
次点赞
lvdongchina
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部