完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
rt_thread_create( "a", thread_entry, RT_NULL,256,4 ,20);
中的256是堆栈空间。 这个堆栈是线程切换时保存现场用的吗?还是线程体中所用堆栈的大小。 如果是前者,那么即使线程体中用的堆栈大小超过256,也不会影响线程运行吧? |
|
相关推荐
1个回答
|
|
栈 - 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字节,导致栈溢出,可能破坏了其他线程的栈,可能导致某些变量的值异常,线程大概率就死掉了,一定会影响线程运行。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
AI模型部署边缘设备的奇妙之旅:边缘端设备的局域网视频流传输方案
1641 浏览 0 评论
1510 浏览 0 评论
AI模型部署边缘设备的奇妙之旅:如何在边缘端部署OpenCV
6747 浏览 0 评论
tms320280021 adc采样波形,为什么adc采样频率上来波形就不好了?
1876 浏览 0 评论
4022 浏览 0 评论
78714 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-2-1 12:54 , Processed in 0.563326 second(s), Total 71, Slave 55 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号