0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

立创·梁山派开发板-21年电赛F题-送药小车数据的发布与订阅

jf_31863339 来源:jf_31863339 作者:jf_31863339 2023-08-07 09:55 次阅读

送药小车代码仓库:https://gitee.com/lcsc/medical_car

送药小车数据的发布与订阅

既然使用了RTOS,就不能像以前裸机一样全局变量满天飞了(当然裸机也不能全局变量满天飞)。

在实时操作系统(RTOS)中,不推荐或不建议使用全局变量来传递信息的原因主要有以下几点:

竞争条件:在多任务环境下,全局变量会面临竞争条件的问题。当多个任务同时读写同一个全局变量时,会导致数据的不一致性和错误的结果。这是因为任务的执行是并发的,无法控制它们的执行顺序。

数据共享和保护:全局变量被所有任务共享,这意味着多个任务可以同时访问和修改该变量。如果没有正确的数据保护机制,可能会导致数据损坏或冲突。

可维护性和调试困难:使用全局变量传递信息可能导致代码的可维护性和调试的困难。由于全局变量可以被任何任务修改,追踪问题的根源和调试错误可能会变得更加困难。

为了避免上述问题,RTOS提供了一些机制来进行任务间的通信和数据传递,例如:

消息队列:任务可以通过消息队列来发送和接收消息。每个任务有自己的私有消息队列,通过发送和接收消息来进行通信,避免了全局变量的竞争条件和数据共享问题。

信号量:信号量可以用于同步任务的执行和共享资源的访问。任务可以通过申请和释放信号量来控制对共享资源的访问,并确保任务之间的互斥性和同步性。

事件标志组:事件标志组可以用于任务之间的通知和事件触发。一个任务可以等待一个或多个事件标志的状态变化,并在事件发生时被唤醒执行相应的操作。

通过使用这些RTOS提供的通信机制,可以更安全地在任务之间传递信息,避免竞争条件和数据共享问题,并提高代码的可维护性和调试效率。

在送药小车这个工程中采用RT-Thread软件包uMCN,uMCN (Micro Multi-Communication Node) 提供了一种基于发布/订阅模式的安全跨线程/进程的通信方式。在系统中,uMCN 被广泛应用于任务和模块间的数据通信。使用发布-订阅(Publish-Subscribe)机制可以提供更灵活和高效的任务间通信方式,支持一对一、一对多、多对一和多对多的通信模式。这种机制可以解决使用全局变量传递信息可能带来的竞争条件和数据共享问题。

发布-订阅机制基于事件驱动的思想,其中包含两个角色:发布者(Publisher)和订阅者(Subscriber)。发布者负责发布事件或消息,而订阅者则注册对感兴趣的事件或消息进行订阅。他提供了一种松散耦合的通信方式,允许任务或模块之间通过发布和订阅消息来进行通信,而不需要直接知道彼此的存在。

在使用发布-订阅模式获取数据时,通常涉及以下角色和操作:

发布者(Publisher):负责生成和发布数据或事件。发布者将数据发送到一个或多个特定的主题(Topic),而不关心具体的订阅者。

订阅者(Subscriber):订阅者对特定的主题感兴趣,并通过订阅该主题来接收与之相关的数据或事件。

主题(Topic):主题是数据或事件的分类或标识符,发布者根据主题将数据发送到相应的通道,而订阅者根据主题来选择订阅的数据源。

使用发布-订阅模式获取数据的好处在于,系统中的任务或模块之间解耦合,发布者和订阅者之间不直接依赖于彼此的存在,从而提高了系统的可扩展性和灵活性。此外,发布-订阅模式还能够支持多对多的通信,允许多个订阅者同时接收相同的数据或事件,实现了信息的分发和共享。

他的优势如下:

松耦合性:发布-订阅机制使任务之间的通信更加松耦合。发布者不需要直接知道订阅者的存在,也不需要关心具体的订阅者数量和位置。订阅者只需要订阅感兴趣的事件或消息,从而实现任务之间的解耦。

灵活性:发布-订阅机制支持多对多的通信模式,一个发布者可以有多个订阅者,一个订阅者也可以订阅多个发布者的事件或消息。这种灵活性使得任务之间可以方便地建立复杂的通信关系。

扩展性:通过发布-订阅机制,可以方便地扩展系统,添加新的发布者或订阅者,而不需要修改现有的任务逻辑。这种扩展性使得系统更具可维护性和可扩展性。


将各个数据发布,并对接上echo输出函数后,就可以在RT-Thread的Finsh控制台获取到数据信息了(下面是通过uMCN获取电机编码器1的数据):

wKgaomTQTyOAbduUAAMQGtcNig4218.jpg

具体使用参考uMCN的仓库

添加新主题

为了添加新的主题 (topic),你需要先创建一个主题内容。例如:

typedef struct {
        rt_uint32_t a;
        float b;
        int8_t c[4];
} data_content;

uMCN对主题内容的长度和类型没有限制,所以理论上可以用来传输任何类型的消息。

