EtherCAT主站IGH-- 2 -- IGH之coe_emerg_ring.h/c文件解析
EtherCAT主站IGH-- 2 -- IGH之coe_emerg_ring.h/c文件解析
- 0 预览
- 一 该文件功能
- `coe_emerg_ring.c` 文件功能函数预览
- 二 函数功能介绍
- `coe_emerg_ring.c` 中主要函数的作用
- 1. `ec_coe_emerg_ring_init`
- 2. `ec_coe_emerg_ring_clear`
- 3. `ec_coe_emerg_ring_size`
- 4. `ec_coe_emerg_ring_push`
- 5. `ec_coe_emerg_ring_pop`
- 6. `ec_coe_emerg_ring_clear_ring`
- 7. `ec_coe_emerg_ring_overruns`
- 三 h文件翻译
- 四 c文件翻译
- 该文档修改记录:
- 总结
0 预览
一 该文件功能
该文件定义了 EtherCAT CoE 紧急环形缓冲区的方法。EtherCAT 是一种实时以太网通信标准,广泛用于工业自动化控制系统。紧急环形缓冲区用于处理从站配置中的紧急消息,通过紧急消息环缓冲区,系统可以在有限的内存中存储并管理来自从站的紧急消息。
coe_emerg_ring.c 文件功能函数预览
| 函数 | 功能和用途 | 使用场景 |
|---|---|---|
ec_coe_emerg_ring_init | 初始化 EtherCAT CoE 紧急环形缓冲区。 | 在应用程序启动时进行紧急环形缓冲区的初始化。 |
ec_coe_emerg_ring_clear | 清理 EtherCAT CoE 紧急环形缓冲区。 | 在应用程序关闭或设备不再使用时进行清理操作。 |
ec_coe_emerg_ring_size | 设置紧急环形缓冲区的大小。 | 在初始化或需要更改环形缓冲区大小时调用。 |
ec_coe_emerg_ring_push | 添加一个新的紧急消息到环形缓冲区。 | 在接收到新的紧急消息时调用。 |
ec_coe_emerg_ring_pop | 从环形缓冲区中移除一个紧急消息。 | 在需要处理或读取紧急消息时调用。 |
ec_coe_emerg_ring_clear_ring | 清空环形缓冲区。 | 在需要清空紧急消息环形缓冲区时调用。 |
ec_coe_emerg_ring_overruns | 读取环形缓冲区的溢出次数。 | 在需要获取环形缓冲区溢出次数时调用。 |
二 函数功能介绍
coe_emerg_ring.c 中主要函数的作用
1. ec_coe_emerg_ring_init
void ec_coe_emerg_ring_init(ec_coe_emerg_ring_t *ring, /**< Emergency ring. */ec_slave_config_t *sc /**< Slave configuration. */)
{ring->sc = sc;ring->msgs = NULL;ring->size = 0;ring->read_index = 0;ring->write_index = 0;ring->overruns = 0;
}
- 功能和用途:初始化 EtherCAT CoE 紧急环形缓冲区。
- 使用场景:在应用程序启动时进行紧急环形缓冲区的初始化。
2. ec_coe_emerg_ring_clear
void ec_coe_emerg_ring_clear(ec_coe_emerg_ring_t *ring /**< Emergency ring. */)
{if (ring->msgs) {kfree(ring->msgs);}
}
- 功能和用途:清理 EtherCAT CoE 紧急环形缓冲区。
- 使用场景:在应用程序关闭或设备不再使用时进行清理操作。
3. ec_coe_emerg_ring_size
int ec_coe_emerg_ring_size(ec_coe_emerg_ring_t *ring, /**< Emergency ring. */size_t size /**< Maximum number of messages in the ring. */)
{ring->size = 0;if (size < 0) {size = 0;}ring->read_index = ring->write_index = 0;if (ring->msgs) {kfree(ring->msgs);}ring->msgs = NULL;if (size == 0) {return 0;}ring->msgs = kmalloc(sizeof(ec_coe_emerg_msg_t) * (size + 1), GFP_KERNEL);if (!ring->msgs) {return -ENOMEM;}ring->size = size;return 0;
}
- 功能和用途:设置紧急环形缓冲区的大小。
- 使用场景:在初始化或需要更改环形缓冲区大小时调用。
4. ec_coe_emerg_ring_push
void ec_coe_emerg_ring_push(ec_coe_emerg_ring_t *ring, /**< Emergency ring. */const u8 *msg /**< Emergency message. */)
{if (!ring->size ||(ring->write_index + 1) % (ring->size + 1) == ring->read_index) {ring->overruns++;return;}memcpy(ring->msgs[ring->write_index].data, msg,EC_COE_EMERGENCY_MSG_SIZE);ring->write_index = (ring->write_index + 1) % (ring->size + 1);
}
- 功能和用途:添加一个新的紧急消息到环形缓冲区。
- 使用场景:在接收到新的紧急消息时调用。
5. ec_coe_emerg_ring_pop
int ec_coe_emerg_ring_pop(ec_coe_emerg_ring_t *ring, /**< Emergency ring. */u8 *msg /**< Memory to store the emergency message. */)
{if (ring->read_index == ring->write_index) {return -ENOENT;}memcpy(msg, ring->msgs[ring->read_index].data, EC_COE_EMERGENCY_MSG_SIZE);ring->read_index = (ring->read_index + 1) % (ring->size + 1);return 0;
}
- 功能和用途:从环形缓冲区中移除一个紧急消息。
- 使用场景:在需要处理或读取紧急消息时调用。
6. ec_coe_emerg_ring_clear_ring
int ec_coe_emerg_ring_clear_ring(ec_coe_emerg_ring_t *ring /**< Emergency ring. */)
{ring->read_index = ring->write_index;ring->overruns = 0;return 0;
}
- 功能和用途:清空环形缓冲区。
- 使用场景:在需要清空紧急消息环形缓冲区时调用。
7. ec_coe_emerg_ring_overruns
int ec_coe_emerg_ring_overruns(ec_coe_emerg_ring_t *ring /**< Emergency ring. */)
{return ring->overruns;
}
- 功能和用途:读取环形缓冲区的溢出次数。
- 使用场景:在需要获取环形缓冲区溢出次数时调用。
三 h文件翻译
这个头文件定义了 EtherCAT CoE(CANopen over EtherCAT)紧急消息的环形缓冲区结构和相关函数接口,包括初始化、清除、推入和弹出消息的函数。主要用于处理从站设备的紧急消息。
/******************************************************************************\** $Id$** 版权所有 (C) 2012 Florian Pose, Ingenieurgemeinschaft IgH** 本文件是 IgH EtherCAT 主站的一部分。** IgH EtherCAT 主站是免费软件;您可以根据自由软件基金会发布的 GNU 通用公共许可证第2版的条款重新分发和/或修改它。** IgH EtherCAT 主站的分发目的是希望它有用,但没有任何保证;甚至没有适销性或特定用途适用性的隐含保证。详情请参阅 GNU 通用公共许可证。** 您应该已经收到了与 IgH EtherCAT 主站一起提供的 GNU 通用公共许可证的副本;如果没有,请写信给自由软件基金会,地址是:51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA。** ---** 上述许可证仅适用于源代码。使用 EtherCAT 技术和品牌仅允许在遵守 Beckhoff Automation GmbH 的工业产权和类似权利的情况下使用。*****************************************************************************//**\fileEtherCAT CoE 紧急环形缓冲区结构。
*//*****************************************************************************/#ifndef __EC_COE_EMERG_RING_H__
#define __EC_COE_EMERG_RING_H__#include "globals.h"/*****************************************************************************//** EtherCAT CoE 紧急消息记录。*/
typedef struct {u8 data[EC_COE_EMERGENCY_MSG_SIZE]; /**< 消息数据。 */
} ec_coe_emerg_msg_t;/*****************************************************************************//** EtherCAT CoE 紧急环形缓冲区。*/
typedef struct {ec_slave_config_t *sc; /**< 拥有该环的从站配置。 */ec_coe_emerg_msg_t *msgs; /**< 消息环。 */size_t size; /**< 环的大小。 */unsigned int read_pos; /**< 读取位置。 */unsigned int write_pos; /**< 写入位置。 */unsigned int stored; /**< 已存储的消息数量。 */
} ec_coe_emerg_ring_t;/*****************************************************************************/void ec_coe_emerg_ring_init(ec_coe_emerg_ring_t *ring, ec_slave_config_t *sc, size_t size);
void ec_coe_emerg_ring_clear(ec_coe_emerg_ring_t *ring);
int ec_coe_emerg_ring_push(ec_coe_emerg_ring_t *ring, const u8 *data);
int ec_coe_emerg_ring_pop(ec_coe_emerg_ring_t *ring, u8 *data);/*****************************************************************************/#endif
四 c文件翻译
/******************************************************************************\** $Id$** 版权所有 (C) 2012 Florian Pose, Ingenieurgemeinschaft IgH** 本文件是 IgH EtherCAT 主站的一部分。** IgH EtherCAT 主站是免费软件;您可以根据自由软件基金会发布的 GNU 通用公共许可证第2版的条款重新分发和/或修改它。** IgH EtherCAT 主站的分发目的是希望它有用,但没有任何保证;甚至没有适销性或特定用途适用性的隐含保证。详情请参阅 GNU 通用公共许可证。** 您应该已经收到了与 IgH EtherCAT 主站一起提供的 GNU 通用公共许可证的副本;如果没有,请写信给自由软件基金会,地址是:51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA。** ---** 上述许可证仅适用于源代码。使用 EtherCAT 技术和品牌仅允许在遵守 Beckhoff Automation GmbH 的工业产权和类似权利的情况下使用。** vim: expandtab*****************************************************************************//** \file* EtherCAT CoE 紧急环形缓冲区方法。*//*****************************************************************************/#include <linux/slab.h>#include "coe_emerg_ring.h"/*****************************************************************************//** 紧急环形缓冲区构造函数。*/
void ec_coe_emerg_ring_init(ec_coe_emerg_ring_t *ring, /**< 紧急环。 */ec_slave_config_t *sc /**< 从站配置。 */)
{ring->sc = sc;ring->msgs = NULL;ring->size = 0;ring->read_index = 0;ring->write_index = 0;ring->overruns = 0;
}/*****************************************************************************//** 紧急环形缓冲区析构函数。*/
void ec_coe_emerg_ring_clear(ec_coe_emerg_ring_t *ring /**< 紧急环。 */)
{if (ring->msgs) {kfree(ring->msgs);}
}/*****************************************************************************//** 设置环的大小。** \return 成功时返回零,否则返回负错误代码。*/
int ec_coe_emerg_ring_size(ec_coe_emerg_ring_t *ring, /**< 紧急环。 */size_t size /**< 环中最大消息数。 */)
{ring->size = 0;if (size < 0) {size = 0;}ring->read_index = ring->write_index = 0;if (ring->msgs) {kfree(ring->msgs);}ring->msgs = NULL;if (size == 0) {return 0;}ring->msgs = kmalloc(sizeof(ec_coe_emerg_msg_t) * (size + 1), GFP_KERNEL);if (!ring->msgs) {return -ENOMEM;}ring->size = size;return 0;
}/*****************************************************************************//** 添加一个新的紧急消息。*/
void ec_coe_emerg_ring_push(ec_coe_emerg_ring_t *ring, /**< 紧急环。 */const u8 *msg /**< 紧急消息。 */)
{if (!ring->size ||(ring->write_index + 1) % (ring->size + 1) == ring->read_index) {ring->overruns++;return;}memcpy(ring->msgs[ring->write_index].data, msg,EC_COE_EMERGENCY_MSG_SIZE);ring->write_index = (ring->write_index + 1) % (ring->size + 1);
}/*****************************************************************************//** 从环形缓冲区中移除一个紧急消息。** \return 成功时返回零,否则返回负错误代码。*/
int ec_coe_emerg_ring_pop(ec_coe_emerg_ring_t *ring, /**< 紧急环。 */u8 *msg /**< 用于存储紧急消息的内存。 */)
{if (ring->read_index == ring->write_index) {return -ENOENT;}memcpy(msg, ring->msgs[ring->read_index].data, EC_COE_EMERGENCY_MSG_SIZE);ring->read_index = (ring->read_index + 1) % (ring->size + 1);return 0;
}/*****************************************************************************//** 清空环。** \return 成功时返回零,否则返回负错误代码。*/
int ec_coe_emerg_ring_clear_ring(ec_coe_emerg_ring_t *ring /**< 紧急环。 */)
{ring->read_index = ring->write_index;ring->overruns = 0;return 0;
}/*****************************************************************************//** 读取环溢出次数。** \return 溢出次数。*/
int ec_coe_emerg_ring_overruns(ec_coe_emerg_ring_t *ring /**< 紧急环。 */)
{return ring->overruns;
}/*****************************************************************************/
该文档修改记录:
| 修改时间 | 修改说明 |
|---|---|
| 2024年6月28日 | EtherCAT主站IGH 该 文件解析 |
总结
以上就是EtherCAT主站IGH文件解析的内容。
有不明白的地方欢迎留言;有建议欢迎留言,我后面编写文档好改进。
创作不容,如果文档对您有帮助,记得给个赞。
相关文章:
EtherCAT主站IGH-- 2 -- IGH之coe_emerg_ring.h/c文件解析
EtherCAT主站IGH-- 2 -- IGH之coe_emerg_ring.h/c文件解析 0 预览一 该文件功能coe_emerg_ring.c 文件功能函数预览 二 函数功能介绍coe_emerg_ring.c 中主要函数的作用1. ec_coe_emerg_ring_init2. ec_coe_emerg_ring_clear3. ec_coe_emerg_ring_size4. ec_coe_emerg_ring_pus…...
psensor 的手势功能
psensor 的手势功能的移植过程 有时间再来写下...
使用 nvm 管理 Node 版本及 pnpm 安装
文章目录 GithubWindows 环境Mac/Linux 使用脚本进行安装或更新Mac/Linux 环境变量nvm 常用命令npm 常用命令npm 安装 pnpmNode 历史版本 Github https://github.com/nvm-sh/nvm Windows 环境 https://nvm.uihtm.com/nvm.html Mac/Linux 使用脚本进行安装或更新 curl -o- …...
uni-appx使用form表单页面初始化报错
因为UniFormSubmitEvent的类型时 e-->detail-->value,然后没有了具体值。所以页面初始化的时候 不能直接从value取值,会报错找不到 所以form表单里的数据我们要设置成一个对象来存放 这个问题的关键在于第22行代码 取值: 不能按照点的方式取值 …...
TiDB-从0到1-数据导出导入
TiDB从0到1系列 TiDB-从0到1-体系结构TiDB-从0到1-分布式存储TiDB-从0到1-分布式事务TiDB-从0到1-MVCCTiDB-从0到1-部署篇TiDB-从0到1-配置篇TiDB-从0到1-集群扩缩容 一、数据导出 TiDB中通过Dumpling来实现数据导出,与MySQL中的mysqldump类似,其属于…...
动手学深度学习(Pytorch版)代码实践 -卷积神经网络-16自定义层
16自定义层 import torch import torch.nn.functional as F from torch import nnclass CenteredLayer(nn.Module):def __init__(self):super().__init__()#从其输入中减去均值#X.mean() 计算的是整个张量的均值#希望计算特定维度上的均值,可以传递 dim 参数。#例如…...
树莓派4设置
使用sudo命令时要求输入密码 以 sudo 为前缀的命令以超级用户身份运行。默认情况下,超级用户不需要密码。不过,您可以要求所有以 sudo 运行的命令都输入密码,从而提高 Raspberry Pi 的安全性。 要强制 sudo 要求输入密码,请为你…...
44.商城系统(二十五):k8s基本操作,ingress域名访问,kubeSphere可视化安装
上一章我们已经配置好了k8s集群,如果没有配置好先去照着上面的配。 一、k8s入门操作 1.部署一个tomcat,测试容灾恢复 #在主机器上执行 kubectl create deployment tomcat6 --image=tomcat:6.0.53-jre8#查看k8s中的所有资源 kubectl get all kubectl get all -o wide#查看po…...
MySQL高级查询
MySQL 前言 文本源自微博客 (www.microblog.store),且已获授权. 一. mysql基础知识 1. mysql常用系统命令 启动命令 net start mysql停止命令 net stop mysql登录命令 mysql -h ip -P 端口 -u 用户名 -p 本机可以省略 ip mysql -u 用户名 -p 查看数据库版本 mysql --ve…...
聊聊啥项目适合做自动化测试
作为测试从业者,你是否遇到过这样的场景,某天公司大Boss找你谈话。 老板:小李,最近工作辛苦了 小李:常感谢您的认可,这不仅是对我个人的鼓励,更是对我们整个团队努力的认可。我们的成果离不开每…...
ROS2开发机器人移动
.创建功能包和节点 这里我们设计两个节点 example_interfaces_robot_01,机器人节点,对外提供控制机器人移动服务并发布机器人的状态。 example_interfaces_control_01,控制节点,发送机器人移动请求,订阅机器人状态话题…...
【强化学习】第02期:动态规划方法
笔者近期上了国科大周晓飞老师《强化学习及其应用》课程,计划整理一个强化学习系列笔记。笔记中所引用的内容部分出自周老师的课程PPT。笔记中如有不到之处,敬请批评指正。 文章目录 2.1 动态规划:策略收敛法/策略迭代法2.2 动态规划…...
安全技术和防火墙(二)
接上一节 备份和还原 iptables-save > /opt/iptables.bak iptables-restore < /opt/iptables.bak snat和dnat snat源地址转换 内网到外网 内网ip转换成可以访问外网的ip 内网的多个主机可以只有一个有效的公网ip地址访问外部网络 dnat 目的地址转发 外部用户&#…...
【51单片机入门】数码管原理
文章目录 前言共阴极与共阳极数码管多个数码管显示原理 总结 前言 在我们的日常生活中,数码管被广泛应用于各种电子设备中,如电子表、计时器、电子钟等。数码管的主要功能是显示数字和一些特殊字符。在这篇文章中,我们将探讨数码管的工作原理…...
三星DRAM、NAND,“又双叒叕”带头涨价了
据韩国媒体《每日经济新闻》报道,三星电子计划在第三季度上调服务器DRAM和企业级NAND闪存的价格,涨幅预计在15%-20%,主要受人工智能(AI)需求激增的推动。这一举措有望提振公司下半年业绩。 据《经济日报》报道援引业内消息,由于厂…...
星戈瑞FITC-PEG2000-Biotin的生物相容性
生物相容性是指材料与生物体之间相互作用时,材料对生物体无毒、无刺激,且能够被生物体接受并正常发挥其功能的特性。 FITC-PEG2000-Biotin作为一种荧光标记试剂,在细胞成像、药物传递和生物标志物检测等领域具有诸多应用前景。 FITC-PEG2000…...
数据资产管理的艺术:构建智能化、精细化的数据资产管理体系,从数据整合、分析到决策支持,为企业提供一站式的数据资产解决方案,助力企业把握数字时代的新机遇
一、引言 在数字化浪潮席卷全球的今天,数据已经成为企业最重要的资产之一。如何高效、安全地管理这些海量数据,从中提取有价值的信息,并将其转化为决策支持,是每个企业都必须面对的挑战。本文将探讨数据资产管理的艺术࿰…...
基于Java微信小程序校园自助打印系统设计和实现(源码+LW+调试文档+讲解等)
💗博主介绍:✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末获取源码数据库🌟感兴趣的可以先收藏起来,还…...
股票复盘思路
股票复盘是一个回顾和分析市场及个人交易决策的过程,旨在从过去的表现中学习并优化未来的投资策略。以下是一些基本的股票复盘步骤和关注点: 市场概况回顾: 观察并记录每日市场的整体表现,包括大盘指数涨跌、成交量变化。统计涨停和跌停个股的数量,了解市场情绪和活跃度。…...
OpenGL系列(六)摄像机
在 OpenGL系列(六)变换 中,一个目标物体经过模型矩阵、观察矩阵和投影矩阵的变换才能正常显示出来,其中模型矩阵主要针对目标物体,它会影响物体的位姿。观察矩阵和投影矩阵主要针对观察者而已,这两个变换决…...
实战指南:基于快马生成tomcat生产级配置,涵盖https、集群与性能调优
今天想和大家分享一个实战经验:如何在生产环境中配置Tomcat服务器。作为一个长期和Tomcat打交道的开发者,我深知生产环境配置和本地开发环境的巨大差异。最近在InsCode(快马)平台上实践了一套完整的配置方案,效果很不错,这里把关键…...
Go Channel 死锁问题定位技巧
Go Channel 死锁问题定位技巧 在Go语言中,Channel是协程间通信的核心机制,但使用不当容易引发死锁问题。死锁不仅会导致程序阻塞,还可能让开发者陷入调试困境。本文将分享几个实用的定位技巧,帮助开发者快速识别和解决Channel死锁…...
Windows Defender Remover:系统性能优化与防护机制管理指南
Windows Defender Remover:系统性能优化与防护机制管理指南 【免费下载链接】windows-defender-remover A tool which is uses to remove Windows Defender in Windows 8.x, Windows 10 (every version) and Windows 11. 项目地址: https://gitcode.com/gh_mirror…...
AI显微镜-Swin2SR惊艳效果展示:电子包浆表情包高清还原作品集
AI显微镜-Swin2SR惊艳效果展示:电子包浆表情包高清还原作品集 你有没有遇到过这种情况?在网上看到一个特别有趣的表情包,但图片糊得连五官都看不清,上面还叠加了无数层水印和压缩痕迹,俗称“电子包浆”。想保存下来当…...
3分钟学会用Draw.io ECE插件绘制专业级电路图:告别复杂EDA软件
3分钟学会用Draw.io ECE插件绘制专业级电路图:告别复杂EDA软件 【免费下载链接】Draw-io-ECE Custom-made draw.io-shapes - in the form of an importable library - for drawing circuits and conceptual drawings in draw.io. 项目地址: https://gitcode.com/g…...
告别重复造轮子:用快马AI一键生成极客日报的高效数据管道代码
告别重复造轮子:用快马AI一键生成极客日报的高效数据管道代码 作为一个技术资讯类应用的开发者,我深知数据管道的搭建有多耗时。从内容抓取到清洗处理,再到分类归档,每个环节都需要大量重复性编码。最近尝试了InsCode(快马)平台的…...
论文省心了!盘点2026年全网爆红的的降AI率平台
轻松降低论文AI率在2026年已不再是天方夜谭。2026年降AI率平台横空出世,实测提速效果炸裂,覆盖AI痕迹消除、文本改写润色、降重优化、学术合规检测四大核心场景,高效搞定毕业论文难题。 一、全流程王者:一站式搞定论文全链路 这类…...
颠覆式开源工具GHelper:极简华硕笔记本硬件控制解决方案
颠覆式开源工具GHelper:极简华硕笔记本硬件控制解决方案 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models 项目地…...
Sinkhorn算法实战:用Python手把手教你解决最优传输问题(附完整代码)
Sinkhorn算法实战:用Python手把手教你解决最优传输问题(附完整代码) 最优传输理论在机器学习领域正掀起一场静默的革命。想象一下这样的场景:你需要将一组资源从A地运往B地,同时希望运输成本最低;或者你需要…...
GLM-4.7-Flash多场景落地:保险条款解读、理赔话术生成与客户异议应答
GLM-4.7-Flash多场景落地:保险条款解读、理赔话术生成与客户异议应答 保险行业每天都要处理海量的文本工作:厚厚的保单条款需要解读,复杂的理赔申请需要沟通,客户的各种疑问需要专业、及时地回应。这些工作不仅繁琐,而…...
