OpenEdv-开源电子网

标题: 立创·梁山派开发板-21年电赛F题-送药小车数据的发布与订阅 [打印本页]

作者: LCKFB    时间: 2023-8-7 09:50
标题: 立创·梁山派开发板-21年电赛F题-送药小车数据的发布与订阅
送药小车代码仓库:https://gitee.com/lcsc/medical_car
更好的观看体验请去:https://lceda001.feishu.cn/wiki/ZDYbwqDfCiwVlckUEcScF0KSnRh
送药小车立创开源平台资料:https://oshwhub.com/li-chuang-kai-fa-ban/21-dian-sai-f-ti-zhi-neng-song-yao-xiao-che
购买链接:https://item.szlcsc.com/5810323.html

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

既然使用了RTOS,就不能像以前裸机一样全局变量满天飞了(当然裸机也不能全局变量满天飞)。
在实时操作系统(RTOS)中,不推荐或不建议使用全局变量来传递信息的原因主要有以下几点:
为了避免上述问题,RTOS提供了一些机制来进行任务间的通信和数据传递,例如:
通过使用这些RTOS提供的通信机制,可以更安全地在任务之间传递信息,避免竞争条件和数据共享问题,并提高代码的可维护性和调试效率。
在送药小车这个工程中采用RT-Thread软件包uMCN,uMCN (Micro Multi-Communication Node) 提供了一种基于发布/订阅模式的安全跨线程/进程的通信方式。在系统中,uMCN 被广泛应用于任务和模块间的数据通信。使用发布-订阅(Publish-Subscribe)机制可以提供更灵活和高效的任务间通信方式,支持一对一、一对多、多对一和多对多的通信模式。这种机制可以解决使用全局变量传递信息可能带来的竞争条件和数据共享问题。
发布-订阅机制基于事件驱动的思想,其中包含两个角色:发布者(Publisher)和订阅者(Subscriber)。发布者负责发布事件或消息,而订阅者则注册对感兴趣的事件或消息进行订阅。他提供了一种松散耦合的通信方式,允许任务或模块之间通过发布和订阅消息来进行通信,而不需要直接知道彼此的存在。
在使用发布-订阅模式获取数据时,通常涉及以下角色和操作:
使用发布-订阅模式获取数据的好处在于,系统中的任务或模块之间解耦合,发布者和订阅者之间不直接依赖于彼此的存在,从而提高了系统的可扩展性和灵活性。此外,发布-订阅模式还能够支持多对多的通信,允许多个订阅者同时接收相同的数据或事件,实现了信息的分发和共享。
他的优势如下:


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

具体使用参考uMCN的仓库
添加新主题
为了添加新的主题 (topic),你需要先创建一个主题内容。例如:
  1. typedef struct {
  2.         rt_uint32_t a;
  3.         float b;
  4.         int8_t c[4];
  5. } data_content;
复制代码

uMCN对主题内容的长度和类型没有限制,所以理论上可以用来传输任何类型的消息。
然后你需要使用宏 MCN_DEFINE(name, size) 来定义主题。一般在发布主题的源文件的顶部定义主题。例如:
  1. MCN_DEFINE(my_topic, sizeof(data_content));
复制代码

uMCN 支持一个主题拥有多个发布者和订阅者。注意同一个主题名字不同被重复定义,不然编译器会报错。
下一步就是使用 mcn_advertise() 来注册主题。例如:
  1. mcn_advertise(MCN_ID(my_topic), my_topic_echo);
复制代码

MCN_ID() 宏根据主题名获得枢纽节点。my_topic_echo 是一个回调函数,用来打印主题的数据。
  1. static int my_topic_echo(void* param)
  2. {
  3.         data_content data;
  4.         if(mcn_copy_from_hub((McnHub*)param, &data) == FMT_EOK){
  5.                 printf("a:%d b:%f c:%c %c %c %c\n", data.a, data.b, data.c[0], data.c[1], data.c[2], data.c[3]);
  6.         return 0;
  7.         }
  8.         return -1;
  9. }
复制代码

发布主题
可以在系统的任意位置使用函数 mcn_publish() 来发布一个主题。例如:
  1. data_content my_data = {50, -2.0, {1,2,3,4}};
  2. mcn_publish(MCN_ID(my_topic), &my_data);
复制代码











欢迎光临 OpenEdv-开源电子网 (http://47.111.11.73/) Powered by Discuz! X3.4