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文件解析的内容。
有不明白的地方欢迎留言;有建议欢迎留言,我后面编写文档好改进。
创作不容,如果文档对您有帮助,记得给个赞。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/36109.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

聊聊啥项目适合做自动化测试

作为测试从业者&#xff0c;你是否遇到过这样的场景&#xff0c;某天公司大Boss找你谈话。 老板&#xff1a;小李&#xff0c;最近工作辛苦了 小李&#xff1a;常感谢您的认可&#xff0c;这不仅是对我个人的鼓励&#xff0c;更是对我们整个团队努力的认可。我们的成果离不开每…

Linux libreoffice安装 word转pdf 中文乱码(缺少字体解决)

libreoffice 的安装 yum install -y libreoffice版本验证 libreoffice --version参考文章 word转pdf 命令 转换命令 要将Word文档(.doc或.docx)转换为PDF格式&#xff0c;可以使用以下命令&#xff1a; libreoffice --headless --convert-to pdf your_word_document.docx指…

计算机视觉——OpenCV C++实现凸包

概述 在图像中发现和分析形式是解决大多数计算机视觉问题的技巧之一&#xff0c;获取轮廓是其中之一。对于新手来说&#xff0c;我会将轮廓描述为“仅仅是一条连接所有位于形状边缘上的点的曲线。” 假设我有下面这张手的图像&#xff0c;手的轮廓由绿线表示。红点代表我们将…

http服务网络请求如何确保数据安全(含python示例源码)

深度学习类文章回顾 【YOLO深度学习系列】图像分类、物体检测、实例分割、物体追踪、姿态估计、定向边框检测演示系统【含源码】 【深度学习】物体检测/实例分割/物体追踪/姿态估计/定向边框/图像分类检测演示系统【含源码】 【深度学习】YOLOV8数据标注及模型训练方法整体流程…

RabbitMQ消息积压比较厉害,然后突然丢弃

RabbitMQ中的消息积压陡降通常表明某些突发事件或操作已经显著减少了队列中的消息数量。这种现象可能由多种原因引起&#xff0c;以下是一些可能的原因及其解释&#xff1a; 消费者处理速度突然增加 原因: 你的消费者&#xff08;消费者应用或服务&#xff09;可能在某个时间点…

FreeRTOS信号量和互斥量

信息量 简介 信号量是一种解决同步问题的机制&#xff0c;可以实现对共享资源的有序访问。 前面介绍的队列(queue)可以用于传输数据&#xff1a;在任务之间、任务和中断之间。 消息队列用于传输多个数据&#xff0c;但是有时候我们只需要传递状态&#xff0c;这个状态值需要用…

计算机网络:408考研|湖科大教书匠|原理参考模型I|学习笔记

系列目录 计算机网络总纲领 计算机网络特殊考点 计算机网络原理参考模型I 计算机网络原理参考模型II 目录 系列目录更新日志数据链路层(Data Link Layer)一、基本概念二、三个重要问题三、 &#x1f31f;点对点协议(PPP, Point-to-Point Protocol)四、 以太网五、802.11 无线局…

股票复盘思路

股票复盘是一个回顾和分析市场及个人交易决策的过程,旨在从过去的表现中学习并优化未来的投资策略。以下是一些基本的股票复盘步骤和关注点: 市场概况回顾: 观察并记录每日市场的整体表现,包括大盘指数涨跌、成交量变化。统计涨停和跌停个股的数量,了解市场情绪和活跃度。…

neo4j端口号不能访问的问题

安装可能出现的问题 访问Neo4j验证失败&#xff08;The client is unauthorized due to authentication failure.&#xff09;大概意思就是说服务器验证失败。 如果你有在浏览器上登录不同的neo4j数据库&#xff0c;很可能是由于缓存没有清理掉导致的。 可以试试无痕浏览来访问…

数据结构-分析期末选择题考点(串、数组)

