完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
rt_thread_create( "a", thread_entry, RT_NULL,256,4 ,20); 中的256是堆栈空间。 这个堆栈是线程切换时保存现场用的吗?还是线程体中所用堆栈的大小。 如果是前者,那么即使线程体中用的堆栈大小超过256,也不会影响线程运行吧? |
|
相关推荐
2个回答
|
|
栈 - Stack
堆 - Heap 它们是完全不同的概念。 1.普通前后台系统 main函数的while(1)属于后台,isr属于前台。 在主循环中调用函数完成具体功能,发生中断,从主循环中切换到isr,处理完毕回到主循环。整个过程只有一个栈。我们不妨将它称之为Main Stack。 一般写函数,形参个数不超过4个,此时通过R0 ~ R3传递函数参数;如果形参超过4个,则使用栈传递参数。函数内部的临时变量,从栈中分配。 一段伪代码: main.c void test_func1(void) { char str[128]; /* 数组占用128字节,调用函数时从Stack中分配 */ char *ptr; /* 指针变量占用4字节,调用函数时从Stack中分配 */ ptr = (char *)malloc(256); /* 分配的256字节来源于 Heap */ .... free(ptr); /* 用完释放,Heap看起来没有变化*/ } int main() { test_func1(); /* 函数调用前后,Stack看起来没有变化 */ } 2.RTOS 假设有2个线程。 系统启动,从启动代码中开始运行,直到进入到高优先级线程中,使用Main Stack。 进入高优先级线程,使用该线程的栈,我们称之为Process Stack,即你帖子中提到的256字节的Stack。在thread_entry中进行函数调用的开销,都在这256字节的栈中完成。 rt_thread_create( "a", thread_entry, RT_NULL,256,4 ,20); 由于有2个线程,所以RTOS下的Stack合计为: Main Stack Size + Thread1 Process Stack Size + Thread2 Process Stack Size Q: 如果是前者,那么即使线程体中用的堆栈大小超过256,也不会影响线程运行吧? A: 线程中的栈是用来做现场保护的。线程中的堆和栈是两个不同的概念,你可看前文的伪代码中的注释。 如果线程中,函数调用深度较深,如 thread_entry --> func1 --> func2 --> func3 --> func4 而每个函数中都用了128字节的临时变量,所需要的栈远超过了256字节,导致栈溢出,可能破坏了其他线程的栈,可能导致某些变量的值异常,线程大概率就死掉了,一定会影响线程运行。 |
|
|
|
单个线程栈消耗,记得还要算上线程上下文。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
824 浏览 0 评论
6015 浏览 0 评论
如何使用python调起UDE STK5.2进行下载自动化下载呢?
2786 浏览 0 评论
开启全新AI时代 智能嵌入式系统快速发展——“第六届国产嵌入式操作系统技术与产业发展论坛”圆满结束
3095 浏览 0 评论
获奖公布!2024 RT-Thread全球巡回线下培训火热来袭!报名提问有奖!
33036 浏览 11 评论
73559 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-2 08:20 , Processed in 0.519915 second(s), Total 72, Slave 56 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号