Rt-Thread 移植4--对象容器实现(KF32)

news2024/10/7 0:28:11

1.对象

1,1 什么是对象

所有的数据结构都是对象

1.2代码实现

1.2.1 对象类型枚举定义

rtdef.h 添加rt_object_class_type

enum rt_object_class_type{
	RT_Object_Class_NULL=0,
	RT_Object_Class_Thread ,
	RT_Object_Class_Semaphore,
	RT_Object_Class_Mutex,
	RT_Object_Class_Event,
	RT_Object_Class_MailBox,
	RT_Object_Class_MessageQueue,
	RT_Object_Class_MemHeap,
	RT_Object_Class_MemPool,
	RT_Object_Class_Device,
	RT_Object_Class_Timer,
	RT_Object_Class_Module,
	RT_Object_Class_Unknown,
	RT_Object_Class_Static = 0x80,
};

1.2.2 对象数据类型定义

struct rt_object
{
	char name[RT_NAME_MAX];
	rt_uint8_t type;
	rt_uint8_t flag;
	rt_list_t list;
};
typedef struct rt_object *rt_object_t;

RT_NAME_MAX在rt_config.h中定义,默认为8.

1.2.3 线程控制块中添加对象

struct rt_thread
{
	char name[RT_NAME_MAX];
	rt_uint8_t type;
	rt_uint8_t flag;
	rt_list_t list;
	void        *sp;	          /* 线程栈指针 */
	void        *entry;	          /* 线程入口地址 */
	void        *parameter;	      /* 线程形参 */	
	void        *stack_addr;      /* 线程起始地址 */
	rt_uint32_t stack_size;       /* 线程栈大小,单位为字节 */

3.容器

3.1 容器作用

方便管理,每创建一个对象,如线程就会放到对应的容器里。如finsh组件会获取各个内核对象的状态

3.2 容器实现

代码角度,容器是数组,一个全局变量

3.2.1 容器初始化

redef.h 中

struct rt_object_information{
	enum rt_object_class_type type;
	rt_list_t object_list;
	rt_size_t                 object_size;
};

object.c中

static struct rt_object_information rt_object_container[RT_Object_Info_Unknow]={
	{RT_Object_Class_Thread,_OBJ_CONTAINER_LIST_INIT(RT_Object_Info_Thread),sizeof(struct rt_thread)},
#ifdef RT_USING_SEMAPHORE
	{RT_Object_Class_Semaphore,_OBJ_CONTAINER_LIST_INIT(RT_Object_Info_Semaphore),sizeof(struct rt_semaphore)},
#endif
#ifdef RT_USING_MUTEX
    /* initialize object container - mutex */
    {RT_Object_Class_Mutex, _OBJ_CONTAINER_LIST_INIT(RT_Object_Info_Mutex), sizeof(struct rt_mutex)},
#endif
#ifdef RT_USING_EVENT
    /* initialize object container - event */
    {RT_Object_Class_Event, _OBJ_CONTAINER_LIST_INIT(RT_Object_Info_Event), sizeof(struct rt_event)},
#endif
#ifdef RT_USING_MAILBOX
    /* initialize object container - mailbox */
    {RT_Object_Class_MailBox, _OBJ_CONTAINER_LIST_INIT(RT_Object_Info_MailBox), sizeof(struct rt_mailbox)},
#endif
#ifdef RT_USING_MESSAGEQUEUE
    /* initialize object container - message queue */
    {RT_Object_Class_MessageQueue, _OBJ_CONTAINER_LIST_INIT(RT_Object_Info_MessageQueue), sizeof(struct rt_messagequeue)},
#endif
#ifdef RT_USING_MEMHEAP
    /* initialize object container - memory heap */
    {RT_Object_Class_MemHeap, _OBJ_CONTAINER_LIST_INIT(RT_Object_Info_MemHeap), sizeof(struct rt_memheap)},
#endif
#ifdef RT_USING_MEMPOOL
    /* initialize object container - memory pool */
    {RT_Object_Class_MemPool, _OBJ_CONTAINER_LIST_INIT(RT_Object_Info_MemPool), sizeof(struct rt_mempool)},
#endif
#ifdef RT_USING_DEVICE
    /* initialize object container - device */
    {RT_Object_Class_Device, _OBJ_CONTAINER_LIST_INIT(RT_Object_Info_Device), sizeof(struct rt_device)},
#endif
    /* initialize object container - timer */
    {RT_Object_Class_Timer, _OBJ_CONTAINER_LIST_INIT(RT_Object_Info_Timer), sizeof(struct rt_timer)},
#ifdef RT_USING_MODULE
#endif
};

效果图如下
在这里插入图片描述

容器大小控制如下

enum rt_object_info_type{
	RT_Object_Info_Thread  = 0,
#ifdef RT_USING_SEMAPHORE
	RT_Object_Info_Semaphore,
#endif
#ifdef RT_USING_MUTEX
    RT_Object_Info_Mutex,                              /**< The object is a mutex. */
#endif
#ifdef RT_USING_EVENT
    RT_Object_Info_Event,                              /**< The object is a event. */
#endif
#ifdef RT_USING_MAILBOX
    RT_Object_Info_MailBox,                            /**< The object is a mail box. */
#endif
#ifdef RT_USING_MESSAGEQUEUE
    RT_Object_Info_MessageQueue,                       /**< The object is a message queue. */
#endif
#ifdef RT_USING_MEMHEAP
    RT_Object_Info_MemHeap,                            /**< The object is a memory heap */
#endif
#ifdef RT_USING_MEMPOOL
    RT_Object_Info_MemPool,                            /**< The object is a memory pool. */
#endif
#ifdef RT_USING_DEVICE
    RT_Object_Info_Device,                             /**< The object is a device */
#endif
    RT_Object_Info_Timer,                              /**< The object is a timer. */
#ifdef RT_USING_MODULE
    RT_Object_Info_Module,                             /**< The object is a module. */
#endif
    RT_Object_Info_Unknow,
};

3.2.1 容器接口实现

3.2.1.1 获取类型的对象
struct rt_object_information *rt_object_get_information(enum rt_object_class_type type)
{
	int index;
	for(index = 0; index < RT_Object_Info_Unknow;index++)
	{
		if(rt_object_container[index].type == type)
			return &rt_object_container[index];
	}
	return RT_NULL;
}

3.2.1.2 对象初始化
void rt_object_init(struct rt_object *object,enum rt_object_class_type type, const char *name)
{
	register rt_base_t temp;
	struct rt_object_information *info;
	info = rt_object_get_information(type);
	object->type = type | RT_Object_Class_Static;
	rt_strncpy(object->name,name,RT_NAME_MAX);
	temp = rt_hw_interrupt_disable();
	rt_list_insert_after(&(info->object_list),&(object->list));
	rt_hw_interrupt_enable(temp);
}

效果
在这里插入图片描述

3.2.2thread同步

thread同步

rt_err_t rt_thread_init(struct rt_thread *thread,const char *name,
                        void (*entry)(void *parameter),
                        void             *parameter,
                        void             *stack_start,
                        rt_uint32_t       stack_size,
                        rt_uint8_t priority)
{

	rt_object_init((rt_object_t)thread,RT_Object_Class_Thread,name);
	rt_list_init(&(thread->tlist));

	thread->entry = (void *)entry;
	thread->parameter = parameter;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1089740.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【java学习】JavaBean(28)

文章目录 1. 概念 1. 概念 JavaBean 是一种 Java 语言写成的可重用组件。 所谓 javaBean &#xff0c;是指符合如下标准的 Java 类&#xff1a; (1) 类是公共的 (2) 有一个无参的公共的构造器 (3) 有属性&#xff0c;属性一般是私有的&#xff0c;且有对应的 get 、set 方法 …

cad问题:无法识别的版本,不能读取

cad安装目录或文件名、新建时的文件模板&#xff0c;含有“无”这个字就会出现此问题&#xff0c;只要把 无这个字改成没&#xff0c;即可解决

Kafka进阶

Kafka进阶 Kafka事务 kafka的事务机制是指kafka支持跨多个主题和分区的原子性写入&#xff0c;即在一个事务中发送的所有消息要么全部成功&#xff0c;要么全部失败。 kafka的事务机制涉及到以下几个方面&#xff1a; 事务生产者&#xff08;transactional producer&#x…

【牛客面试必刷TOP101】Day12.BM72 连续子数组的最大和和BM80 买卖股票的最好时机(一)

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;牛客面试必刷TOP101 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&…

StatefulSet 简单实践 Kubernetes

概述 在Kubernetes集群中部署MySQL和Mongodb的StatefulSet服务。 MySQL有官方文档的指引 其他网站博客的指引实现 Mongodb修改operator的Deployment进行简单的实现 MySQL-StatefulSet 参考官方文档&#xff1a;运行一个有状态的应用程序 | Kubernetes 深入剖析Kubernete…

matlab第三方硬件支持包下载和安装

1、在使用matlab内部的附加功能安装时&#xff0c;由于matlab会验证是否正版无法打开 2、在matlab官网直接找到对应的硬件支持包下载&#xff0c;但是是下图的安装程序 可以直接在matlab中跳转到该程序所在的文件夹双击安装&#xff0c;但是安装到最后出错了 3.根据出错时mala…

创邻科技Galaxybase—激活数据要素的核心引擎

10月11日下午&#xff0c;创邻科技创始人张晨博士受杭州电子科技大学邀请&#xff0c;前往杭电校园开展交流分享。交流会中&#xff0c;张晨博士为现场的师生带来一场题为《图数据库——激活数据要素的新基建》的精彩分享&#xff0c;探讨数字经济时代底层技术的创新价值与图技…

CRM系统管理多渠道客户的方法

很多企业同时拥有多个销售渠道&#xff0c;由于客户来自不同的销售渠道&#xff0c;数据非常分散&#xff0c;管理起来费时费力。或许您可以使用CRM客户管理系统来管理不同渠道的客户&#xff0c;下面说说企业常见的销售渠道有哪些&#xff1f;CRM系统如何管理多渠道客户&#…

一招搞定,终止端口号进程

场景&#xff1a;聪明的小明写了个到点执行关机的脚本&#xff0c;再次启动项目时发现端口号占用&#xff0c;操作步骤来了。 步骤1&#xff1a; winr&#xff0c;cmd走起 netstat -ano | findstr "端口号" 步骤2&#xff1a; 查询该进程 tasklist | findstr "P…

苹果macOS Sonoma 14正式版 “黑苹果”且用且珍惜

9月下旬&#xff0c;苹果正式发布了全新的桌面操作系统macOS Sonoma 14&#xff0c;对于一众的“黑苹果”用户来说&#xff0c;这是个让人既兴奋又害怕的消息&#xff0c;兴奋的是又有新系统可以升级了&#xff0c;害怕的是“黑苹果”距离寿终正寝的时间也越来越近了。 所谓的“…

软件测试面试基础篇(含答案)

1、你的测试职业发展是什么&#xff1f; 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前 3 年积累测试经验&#xff0c;按如何做好测试工程师的要点去要求自己&a…

【QT】Ubuntu 交叉编译安装 QT 5.12.7 源码

目录 1、下载 QT 源码包 2、搭建安装环境(下载依赖库) 3、创建QT源码编译脚本 4、运行编译脚本 1、下载 QT 源码包 QT5.12.7源码下载地址: download | QT 5.12.7 选择任意一种下载即可&#xff0c;适用于 Windows 和 Linux 环境 这里选择的是.tar.xz 类型&#xff0c;上…

CustomNavBar 自定义导航栏视图

1. 创建偏好设置键 CustomNavBarTitlePreferenceKey.swift import Foundation import SwiftUI//State private var showBackButton: Bool true //State private var title: String "Title" //"" //State private var subtitle: String? "SubTitl…

树莓派部署.net core网站程序

1、发布你的项目 使用mobaxterm上传程序 回到mobaxterm,f进入目录输入&#xff1a; cd webpublish 运行程序&#xff1a;dotnet WebApplication1.dll 访问地址为&#xff1a;http://localhost:5000,尝访问如下&#xff1a; 已经出现 返回的json&#xff0c;证明是可以访问的…

阿里云服务器通用型规格族20个实例规格性能特点和适用场景汇总

阿里云服务器ECS通用型规格族属于独享型云服务器&#xff0c;实例采用固定CPU调度模式&#xff0c;实例的每个CPU绑定到一个物理CPU超线程&#xff0c;实例间无CPU资源争抢&#xff0c;实例计算性能稳定且有严格的SLA保证&#xff0c;在性能上会更加稳定&#xff0c;高负载情况…

AI:38-基于深度学习的抽烟行为检测

随着人工智能的迅猛发展,它在各个领域展现出了广泛的应用潜力。其中,基于深度学习的抽烟行为检测技术引起了人们的极大兴趣。这项技术利用计算机视觉和深度学习算法,能够自动检测和监测人们的抽烟行为,为烟草控制和公共卫生提供了新的手段。本文将深入探讨基于深度学习的抽…

01-网络篇-网络分层和常见网络协议

常使用的网络有广域网&#xff08;WAN&#xff09;、城域网、局域网&#xff08;LAN&#xff09;&#xff0c;一般我们遇到的场景是广域网和局域网&#xff0c;广域网就是常说的外网&#xff0c;而局域网一般用于学校、公司等场合。在家庭路由器中对应WAN口和LAN口。网络是极为…

Windows 定时备份 pg 数据库,定时删除

目录 1. 写个备份脚本2. Windows 添加定时任务3. 使用备份的 SQL 还原数据 1. 写个备份脚本 备份数据库脚本&#xff1a; pgBacks.bat ECHO OFF :: 用于启用扩展功能。在使用enableextensions选项后&#xff0c;批处理脚本可以使用扩展命令和特性 setlocal enableextensions…

Sprint framework Day08:Spring的@Autowired注解

前言 当使用注解和 XML 配置结合时&#xff0c;可以使用注解 Autowired、Qualifier 和 Primary 来实现自动装配并进行依赖注入。 一、了解 Autowired、Qualifier 和 Primary 注解 Autowired 注解&#xff1a;用于自动装配依赖。在需要进行依赖注入的地方&#xff0c;添加 Auto…

Jetpack:006-如何使用输入框

文章目录 1. 概念介绍2. 使用方法2.1 TextField2.2 OutlinedTextField 3. 示例代码4. 内容总结 我们在上一章回中介绍了Jetpack中文本组件扩展相关的内容&#xff0c;本章回中主要介绍输入框组件。闲话休提&#xff0c;让我们一起Talk Android Jetpack吧&#xff01; 1. 概念介…