【基础问题请教】关于动态建立的线程的善后问题。
请教一个基础问题原来在一个帖子问过,
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4747340&bbs_page_no=1&search_mode=3&search_text=aaa1982&bbs_id=3066
但是关于“动态创建的线程,因为是动态创建出来的,所以这个线程相应的TCB和栈空间会被自动释放”不是很理解。
看了一下rt_thread_init 和 rt_thread_create 区别就在TCB 以及 stack空间一个是预先分配好的(静态创建进程rt_thread_init ),一个是进来才malloc的(动态创建进程:rt_thread_create ),其他没啥区别了。
我想问一下,对于动态创建的进程,当进程执行完了的时候,也就是走到了相关thread->entry 最后的时候,怎么会进入内核态来释放栈空间和TCB呢(到底是在哪里free这些东西的)?
哪些代码能保证在执行完动态创建的任务的时候,可以跳到其他就绪的任务继续执行而不会跑飞啊?(这应该看那块代码?)
感谢各位指教! 看了一下代码还是没看明白:
如果说 不会执行完退出的线程(rt_thread_init出来的)在进行切换的时候,LR保存的是被切出去时候的地址,
在任务调度的时候,rt_hw_pend_sv 里面,恢复完了R4-R11,再把psp切换到新的线程stack地址以后,bx lr 直接就把新的原来自动存进来的lr又恢复了,自然完成了任务切换。
但是在 对于执行完会退出的线程( rt_thread_create 出来的),在执行完整个线程的时候,不一定会走到任务切换里面,但最终该线程(也就是那个函数)肯定还是要返回的,在该函数最后执行的那个bx lr,LR到底是那个地址啊?
/libcpu/arm/cortex-m3/cpuport.c
rt_hw_stack_init()
{
*(--stk) = (unsigned long)texit; /* lr */
}
同样问题不要重复发贴。 十分感谢回复
PS:问第一个帖子的时候我并不是想问现在这个问题。
页:
[1]