如何从rtthread_startup看RT-Thread 内核数据结构

这期内容当中小编将会给大家带来有关如何从rtthread_startup看RT-Thread 内核数据结构,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

下面不分析 RT-Thread 中任务调度,任务管理等实现,只以 RT-Thread 中链表为线索,整理出整个 RT-Thread 重要的数据结构及其关联,使读者分析内核时有个大体的认识,也欢迎大家指正错误。

先看看 rtthread_startup:

开始分析之前先做几个说明,RT-Thread 中用的最多的是双向循环链表,而且是插入式链表,这样的链表只起链接作用,本身不携带数据,因此可以插入到各种自定义的结构体中,这些不同的结构体也能灵活的连接起来。这也是个人最喜欢的地方,对比 ucos 一个结构体一个链表的臃肿设计,RT-Thread 这个设计方便太多,链表有了统一的操作,代码读起来也舒服的多。对于这种链表最重要的一个宏定义就是#define rt_list_entry(node, type, member) /

    ((type *)((char *)(node) – (unsigned long)(&((type *)0)->member)))

论坛和网上都有分析这个理解了,再理解链表操作就没难度了。

我们重点看以下几个:

rt_system_object_init();

这个函数现在为空,对应的功能如下:

struct rt_object_information rt_object_container[RT_Object_Class_Unknown];

这个结构管理着 RT-Thread 系统中所有注册的组件,从这个结构中我们可以几乎得到系统中我们想要的一切信息,finsh里的如list_xxx等都是从这个结构里提取相应的信息。

示意图如下:

如何从rtthread_startup看RT-Thread 内核数据结构

 

rt_system_timer_init();

这个函数对应的功能实际是初始化rt_timer_list链表,管理整个系统存在的timer。

这里不具体分析源码实现,只给出示意图:

如何从rtthread_startup看RT-Thread 内核数据结构

 

对于任务数小于32的线程, 所有就绪任务通过rt_list_t rt_thread_priority_table[RT_THREAD_PRIORITY_MAX]这个数组标记。 利用rt_thread结构中

的嵌入链表结构将同优先级线程组成循环链表。 不同优先级线程各占一个数组元素。

注意一个变量rt_current_thread = RT_NULL;之后会再看到它。

rt_application_init();

我们的应用程序就是在这里面设置了,不对这个过程说明,只看看rt_thread_create这个函数完成了哪些数据结构的关联。

rt_thread_create

–>rt_object_allocate

–>information = &rt_object_container[type];

    rt_list_insert_after(&(information->object_list), &(object->list));至此线程出现在内核的视野

–>_rt_thread_init

–>rt_object_init((rt_object_t)timer, RT_Object_Class_Timer, name);线程内置的timer结构加入          rt_object_container

     _rt_timer_init(timer, timeout, parameter, time, flag);

 –>rt_list_init(&(timer->row[i]));timer加入rt_timer_list链表。

rt_thread_idle_init();

如何从rtthread_startup看RT-Thread 内核数据结构

在应用中,我们可以设置rt_thread_idle_hook ,完成CPU利用率统计,CPU进入低功耗模式等功能。

在rt_thread_idle_excute中又涉及到一个全局变量rt_thread_defunct,当删除任务时,被删除的任务控制块就会被连接到这个链表上。在空闲任务中完成对资源的回收,提高系统性能。

rt_system_scheduler_start();

从这个函数开始系统就正式开始运行了,首先获得就绪的最高优先级任务,然后赋值给rt_current_thread,最后触发软中断,切换到相应的任务栈去执行任务了。

to_thread = rt_list_entry(rt_thread_priority_table[highest_ready_priority].next,

                              struct rt_thread,

                              tlist);

    rt_current_thread = to_thread;

    rt_hw_context_switch_to((rt_uint32_t)&to_thread->sp);

每个rt_thread中有两个rt_list_t类型元素,其中rt_object parent 中的list作为组织内核对象用。 而tlist作为链接到rt_timer_list等待链表上使用, 也可用作删除任务后加入到空闲处理链rt_thread_defunct上, 亦可链接到IPC中suspend链表上。

如何从rtthread_startup看RT-Thread 内核数据结构

上述就是小编为大家分享的如何从rtthread_startup看RT-Thread 内核数据结构了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/219639.html

(0)
上一篇 2022年1月2日
下一篇 2022年1月2日

相关推荐

发表回复

登录后才能评论