概要
前面提到线程的运行状态、时间片、优先级,那么系统怎么判断当前时间该运行哪一个线程呢?这就要通过线程调度来实现。
我们来分析下源码,看下最终是调用哪些函数。
/* 让出处理器资源 */
rt_err_t rt_thread_yield(void)
-> void rt_schedule(void)
/* 线程休眠 */
rt_err_t rt_thread_sleep(rt_tick_t tick)
-> void rt_schedule(void)
可以发现,rt_schedule函数才是调度的核心。
一、rt_schedule函数
该函数定义在 rt-thread/src/scheduler.c 文件中。
void rt_schedule(void)
{
......
/* 关中断 */
level = rt_hw_interrupt_disable();
......
/* 获取优先级最高的线程 */
to_thread = _get_highest_priority_thread(&highest_ready_priority);
......
/* 如果当前线程的优先级低于获取到线程的优先级,则让出处理器资源 */
rt_current_thread->stat &= ~RT_THREAD_STAT_YIELD_MASK;
need_insert_from_thread = 1;