使用STM32编写一个简单的RTOS:2.对象管理_#define _obj_container_list_init(c) \ {&(rt_object-程序员宅基地

技术标签: 使用STM32编写一个简单的RTOS  RT-Thread  

参考资料:RTT官网文档
关键字:分析RT-Thread源码、stm32、RTOS、对象管理器。

内核对象管理架构

RT-Thread 采用内核对象管理系统来访问 / 管理所有内核对象,内核对象包含了内核中绝大部分设施,这些内核对象可以是静态分配的静态对象,也可以是从系统内存堆中分配的动态对象。

通过这种内核对象的设计方式,RT-Thread 做到了不依赖于具体的内存分配方式,系统的灵活性得到极大的提高。

RT-Thread 内核对象包括:线程,信号量,互斥量,事件,邮箱,消息队列和定时器,内存池,设备驱动等。对象容器中包含了每类内核对象的信息,包括对象类型,大小等。对象容器给每类内核对象分配了一个链表,所有的内核对象都被链接到该链表上,如图 RT-Thread 的内核对象容器及链表如下图所示:
在这里插入图片描述
下图则显示了 RT-Thread 中各类内核对象的派生和继承关系。对于每一种具体内核对象和对象控制块,除了基本结构外,还有自己的扩展属性(私有属性),例如,对于线程控制块,在基类对象基础上进行扩展,增加了线程状态、优先级等属性。这些属性在基类对象的操作中不会用到,只有在与具体线程相关的操作中才会使用。因此从面向对象的观点,可以认为每一种具体对象是抽象对象的派生,继承了基本对象的属性并在此基础上扩展了与自己相关的属性。
在这里插入图片描述

在对象管理模块中,定义了通用的数据结构,用来保存各种对象的共同属性,各种具体对象只需要在此基础上加上自己的某些特别的属性,就可以清楚的表示自己的特征。

这种设计方法的优点有:

1、提高了系统的可重用性和扩展性,增加新的对象类别很容易,只需要继承通用对象的属性再加少量扩展即可。
2、提供统一的对象操作方式,简化了各种具体对象的操作,提高了系统的可靠性。

上图中由对象控制块 rt_object 派生出来的有:线程对象、内存池对象、定时器对象、设备对象和 IPC 对象(IPC:Inter-Process Communication,进程间通信。在 RT-Thread 实时操作系统中,IPC 对象的作用是进行线程间同步与通信);由 IPC 对象派生出信号量、互斥量、事件、邮箱与消息队列、信号等对象。

代码分析

内核对象容器的数据结构:

struct rt_object_information
{
/* 对象类型 /
enum rt_object_class_type type;
/
对象链表 /
rt_list_t object_list;
/
对象大小 */
rt_size_t object_size;
};
一类对象由一个 rt_object_information 结构体来管理,每一个这类对象的具体实例都通过链表的形式挂接在 object_list 上。而这一类对象的内存块尺寸由 object_size 标识出来(每一类对象的具体实例,他们占有的内存块大小都是相同的)。

官网文档已经写的比较详细了,这里就直接复制了。下面就以线程类型直接分析代码了。

#define _OBJ_CONTAINER_LIST_INIT(c)     \
    {&(rt_object_container[c].object_list), &(rt_object_container[c].object_list)}
struct rt_object_information rt_object_container[RT_Object_Class_Unknown] =
{
    /* initialize object container - thread */
    {RT_Object_Class_Thread, _OBJ_CONTAINER_LIST_INIT(RT_Object_Class_Thread), sizeof(struct rt_thread)},
...
}

在全局的对象容器中定义时就对其初始化了,_OBJ_CONTAINER_LIST_INIT这个宏里面的操作是将object_list的prev和next指向了自身。这里我们以 rt_object_init为例,和rt_object_allocate功能一样,只不过一个是静态一个是动态分配内存的。

rt_err_t rt_thread_init(struct rt_thread *thread, ...)
{
	...
	
	/* init thread object */
	rt_object_init((rt_object_t)thread, RT_Object_Class_Thread, name);
	...
}

void rt_object_init(struct rt_object         *object,
                    enum rt_object_class_type type,
                    const char               *name)
{
    ...
    information = &rt_object_container[type];
    ...

    /* insert object into information object list */
    rt_list_insert_after(&(information->object_list), &(object->list));
    ...
}

rt_object_init的作用就是在容器中找到其类型的头节点,通过rt_list_insert_after将线程插入对象容器中。
在这里插入图片描述

对象容器的代码比较少也比较简单,用对象容器主要是方便管理和查找同一类型的对象。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u012220052/article/details/91458892

智能推荐

idea maven 仓库中有jar包, 依赖却爆红。_有jar包,还是报红-程序员宅基地

