rt-thread线程调试器获取当前最高优先级线程算法分析
上一章大概分析了rt-thread操作系统的线程调试器的源码,此文具体来讲讲rt-thread在调试时,是如何获取获得当前最高优先级线程的算法过程。
之前已提到过,rt-thread采用了一个位图来实现此过程,在具体分析此过程之前,我们首先来看看此位图的结构及相关的一些参数变量。
1 位图结构及相关参数1.1 位图结构在rt-thread的源码文件scheduler.c中在一位图,如下定义:
/* * This function will remove a thread from system ready queue. * * @param thread the thread to be removed * * @note Please do not invoke this function in user application. */void rt_schedule_remove_thread(struct rt_thread *thread){ register rt_base_t temp; RT_ASSERT(thread != RT_NULL); /* disable interrupt */ temp = rt_hw_interrupt_disable();#if RT_THREAD_PRIORITY_MAX <= 32 RT_DEBUG_LOG(RT_DEBUG_SCHEDULER, ("remove thread[%s], the priority: %d\n", thread->name, thread->current_priority));#else RT_DEBUG_LOG(RT_DEBUG_SCHEDULER, ("remove thread[%s], the priority: %d 0x%x %d\n", thread->name, thread->number, thread->number_mask, thread->high_mask));#endif /* remove thread from ready list */ rt_list_remove(&(thread->tlist));//将当前线程从就绪队列中移除 if (rt_list_isempty(&(rt_thread_priority_table[thread->current_priority]))) {#if RT_THREAD_PRIORITY_MAX > 32//之前参数操作的逆操作 rt_thread_ready_table[thread->number] &= ~thread->high_mask; if (rt_thread_ready_table[thread->number] == 0) { rt_thread_ready_priority_group &= ~thread->number_mask; }#else rt_thread_ready_priority_group &= ~thread->number_mask;#endif } /* enable interrupt */ rt_hw_interrupt_enable(temp);}
由上述源码可见,在rt_schedule_remove_thread函数中,程序对与线程调试器获取最高优先级相关的几个参数做了逆操作.
整个算法过程分析完毕,其实在目前为止,这里并没有对这个位图原理做出解释,个人认为,这并没多大关系,我们只需要知道,正是这么一个操作流程,结合这个位图,才得到一个与时间无关的算法.这个就是rt-thread操作系统线程调试的核心.