然后你需要使用宏 MCN_DEFINE(name, size) 来定义主题。一般在发布主题的源文件的顶部定义主题。例如:

MCN_DEFINE(my_topic, sizeof(data_content));

uMCN 支持一个主题拥有多个发布者和订阅者。注意同一个主题名字不同被重复定义,不然编译器会报错。

下一步就是使用 mcn_advertise() 来注册主题。例如:

mcn_advertise(MCN_ID(my_topic), my_topic_echo);

MCN_ID() 宏根据主题名获得枢纽节点。my_topic_echo 是一个回调函数,用来打印主题的数据。

static int my_topic_echo(void* param)
{
        data_content data;
        if(mcn_copy_from_hub((McnHub*)param, &data) == FMT_EOK){
                printf("a:%d b:%f c:%c %c %c %cn", data.a, data.b, data.c[0], data.c[1], data.c[2], data.c[3]);
        return 0;
        }
        return -1;
}

发布主题

可以在系统的任意位置使用函数 mcn_publish() 来发布一个主题。例如:

data_content my_data = {50, -2.0, {1,2,3,4}};
mcn_publish(MCN_ID(my_topic), &my_data);

审核编辑 黄宇
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    7002

    浏览量

    88943
  • RTOS
    +关注

    关注

    22

    文章

    811

    浏览量

    119595
  • 开发板
    +关注

    关注

    25

    文章

    5032

    浏览量

    97375
