浅谈分布式多节点嵌入式系统中RS485总线指令冲突解决及性能优化

embedded/2025/3/17 2:03:36/

一、问题

RS485总线多节点竞争总线时,是否遇到过,由于缺乏冲突检测机制,发生指令冲突?系统实时性如何保障?如何解决了?采用主从轮询方式?同样也会因高延迟加剧冲突!笔者在项目开发过程中就遇到过这样的问题,既要保证实时性,又要解决总线指令冲突,同时还不能修改硬件,只能通过软件去改善这个问题。

二、背景

简单先介绍下项目背景,系统节点共15个,都是独立的功能模块,模块间通过RS485通讯,系统是封闭的,因此通讯协议采用的是自定义。主控模块可以控制子模块启停,同时子模块还会将运行状态上传到总线,子模块相互间写作也是通过指令控制,系统复杂度可想而知。
在这里插入图片描述

三、解决方案

下面聊聊是如何解决这个”既要、又要、同时还“的问题的。
先来谈谈总线指令冲突的改善的解决思路。想要解决指令冲突问题,先对系统通讯协议做了下了解,协议的一帧是定长的;在从模块的中断回调函中分析,可以通过指令字判断当前是否有指令在接收。因此,在接收指令时设置一个标志位g_tx_block_flag,模块要发送指令时先检测这个标志位是否有效,有效暂停发送,无效则发送指令。所有子系统都参照这个修改,从而有效改善指令冲突的问题。

 void user_rs485_bus_callback(uart_callback_args_t *p_args)
{/* TODO: add your own code here */uint8_t data;g_rs485_uart_event = (uint8_t)p_args->event;if(UART_EVENT_RX_CHAR == p_args->event){data = (uint8_t)p_args->data;if((data == FRAME_KEY)&&(g_rx485_index==0)){g_rx485_tmp_buff[g_rx485_index++] = data;g_tx_block_flag = true;}}
}

其次,对系统性能优化。通过对协议的分析,总线上传输的大量消息中,并不是所有的指令都与子系统相关,通过总线消息过滤,可以减少节点子系统的处理负担,提高系统效率,并能确保关键指令能够在子系统中得到及时的处理。

//接收指令过滤,仅处理与子系统相关的指令
bool rx_cmd_filtering(uint8_t cmd_data)
{bool retValue=false;switch(cmd_data){case RX_CMD_FILTER_A0:case RX_CMD_FILTER_A1:case RX_CMD_FILTER_A2:case RX_CMD_FILTER_A3:retValue=true;break;}return retValue;
}/* Callback function */
void user_rs485_bus_callback(uart_callback_args_t *p_args)
{/* TODO: add your own code here */uint8_t data;g_rs485_uart_event = (uint8_t)p_args->event;if(UART_EVENT_RX_CHAR == p_args->event){data = (uint8_t)p_args->data;if((data == FRAME_KEY)&&(g_rx485_index==0)){g_rx485_tmp_buff[g_rx485_index++] = data;g_tx_block_flag = true;}else if(g_rx485_index==1){if(rx_cmd_filtering(data))g_rx485_filter_sate = 1;    //当前子系统有指令需要处理elseg_rx485_filter_sate = 0;g_rx485_tmp_buff[g_rx485_index++] = data;}else{g_rx485_tmp_buff[g_rx485_index++] = data;if((g_rx485_index+1)>FRAME_LEN){g_rx485_index=0;if(g_rx485_filter_sate){xQueueGenericSendFromISR(g_485buf_queue, g_rx485_tmp_buff, NULL, queueSEND_TO_BACK); g_tx_block_flag = false;}}}}
}

有兴趣的小伙伴,可以下载工程了解下
项目工程下载链接:
https://download.csdn.net/download/xtudj/90474572


http://www.ppmy.cn/embedded/173209.html

相关文章

历年华中科技大学计算机考研复试上机真题

历年华中科技大学计算机考研复试上机真题 2022华中科技大学计算机考研复试上机真题 2021华中科技大学计算机考研复试上机真题 2019华中科技大学计算机考研复试上机真题 在线评测:https://pgcode.cn 八进制 题目描述 输入一个整数,将其转换成八进制数…

将分支`XXX`合并到远程分支`master

将分支feat-task合并到远程分支master 首先,切换到本地的 master 分支 git checkout master确保你的本地 master 分支是最新的,拉取远程的更新 git pull origin master将 feat-task 分支的代码合并到 master 分支 git merge feat-task如果在合并过程…

k8s集群-kubeadm init

为了使用阿里云的镜像源加速 kubeadm init 初始化 Kubernetes 集群的过程,你需要修改 kubeadm 的配置文件以指向阿里云提供的镜像仓库。以下是具体步骤: 1. 创建或编辑 kubeadm 配置文件 首先,创建一个 kubeadm 的配置文件(如果还…

【科研绘图系列】python绘制分组点图(grouped dot plot)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据函数`generateRectBoxDF` 函数主要作用参数解释逻辑流程`nmfDotPlot` 函数主要作用参数解释逻辑流程画图1画图2画图3画图4介绍 【科研绘图系列】python绘制…

Git取消合并操作指南

要取消当前的合并操作,可以使用以下命令: 1. 如果合并尚未完成(存在冲突未解决) git merge --abort该命令会中止合并过程,并将工作目录恢复到合并前的状态。 2. 如果合并已完成但尚未提交 git reset --hard HEAD该…

品铂科技核心技术与应用解析

品铂科技(Pinpoint)是UWB高精度定位领域的领先企业,其产品以‌厘米级定位精度‌与‌复杂环境适应性‌为核心优势,广泛应用于工业、矿山、地铁等高要求场景。以下是其技术方案与市场定位的详细分析: 一、‌核心技术方案…

解决 MySQL 迁移到达梦报错 “无效的列名” 的问题

在数据库迁移的过程中,常常会遇到各种各样的问题。本文将聚焦于从源库 MySQL(大小写不敏感)迁移到目标库达梦(大小写敏感)时,出现的创建索引报错 “无效的列名” 这一问题,使用SQLark工具如何避…

开发、科研、日常办公工具汇总(自用,持续更新)

主要记录汇总一下自己平常会用到的网站工具,方便查阅。 update:2025/2/11(开发网站补一下) update:2025/2/21(补充一些AI工具,刚好在做AI视频相关工作) update:2025/3/7&…