详细分析rt_thread_startup(&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);
}

 

上一篇:[LeetCode] 621. Task Scheduler(任务调度器)


下一篇:协程库st(state threads library)原理解析