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系列(六)变换 中,一个目标物体经过模型矩阵、观察矩阵和投影矩阵的变换才能正常显示出来,其中模型矩阵主要针对目标物体,它会影响物体的位姿。观察矩阵和投影矩阵主要针对观察者而已,这两个变换决…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
