挂起状态的线程,如果调用 rt_thread_delete/detach() 函数,将更改为关闭状态(RT_THREAD_CLOSE);而运行状态的线程,如果运行结束,就会在线程的最后部分执行rt_thread_exit() 函数,将状态更改为关闭状态。 !!! note “注意事项” RT-Thread 中,实际上线程并不存在运行状态,就绪状态和运行状态是等同的。 2.4系统线...
void rt_thread_exit(void){ struct rt_thread *thread; register rt_base_t level; /* get currentthread */ thread = rt_current_thread; /* disableinterrupt */ level = rt_hw_interrupt_disable(); /* remove fromschedule */ rt_schedule_remove_thread(thread); /* change stat*/ thread->stat ...
RT-Thread 只回收rt_thread_create的线程内存资源。 静态初始化或动态创建线程时,会注册:rt_thread_exit,线程退出后,会调用rt_thread_exit。 rt_thread_exit中,第一步:把线程从调度链表移除。第二步:静态的线程,会调用:rt_object_detach,从内核对象容器里移除线程内核对象;动态线程,会把线程的结构体指针(操作句...
若某线程运行完毕,系统将自动删除线程:自动执行rt_thread_exit() 函数,先将该线程从系统就绪队列中删除,再将该线程的状态更改为关闭状态,不再参与系统调度,然后挂入rt_thread_defunct 僵尸队列(资源未回收、处于关闭状态的线程队列)中,最后空闲线程会回收被删除线程的资源。 空闲线程也提供了接口来运行用户设置的钩子...
rt_thread_exit中,第一步:把线程从调度链表移除。第二步:静态的线程,会调用:rt_object_detach,从内核对象容器里移除线程内核对象;动态线程,会把线程的结构体指针(操作句柄),加入rt_thread_defunct僵尸线程链表中,而不是立即释放线程占用的内存。僵尸线程的操作,是在idle线程中执行。第三步:执行线程调度,切换线程。
rt_thread_exit中,第一步:把线程从调度链表移除。第二步:静态的线程,会调用:rt_object_detach,从内核对象容器里移除线程内核对象;动态线程,会把线程的结构体指针(操作句柄),加入rt_thread_defunct僵尸线程链表中,而不是立即释放线程占用的内存。僵尸线程的操作,是在idle线程中执行。第三步:执行线程调度,切换线程。
若某线程运行完毕,系统将自动删除线程:自动执行rt_thread_exit() 函数,先将该线程从系统就绪队列中删除,再将该线程的状态更改为关闭状态,不再参与系统调度,然后挂入rt_thread_defunct 僵尸队列(资源未回收、处于关闭状态的线程队列)中,最后空闲线程会回收被删除线程的资源。
6:挂起状态的线程,如果调用 rt_thread_delete/detach() 函数,将更改为关闭状态(RT_THREAD_CLOSE)。 7:运行状态的线程,如果运行结束,就会在线程的最后部分执行 rt_thread_exit() 函数,将状态更改为关闭状态。 #1:线程通过调用函数 rt_thread_create/init() 进入到初始状态(RT_THREAD_INIT)。
rt_thread_exit(),处于运行状态的线程,运行结束,在线程的最后部分调用此函数,将状态更改为关闭状态。 线程控制块 在RT-Thread 中,线程控制块由结构体 struct rt_thread 表示。 线程控制块是操作系统用于管理线程的一个数据结构,它会存放线程的一些信息,例如优先级、线程名称、线程状态等。
(void *)_thread_exit); 在调用 rt_hw_stack_init() 初始化堆栈的时候传入线程栈起始地址进行了 -sizeof(rt-ubase_t) 操作,而在 rt_hw_stack_init() 函数内又进行 stk = stack_addr + sizeof(rt_uint32_t); 将其给加了回去,这操作的意义是什么呢?还是说是历史遗留问题?