uMCN支持不同数据类型

news2024/10/6 11:21:56

1. 数据大小的动态配置

在uMCN中,数据的类型和大小是通过消息中心(McnHub)的结构体定义来支持的。特别是,通过McnHub结构体中的 obj_size 字段动态确定数据的大小,而不是固定使用某种数据类型。这使得uMCN能够处理不同类型和大小的数据。

struct mcn_hub {
    const char* obj_name;   // 主题名
    const uint32_t obj_size;  // 主题数据大小
    void* pdata;           // 存储发布的数据
    ...
};
  • obj_size: 当一个主题(Topic)在系统中被定义时,obj_size 通过MCN_DEFINE宏传递给消息中心,用来指定该主题的数据大小。
  • pdata: 数据的存储通过指针 pdata 来实现,它是一个通用指针(void*),指向发布者提供的数据。因此,无论数据是整数、浮点数、结构体,甚至是自定义的数据类型,uMCN都可以通过 pdata 来存储和传递这些数据。

2. 通过内存动态分配支持不同数据类型

在注册主题(Advertise)时,uMCN会为数据分配所需大小的内存,并将其存储在pdata中。由于 pdata 是一个通用指针,它能够指向任何类型的数据。

fmt_err_t mcn_advertise(McnHub_t hub, int (*echo)(void* parameter)) {
    ...
    pdata = MCN_MALLOC(hub->obj_size);  // 根据 obj_size 动态分配内存
    ...
}

mcn_advertise函数中,uMCN会根据不同主题的数据大小,通过 MCN_MALLOC 函数分配适量的内存来保存发布的数据。因此,发布者可以使用不同大小和类型的数据发布到同一消息中心中,而不会引发类型问题。

3. 数据发布时的类型透明性

数据发布的核心函数mcn_publish通过 memcpy 将数据复制到 pdata 中,这意味着发布者可以发布任何类型的数据,只要数据大小与主题的 obj_size 相匹配即可。

fmt_err_t mcn_publish(McnHub_t hub, const void* data) {
    ...
    memcpy(hub->pdata, data, hub->obj_size);  // 将不同类型的数据复制到消息中心
    ...
}

在此函数中,data 是一个通用指针(const void*),它可以指向任何类型的数据。发布时,uMCN通过 memcpy 将数据复制到 pdata 中,而不关心数据的实际类型。只要数据的大小(obj_size)是正确的,uMCN就能处理该数据。

4. 数据订阅时的类型透明性

在订阅者从主题获取数据时,uMCN通过类似的方式确保了数据类型的透明性。订阅者调用 mcn_copy 函数将数据从消息中心复制到订阅者的缓冲区中。

fmt_err_t mcn_copy(McnHub_t hub, McnNode_t node_t, void* buffer) {
    ...
    memcpy(buffer, hub->pdata, hub->obj_size);  // 将数据复制到订阅者的缓冲区
    ...
}

buffer: 是一个通用指针,订阅者在订阅时需要为接收到的数据提供足够的内存。mcn_copy函数将数据从消息中心复制到订阅者的缓冲区中,而不关心数据的具体类型。

5. 主题的声明与定义

uMCN使用 MCN_DECLAREMCN_DEFINE 宏来定义主题。在定义主题时,开发者可以指定该主题的对象大小,即数据类型的大小。

MCN_DEFINE(topic_name, sizeof(data_type));

例如:

  • 如果数据类型是一个int类型,定义如下:
MCN_DEFINE(topic_int, sizeof(int));
  • 如果数据类型是一个struct,定义如下:
typedef struct {
    int id;
    float value;
} my_data_t;

MCN_DEFINE(topic_struct, sizeof(my_data_t));

6. 灵活的回调机制

uMCN支持订阅者通过回调函数来处理接收到的不同类型的数据。每个订阅者在订阅主题时,可以指定一个回调函数,这个回调函数会在数据更新时被调用。

McnNode_t mcn_subscribe(McnHub_t hub, void (*pub_cb)(void* parameter)) {
    ...
    node->pub_cb = pub_cb;  // 注册回调函数
    ...
}

回调函数的参数 parameter 是一个通用指针,因此可以传递任何类型的数据,订阅者可以根据具体的主题进行类型转换和处理。

总结

uMCN通过以下方式支持不同的数据类型:

  1. 动态确定数据大小:通过obj_size字段和void*通用指针支持不同的数据类型。
  2. 内存动态分配:根据数据大小动态分配内存,确保系统能够处理多种类型的数据。
  3. 类型透明性:使用memcpy和通用指针,确保数据发布和订阅过程中数据类型的透明性。
  4. 灵活的主题定义:开发者可以根据需要定义不同大小的数据主题,系统可以处理结构体、基本数据类型等多种数据类型。

这种设计使得uMCN非常灵活,可以广泛应用于嵌入式系统中,处理各种类型的传感器数据、控制信息等。

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

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

相关文章

STM32中断——外部中断

目录 一、概述 二、外部中断(Extern Interrupt简称EXTI) 三、实例-对射式红外传感器 1、配置中断: 2 、完整代码 一、概述 中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当…

【WebGis开发 - Cesium】三维可视化项目教程---视点管理

目录 引言一、基础功能探索1. 镜头视角获取2. 镜头视角移动 二、进一步封装代码1. 封装hooks函数2. 看下效果3. 如何使用该hooks函数 三、总结 引言 本教程主要是围绕Cesium这一开源三维框架开展的可视化项目教程。总结一下相关从业经验,如果有什么疑问或更好的见解…

SQL自用小结