竹月光中诗世界 松风影里酒生涯 目录 串的常见考法&#xff08;一&#xff09;BF算法 串的常见考法&#xff08;二&#xff09;KMP求 next数组 串的常见考法&#xff08;三&#xff09;串的概念及性质 串的常见考法&#xff08;四&#xff09;给出主串求子串数量 数组的常见…

使用 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- …

探索 Spring Cloud Gateway:构建微服务架构的关键一环

1. 简介 在当今的分布式系统中&#xff0c;微服务架构已经成为了一种流行的架构模式。在微服务架构中&#xff0c;服务被拆分为小型、可独立部署的服务单元&#xff0c;这些服务单元能够通过网络互相通信&#xff0c;形成一个整体的应用系统。然而&#xff0c;随着微服务数量的…

如何在AWS上使用免费的服务器

要在AWS上免费使用的服务器&#xff0c;你可以按照以下步骤操作&#xff1a; &#xff08;1&#xff09;注册AWS账户&#xff1a; 访问AWS官方网站&#xff08;https://aws.amazon.com/cn/&#xff09;&#xff0c;点击右上角的“完成注册”&#xff0c;按照页面提示填写相关…

华为BGP路由实验基础1------用物理口建立对等体

1.用物理口做BGP建立对等体建立BGP连接 实验拓扑&#xff1a; 实验步骤&#xff1a; 1.完成基本配置 sys [Huawei]sys AR1 [AR1]undo in e [AR1]int g0/0/0 [AR1-GigabitEthernet0/0/0]ip add 1.1.1.1 24 [AR1-GigabitEthernet0/0/0]q [AR1] sys [Huawei]sys AR2 [AR2]undo i…

自研Java调度框架或者CTM或者鲁班

在软件开发中&#xff0c;"自研Java调度框架"通常指的是开发者或团队自行设计并实现的一个用于任务调度的系统&#xff0c;而不是使用现成的开源解决方案。这样的框架可以满足特定的业务需求&#xff0c;提供定制化的功能。以下是一些设计和实现自研Java调度框架时可…

【Python】已解决:Python正确安装文字识别库EasyOCR

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;Python正确安装文字识别库EasyOCR 一、分析问题背景 在使用Python进行图像处理和文字识别时&#xff0c;EasyOCR是一个流行的库&#xff0c;它基于PyTorch&…

【算法刷题 | 动态规划14】6.28(最大子数组和、判断子序列、不同的子序列)

文章目录 35.最大子数组和35.1题目35.2解法&#xff1a;动规35.2.1动规思路35.2.2代码实现 36.判断子序列36.1题目36.2解法&#xff1a;动规36.2.1动规思路36.2.2代码实现 37.不同的子序列37.1题目37.2解法&#xff1a;动规37.2.1动规思路37.2.2代码实现 35.最大子数组和 35.1…

Tensorflow Lite移动平台编译

Android平台编译 如果不做定制化操作,我们不需要自己编译TensorFlow Lite Android库。我们可以直接使用位于MavenCentral的TensorFlow Lite AAR。但是在某些情况下,我们需要本地编译TensorFlow Lite。例如,您可能正在构建一个包含operations selected from TensorFlow的自定…

探索机器学习——构建简单的线性回归模型

目录 引言 什么是线性回归&#xff1f; 为什么选择线性回归&#xff1f; 简单性&#xff1a;线性回归模型易于理解和实现。 基础性&#xff1a;它是许多更复杂模型的基础。 应用广泛&#xff1a;在金融、经济、生物统计学等领域有广泛应用。 构建线性回归模型 数据准备…

UNet进行病理图像分割

数据集链接:https://pan.baidu.com/s/1IBe_P0AyHgZC39NqzOxZhA?pwd=nztc 提取码:nztc UNet模型import torch import torch.nn as nnclass conv_block(nn.Module):def __init__(self, ch_in, ch_out):super(conv_block, self).__init__()self.conv = nn.Sequential(nn.Conv2d…