文章浏览阅读2w次,点赞20次,收藏42次。背景今天开发新的功能,从GitHub上拉取了模块代码,切换指定分支后,设置了maven配置和jdk 发现 maven projects 中的Dependencies 依然爆红,但是仓库却是有依赖jar包,项目build通过。这里记录一下解决的方法。工具版本从GitHub上拉取代码设置maven 和jdk后, maven projects 中的Dependencies 依然爆红,如下图。..._有jar包,还是报红

TiDB集群部署最细化教程-亲测有效-程序员宅基地

文章浏览阅读1.1k次。TiUP 支持管理多个 TiDB 集群,该命令会输出当前通过 TiUP cluster 管理的所有集群信息,包括集群名称、部署用户、版本、密钥信息等。安全启动是 TiUP cluster 从 v1.9.0 起引入的一种新的启动方式,采用该方式启动数据库可以提高数据库安全性。此时,应先安装其中一个服务,并保证它可以自动启动,默认使用。安全启动后,TiUP 会自动生成 TiDB root 用户的密码,并在命令行界面返回密码。执行如下命令,生成集群初始化配置文件:该文件是默认的配置文件,可根据需要自定配置内容。_tidb集群部署

DirectShow技术说明_directshow imediacontrol run pause 太耗时-程序员宅基地

文章浏览阅读743次。1 DirectShow的使用:(1):头文件和库要包含dshow.h头文件,并且链接Strmiids.lib和Quartz.lib库文件。(2):初始化DirectShow程序开始的时候必须要初始化COM,包括CoInitialize和CoUninitialize。(3):创建filter graph 每一个DirectShow程序必须创建一个filter_directshow imediacontrol run pause 太耗时

Echarts(react)实现中国地图的引入以及使用_echarts-for-react maptype: 'china',-程序员宅基地

文章浏览阅读5.1k次。事实上,只需要将Echarts官网提供的series[ { mapType: ‘china’} ]就可以简单实现import React from "react";import EChartBase from "./EChartBase";import echarts from 'echarts/lib/echarts';import 'echarts/map/js/china';import geoJson from 'echarts/map/json/china.json';class_echarts-for-react maptype: 'china',

CGB2109-Day02-程序员宅基地

文章浏览阅读9.6k次,点赞14次,收藏22次。1. 学习Spring框架

多线程面试题整合_北辰德笔试题-程序员宅基地

文章浏览阅读184次。(1)Java编程写一个会导致死锁的程序package 设计模式.Single_Thread_Execution.多线程面试题;import java.util.concurrent.TimeUnit;/** * @author Heian * @time 19/01/23 10:42 * @copyright(C) 2019 深圳市北辰德科技股份有限公司 * 用途:手写一个..._北辰德笔试题

随便推点

`load_weights` requires h5py报错解决_importerror: `load_weights` requires h5py.-程序员宅基地

文章浏览阅读6.1k次,点赞4次,收藏4次。今天在pycharm上跑神经网络时在保存模型读入权重时报错:loaded_model = model_from_json(loaded_model_json) # 读入网络结构loaded_model.load_weights("model.h5") # 读入权重ImportError: `load_weights` requires h5py.对于这个问题,网友们给出的回答..._importerror: `load_weights` requires h5py.

使用Pythonldap3进行LDAP开发_python ldap-程序员宅基地

文章浏览阅读1.2k次。Pythonldap3是Python 3的LDAP接口库,Pythonldap3实现了RFC4511定义的LDAP协议的所有操作和功能,它具有易学易用、高性能的特点,能够轻松地连接LDAP服务和对LDAP目录执行增、删、改、查等操作。_python ldap

macOS m1---jenkins---系统配置_m1配置jerkings-程序员宅基地

文章浏览阅读414次。填写自己的邮箱和授权码 ,点击应用,点击保存。_m1配置jerkings

bcdedit-程序员宅基地

文章浏览阅读1.5k次。bcdedit_bcdedit

java日期工具类、日期格式校验、日期格式化_java校验日期格式-程序员宅基地

文章浏览阅读6.8k次,点赞4次,收藏22次。java项目中经常会使用到对日期进行格式校验、格式化日期、LocalDate与Date互转等等,以下整理一份经常会使用到的日期操作相关的方法。_java校验日期格式

【TCP/IP】 以太网流量控制------pause流控_流控 pause 发送时机 计算-程序员宅基地

文章浏览阅读7.4k次,点赞10次,收藏94次。文章目录一、以太网的流量控制二、pause流控的原理和实现1.pause流控原理2.pause消息格式3.pause流控处理逻辑4.pause流控芯片上的实现三、pause流控的作用与副作用1.pause流控的作用2.pause流控的副作用四、pause流控对性能的影响分析1.性能影响2.风险评估最近定位了一个pause流控引发的产品问题,对pause流控进行了详细的研究,由于网上关于pause流控的相关资料非常少,这里将所有pause流控相关的知识总结整理一下,供大家参考。一、以太网的流量控制以_流控 pause 发送时机 计算