RTT中的线程栈大小如何控制

发布于 2015-02-01 21:40:11
1、对于线程建立函数
rt_thread_t rt_thread_create(const char *name,void (*entry)(void *parameter), void *parameter,rt_uint32_t stack_size,rt_uint8_t priority,rt_uint32_t tick)
中的stack_size需要根据什么设定大小?
2、如果在*entry指向的线程入口函数中有局部变量,为什么局部变量会在线程栈里,是编译器作用的结果吗,原理是什么呀?
请教大牛解答。

查看更多

关注者
0
被浏览
2.4k
6 个回答
zchong
zchong 2015-02-02
1、stack_size根据局部变量,函数调用深度决定,不过一般不好直接定多少,先设大一点,然后根据实际使用情况做调整;
2、搞清除,线程切换时恢复了哪些东西,你就明白了,针对你的问题重点关注一下SP寄存器。
zibozhangxinxin
zibozhangxinxin 2015-02-02
谢谢,弄明白了。
但是还有个疑问能帮忙解答一下吗? :
在stack.c中的
rt_uint8_t *rt_hw_stack_init(void *tentry, void *parameter,rt_uint8_t *stack_addr, void *texit)
{
rt_uint32_t *stk;

stk = (rt_uint32_t*)stack_addr;
*(stk) = (rt_uint32_t)tentry; /* entry point */
*(--stk) = (rt_uint32_t)texit; /* lr */
*(--stk) = 0; /* r12 */
*(--stk) = 0; /* r11 */
*(--stk) = 0; /* r10 */
*(--stk) = 0; /* r9 */
*(--stk) = 0; /* r8 */
*(--stk) = 0; /* r7 */
*(--stk) = 0; /* r6 */
*(--stk) = 0; /* r5 */
*(--stk) = 0; /* r4 */
*(--stk) = 0; /* r3 */
*(--stk) = 0; /* r2 */
*(--stk) = 0; /* r1 */
*(--stk) = (rt_uint32_t)parameter; /* r0 : argument */

/* cpsr */
if ((rt_uint32_t)tentry & 0x01)
*(--stk) = SVCMODE | 0x20; /* thumb mode */
else
*(--stk) = SVCMODE; /* arm mode */

/* return task's current stack address */
return (rt_uint8_t *)stk;
}

在该函数中只占用了线程栈的64个字节的空间,那么剩余的线程栈从高到低都存放了哪些内容呀?是由编译器控制的吗?
aozima
aozima 2015-02-02
拒绝白嫖,拒绝键盘侠!
楼主估计是问运行时放了什么,这个请去查关于栈的解释,至于运行之前放了什么,不管里面被初始化了什么内容,程序员都应该认为栈的初始值是随机的,不要忘记初始化变量。

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友