读书人

rt-thread线程调试器获取现阶段最高优

发布时间: 2013-02-20 12:23:22 作者: rapoo

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函数中,程序对与线程调试器获取最高优先级相关的几个参数做了逆操作.


6 后记

整个算法过程分析完毕,其实在目前为止,这里并没有对这个位图原理做出解释,个人认为,这并没多大关系,我们只需要知道,正是这么一个操作流程,结合这个位图,才得到一个与时间无关的算法.这个就是rt-thread操作系统线程调试的核心.




 

读书人网 >移动开发

热点推荐