推荐一下这个知识点总结 《数据库系统概论》第五版 学习笔记总目录 1. SQL概述 SQL(Structured Query Language,结构化查询语言)是一种用于定义、查询、更新和控制关系数据库的标准化语言。 它包含了数据定义语言(DDL&#xff0…

(19)MATLAB使用Nakagami 分布对象生成Nakagami-m分布

文章目录 前言一、生成Nakagami分布随机变量的MATLAB代码1.仿真代码2.运行结果 二、传输信号经过衰落信道 前言 MATLAB在R2013a版本中开始引入Nakagami分布对象,可以用来生成Nakagami随机变量。下面给出一个使用实例,用于生成服从Nakagami 分布的随机变…

实战五:模拟10086查询功能

问题描述: 输入1,显示当前余额;输入2,显示当前的剩余流量,单位为G;输入3,显示当前的剩余通话,单位为分钟;输入0,退出自助查询系统。 编程: 1.方法一: # (1)初始化变量 answer y…

Java.数据结构.HashMap

目录 1基本概念 2数据结构 3常用操作 3.1 put(K key, V value):插入键值对。 3.2 get(Object key):根据键获取值。 3.3 remove(Object key):移除键值对。 3.4 containsKey(Object key):判断Map中是否包含指定的键。 3.5 c…

【Orange Pi 5 嵌入式应用编程】-用户空间SPI通信

用户空间SPI通信 文章目录 用户空间SPI通信1、理解SPI通信协议1.1 什么是SPI通信协议1.2 SPI如何工作?1.3 SPI数据传输步骤1.4 SPI的优缺点2、嵌入式Linux系统中的SPI通信3、Orange Pi 5 配置与编程3.1 Orange Pi 5开发板配置SPI3.2 SPI编程实现3.2.1 SPI用户空间函数定义3.2.…

Kafka 快速入门

目录 介绍 KafKa 相关术语 ​编辑 Kafka的工作流程 生产者向kafka发送数据的流程 Kafka选择分区的模式 Kafka选择分区的模式 数据消费 kafka的文件存储机制 topic、partition和segment 存储和查找message的过程 数据写入过程 数据查找过程 注意事项 kafka管理UI …

基于Springboot+Vue的高校学术交流平台 (含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统中…

论文阅读笔记-LogME: Practical Assessment of Pre-trained Models for Transfer Learning

前言 在NLP领域,预训练模型(准确的说应该是预训练语言模型)似乎已经成为各大任务必备的模块了,经常有看到文章称后BERT时代或后XXX时代,分析对比了许多主流模型的优缺点,这些相对而言有些停留在理论层面,可是有时候对于手上正在解决的任务,要用到预训练语言模型时,面…

Spring Boot项目的创建与使用

1.通过IDE创建Spring Boot项目 2.目录结构 3.新建TestController控制器 Controller public class TestController {RequestMapping("/test")public ModelAndView test(RequestParam(name "name", defaultValue "刘德华") String name){ModelA…

Pikachu-unsafe upfileupload-getimagesize

什么是getimagesize()? getimagesize()是PHP中用于获取图像的大小和格式的函数。它可以返回一个包含图像的宽度、高度、类型和MIME类型的数组。 由于返回的这个类型可以被伪造,如果用这个函数来获取图片类型,从而判断是否时图片的话&#xff…

matplotlib字体警告

import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] "Arial" plt.rcParams["figure.figsize"] (3, 3) plt.rcParams[font.size] 12sc.pl.umap(adata_concat, color[batch_name, Ground Truth, mclust], ncols3, wspace0.5, showTrue)结果如…

谷歌 DeepMind 发布 AlphaChip:AI 加速芯片设计,效率提升惊人!

近日,谷歌 DeepMind 公布了其最新的 AI 系统 ——AlphaChip。这一系统致力于加速和优化计算机芯片的开发,AlphaChip 所设计的芯片布局已经在谷歌的 AI 加速器中得到应用。 AlphaChip 的工作原理类似于我们之前所听说的 AlphaGo 和 AlphaZero&#xff0c…

NASA:北极植被地块 ATLAS 项目 北坡和苏厄德半岛,明尼苏达州,1998-2000 年

目录 简介 摘要 代码 引用 网址推荐 0代码在线构建地图应用 机器学习 Arctic Vegetation Plots ATLAS Project North Slope and Seward Peninsula, AK, 1998-2000 简介 文档修订日期:2018-12-31 数据集版本:1 本数据集提供了在北极陆地-大气系统…

模拟算法(5)_数青蛙

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 模拟算法(5)_数青蛙 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 1. 题目链接…

Java项目实战II基于Java+Spring Boot+MySQL的房产销售系统(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者 一、前言 随着房地产市场的蓬勃发展,房产销售业务日益复杂,传统的手工管理方式已难以满…

旅游平台|智慧旅游平台|基于java的智慧旅游平台设计与实现(源码+数据库+文档)

智慧旅游平台 目录 基于java的智慧旅游平台设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|毕设布道师,阿里云开发…

[C++]使用纯opencv部署yolov11-pose姿态估计onnx模型

【算法介绍】 使用纯OpenCV部署YOLOv11-Pose姿态估计ONNX模型是一项具有挑战性的任务,因为YOLOv11通常是用PyTorch等深度学习框架实现的,而OpenCV本身并不直接支持加载和运行PyTorch模型。然而,可以通过一些间接的方法来实现这一目标&#x…

打造银行智能营销助手:大模型助力精准营销

在金融科技快速发展的时代,银行的业务模式和客户需求都发生了巨大变化。为了应对日益激烈的市场竞争,银行必须依托先进技术,提升客户服务水平和营销效率。银行智能营销助手应运而生,它通过结合知识图谱和大模型(LLM&am…