|
进程的睡眠--sleep()
进程的睡眠的实现很简单。
进程在初始化的时候,初始化一个定时器,用于在睡眠的时候可以唤醒自己:
rt_thread_init()
{
...
/* init thread timer */
rt_timer_init(&(thread->thread_timer),
thread->name,
rt_thread_timeout,
thread,
0,
RT_TIMER_FLAG_ONE_SHOT);
...
}
可以看到,超时函数是rt_thread_timeout,参数则是睡眠的进程本身。
void rt_thread_timeout(void* parameter)
{
struct rt_thread* thread;
thread = (struct rt_thread*) parameter;
/* insert to schedule ready list */
rt_schedule_insert_thread(thread);
/* do schedule */
rt_schedule();
}
超时函数的作用很直接,只是把进程插入到运行队列,然后重新调度。
而sleep函数则是在进程需要睡眠的时候,将函数从运行队列中删除:
int sleep (u32 tick)
{
struct rt_thread *thread;
u32 temp = rt_hw_interrupt_disable();
thread = rt_current_thread;
//将自己从运行队列中删除
rt_schedule_remove_thread(thread);
//启动定时器
rt_timer_control(&(thread->thread_timer), RT_TIMER_CTRL_SET_TIME, &tick);
rt_timer_start(&(thread->thread_timer));
/* enable interrupt */
rt_hw_interrupt_enable(temp);
//自身睡眠,唤醒其他进程
rt_schedule();
return 0;
}
这样在超时到来后,进程便会被timeout函数重新加入运行队列继续运行了。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|