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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
rt_thread_idle_sethook函数是RT-Thread实时操作系统中的一个API函数。它用于设置系统空闲线程的钩子函数。在RT-Thread中,空闲线程是一个特殊的线程,当系统没有其他线程需要运行时,就会执行空闲线程的代码。 通过调用rt_thread_idle_sethook函数,可以设置一个用户定义的函数作为空闲线程的钩子函数。这个钩子函数会在系统进入空闲状态时被调用,可以用来执行一些低优先级的任务、进行系统性能监测或者进行节能优化等操作。 rt_thread_idle_sethook函数的原型如下: ```c void rt_thread_idle_sethook(void (*hook)(void)); ``` 其中,参数hook是一个函数指针,指向用户定义的空闲线程钩子函数。这个函数不带任何参数和返回值。 下面是一个示例代码,演示了如何使用rt_thread_idle_sethook函数设置空闲线程的钩子函数: ```c #include <rtthread.h> void my_idle_hook(void) { /* 在这里执行一些操作 */ /* 例如进行系统性能监测或者节能优化等 */ } int main(void) { /* 初始化RT-Thread内核 */ rt_thread_idle_sethook(my_idle_hook); /* 启动RT-Thread内核调度 */ rt_thread_startup(); return 0; } ``` 在上述示例代码中,通过调用rt_thread_idle_sethook函数将my_idle_hook函数设置为空闲线程的钩子函数。当系统进入空闲状态时,my_idle_hook函数将被调用。用户可以根据自己的需求在my_idle_hook函数中实现相应的功能。 希望这个回答能够解决你的问题!如果还有其他疑问,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值