收藏 人收藏

    评论

    相关推荐

    梁山的华秋DFM解析讲解(上)

    可制造性设计(DFM)就是从产品开发设计时起,就考虑到可制造性和可测试性,使设计和制造之间紧密联系,实现从设计到制造一次成功的目的。这是保证PCB设计质量的最有效方法。基于华秋DFM来看一下开源
    的头像 发表于 12-12 09:07 3950次阅读
    <b class='flag-5'>立</b><b class='flag-5'>创</b><b class='flag-5'>梁山</b><b class='flag-5'>派</b>的华秋DFM解析讲解(上)

    ·梁山开发板-21F-送药小车-K210更换固件-运行基础颜色识别例程

    K210更换固件,他的IDE叫CanMV,看起来应该是官方合作出品的。但是实际使用的时候发现他里面的函数都比较老旧,连接IDE的时候经常性出现连不上或者连上很久之后才有反应。而且对机器视觉的适配没有Maixpy好,所以开始之前我们先给这个K210更换一下固件。
    的头像 发表于 07-28 11:27 1471次阅读
    <b class='flag-5'>立</b><b class='flag-5'>创</b>·<b class='flag-5'>梁山</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b>-<b class='flag-5'>21</b><b class='flag-5'>年</b><b class='flag-5'>电</b><b class='flag-5'>赛</b><b class='flag-5'>F</b><b class='flag-5'>题</b>-<b class='flag-5'>送药</b><b class='flag-5'>小车</b>-K210更换固件-运行基础颜色识别例程

    ·梁山开发板-21F-送药小车-K210的KPU数字识别训练

    210自带 KPU(通用的神经网络处理器),非常适合用来作数字识别。要采集的数据集图像尺寸为 224*224(这是目前最常用的网络数据大小),为了让结果更准确,所以要训练的数据集要尽可能多,每种
    的头像 发表于 07-31 10:29 1176次阅读
    <b class='flag-5'>立</b><b class='flag-5'>创</b>·<b class='flag-5'>梁山</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b>-<b class='flag-5'>21</b><b class='flag-5'>年</b><b class='flag-5'>电</b><b class='flag-5'>赛</b><b class='flag-5'>F</b><b class='flag-5'>题</b>-<b class='flag-5'>送药</b><b class='flag-5'>小车</b>-K210的KPU数字识别训练

    ·梁山开发板-21F-送药小车-K210功能实现代码讲解

    关键的注释都添加了,可以帮助理解代码,这段代码同时实现了寻红线和数字识别,但是还做不到同时运行,在寻红线的时候没法数字识别,这两个状态之间的切换可以通过长按K210上的用户按键或者由梁山派来控制
    的头像 发表于 08-01 09:49 1152次阅读

    开发板-21F-送药小车-小车寻红线环的调试与实现

    PID控制来说,测量值是红线相较屏幕中线的偏移,目标值是想让红线偏移为0,输出值是电机的速度。 根据14_梁山与K210串口通信协议框架搭建.md文档我们的
    的头像 发表于 08-03 10:10 1360次阅读

    ·梁山开发板-21F-送药小车实现思路

    基本要求 1. 根据走廊上的标识信息自动识别,寻径将药品送到指定病房,投影要在门口区域内, 2. 到了指定病房后,点亮红色指示灯,等待卸载药品。 3. 人工卸掉药品后,小车自动熄灭红色指示灯,开始返回。 4. 自动返回药房,点亮绿色指示灯。
    的头像 发表于 08-08 09:44 892次阅读
    <b class='flag-5'>立</b><b class='flag-5'>创</b>·<b class='flag-5'>梁山</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b>-<b class='flag-5'>21</b><b class='flag-5'>年</b><b class='flag-5'>电</b><b class='flag-5'>赛</b><b class='flag-5'>F</b><b class='flag-5'>题</b>-<b class='flag-5'>送药</b><b class='flag-5'>小车</b>实现思路

    用悟空全志H3开发板做一个基于ROS系统的全向轮小车

    这个强大的开发板的一些关键特性以及我是如何利用它来打造一个全向轮的小车的。 2、产品设计介绍 本次设计的全向轮小车是在一个圆形底盘上安装了三个带有反馈编码器的全向轮,控制中心是悟空
    发表于 05-06 11:15

    怎样去设计一个智能送药小车

    2021F智能送药小车原文链接:openmv巡线代码:数字识别代码:HAL库keil工程(
    发表于 01-07 08:19

    梁山-21F-智能送药小车-按键检测的消抖和实现

    按键检测的消抖和实现 在送药小车中,预留了三个按键,药品装载检测是通过一个轻触开关来实现的,也可以把他理解成一个按键。 按键的实际电路如下: 我们通常用的按键内部都是机械弹性开关,当它按下弹起
    发表于 08-04 09:48

    【悟空H3开发板免费体验】基于ROS系统的全向轮小车

    /STM32F100RBT_robot.git 悟空: 1、开场白 大家好,我是FFD80。很高兴能够在这里和大家分享一些关于我使用悟空H3开发板构建全向轮
    发表于 11-12 01:00

    梁山的华秋DFM解析讲解(下)

    开源的梁山开发板已经大批量生产,其中一些细节和布线布局规则还是很值得我们学习的。上期已经介绍电气信号,最小线宽,最小间距,SMD间距的
    的头像 发表于 12-12 13:17 2027次阅读
    <b class='flag-5'>立</b><b class='flag-5'>创</b><b class='flag-5'>梁山</b><b class='flag-5'>派</b>的华秋DFM解析讲解(下)

    梁山开发板-21F-送药小车-分析

    全国产开源开发板,基于GD32F4系列,21F
    的头像 发表于 07-31 10:13 1242次阅读
    <b class='flag-5'>梁山</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b>-<b class='flag-5'>21</b><b class='flag-5'>年</b><b class='flag-5'>电</b><b class='flag-5'>赛</b><b class='flag-5'>F</b><b class='flag-5'>题</b>-<b class='flag-5'>送药</b><b class='flag-5'>小车</b>-<b class='flag-5'>赛</b><b class='flag-5'>题</b>分析

    梁山开发板-21F-送药小车-小车角度环的调试与实现

    来达到目标值。 第二种是在实现小车轮子位置环的基础上,控制两边轮子同时向不同的方向旋转一定的圈数(编码器脉冲),在小车轮子不打滑的情况下转过的角度就是一个确定的值,在送药小车的地图中
    的头像 发表于 07-27 10:18 933次阅读
    <b class='flag-5'>立</b><b class='flag-5'>创</b><b class='flag-5'>梁山</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b>-<b class='flag-5'>21</b><b class='flag-5'>年</b><b class='flag-5'>电</b><b class='flag-5'>赛</b><b class='flag-5'>F</b><b class='flag-5'>题</b>-<b class='flag-5'>送药</b><b class='flag-5'>小车</b>-<b class='flag-5'>小车</b>角度环的调试与实现

    ·梁山开发板-21F-送药小车-与K210串口通信协议框架搭建

    在K210可以识别到色块和识别数字后,就需要把这些信息传递给梁山派了。而立梁山也需要控制
    的头像 发表于 08-02 10:57 750次阅读

    梁山-21F-智能送药小车-按键检测的消抖和实现

    我们通常用的按键内部都是机械弹性开关,当它按下弹起的时候,机械触点会因为弹性作用而在闭合和断开的瞬间伴随着一连串的抖动。这种抖动会导致输入信号在高低电位之间弹跳,产生不正确的输入。 这里面电阻的作用是限流(害怕初学者不小心给设置成推挽输出了),在这里要注意的是要在芯片内部设置一个下拉(电路图上是没有加下拉电阻得到)。电容作用是硬件去抖,不过软件上还是需要软件消抖,硬件去抖只能改善不能消除,所以在有一些批量电路中,这个电容都是可以省去的,毕竟还是省不了软件消抖的。
    的头像 发表于 08-04 10:09 634次阅读
    <b class='flag-5'>立</b><b class='flag-5'>创</b><b class='flag-5'>梁山</b><b class='flag-5'>派</b>-<b class='flag-5'>21</b><b class='flag-5'>年</b><b class='flag-5'>电</b><b class='flag-5'>赛</b><b class='flag-5'>F</b><b class='flag-5'>题</b>-智能<b class='flag-5'>送药</b><b class='flag-5'>小车</b>-按键检测的消抖和实现