ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

详细分析rt_thread_startup(&idle );

2021-02-18 09:58:43  阅读:303  来源: 互联网

标签:rt RT THREAD thread startup priority idle 线程


分析线程启动函数,该函数的主要作用为:启动一个线程并将其放到系统的就绪列表中。

rt_err_t  rt_thread_startup(rt_thread_t thread)
{
	/*设置当前优先级为初始优先级*/
	thread->current_priority = thread->init_priority ;     (1)
	thread->number_mask  = 1L << thread->current_priority ;(2)
	/*改变线程的状态为挂起状态*/
	thread->stat = RT_THREAD_SUSPEND ;                      (3)
	/*然后恢复线程*/
	rt_thread_resume(thread);                               (4)
	if(rt_thread_self() != RT_NULL )                        (5)
	{
		/*系统调度*/
		rt_schedule ();
	}
	return RT_EOK ;
}

以空闲线程idle空闲线程的启动为例。

(1)idle的当前线程优先级变为初始优先级。

(2)idle的number-mask赋值为1左移31位

(3)idle的状态在rt_thread_init初始化的时候状态为 thread->stat   = RT_THREAD_INIT ;

经过rt_thread_startup函数后thread->stat = RT_THREAD_SUSPEND ;  //挂起

接下来分析rt_thread_resume(thread);                               (4)

//该函数定义将挂起的线程变为恢复线程
/*该函数用于恢复一个线程将其放到就绪列表*/
rt_err_t  rt_thread_resume (rt_thread_t thread)
{
	register rt_base_t temp;
	/*将被恢复的线程必须在挂起的状态,否则返回错误码*/
    //其中RT_THREAD_STAT_MASK =0x00001111
	if ((thread->stat& RT_THREAD_STAT_MASK )!= RT_THREAD_SUSPEND)
	{
		return -RT_ERROR;
	}
	/*关中断*/
	temp = rt_hw_interrupt_disable ();
	/*从挂起队列移除*/
	rt_list_remove (&(thread->tlist ));
	/*开中断*/
	rt_hw_interrupt_enable (temp);
	/*插入就绪列表*/
	rt_schedule_insert_thread (thread);
	return RT_EOK;
}

接下来关注一下rt_schedule_insert_thread (thread)函数
void rt_schedule_insert_thread (struct rt_thread  *thread)
{
	register  rt_base_t temp;
	/*关中断*/
	temp = rt_hw_interrupt_disable ();
	/*改变线程状态*/
    “当程序执行到此idle的线程状态从挂起supend状态终于变成ready准备就绪状态”
	thread->stat = RT_THREAD_READY;
     
	/*将线程插入到就绪列表*/
    “rt_thread_priority_table 是全局变量,将所有的线程链表都链接于此,是系统运作的生命线 ”
	rt_list_insert_before (&(rt_thread_priority_table [thread->current_priority]),
	                       &(thread->tlist ));
	/*设置线程就绪优先级中的对应位*/
     “number_mask是32位,可以假装看成是标志位寄存器,不同优先级时对应不同位以做标记”
	rt_thread_ready_priority_group |= thread ->number_mask;
	/*开中断*/
	rt_hw_interrupt_enable (temp);
}

 

标签:rt,RT,THREAD,thread,startup,priority,idle,线程
来源: https://blog.csdn.net/altiumer/article/details/113841137

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有