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 的工业产权和类似权利的情况下使用。
 *****************************************************************************/

/**
   \file
   EtherCAT 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.mfbz.cn/a/753972.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript:实现内容显示隐藏(展开收起)功能

一、场景 点击按钮将部分内容隐藏&#xff08;收起&#xff09;&#xff0c;再点击按钮时将内容显示&#xff08;展开&#xff09;出来。 二、技术摘要 js实现实现内容显示隐藏js动态给ul标签添加li标签js遍历数组 三、效果图 四、代码 js_block_none.js代码 var group1 doc…

MySQL高级-SQL优化-小结

文章目录 1、insert 优化2、主键优化3、order by 优化4、group by 优化5、limit 优化6、count 优化7、update 优化 1、insert 优化 insert&#xff1a;批量插入、手动控制事务、主键顺序插入 大批量插入&#xff1a;load data local infile 2、主键优化 主键长度尽量短、顺序插…

webpack【实用教程】

基础配置 配置的拆分和合并 通常 webpack 的配置文件会有3个 webpack.common.js 公共配置&#xff08;会被另外两个配置文件导入并合并&#xff09;webpack.dev.js 开发环境的配置webpack.prod.js 生产环境的配置 开发环境的本地服务 在 webpack.dev.js 中配置 devServer:…

探索未来的AI革命:GPT-5的即将登场

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

柔性数组(flexible array)

柔性数组从C99开始支持使用 1.柔性数组的概念 概念&#xff1a; 结构体中&#xff0c;结构体最后一个元素允许是未知大小的数组&#xff0c;这就叫[柔性数组]的成员 struct S {int n;char arr[]; //数组大小未知(柔性数组成员) }; 柔性数组的特点&#xff1a; 结构体中柔性…

右键新建没有TXT文本文档的解决办法

电脑右键新建&#xff0c;发现没有txt了&#xff0c;我查网上办法都有点复杂&#xff0c;诸如注册表的&#xff0c;但是其实很简单&#xff0c;重启windows资源管理器就可以了。 点击重新启动&#xff0c;之后新建就有txt文档了。

Windows server 由于没有远程桌面授权服务器可以提供许可证,远程会话连接已断开。

问题现象&#xff1a; 解决办法 临时远程方式1: 打开 mstsc 时带上 /admin 等参数&#xff0c;如下图所示&#xff1a; 使用“mstsc /admin /v:目标ip”来强制登录服务器&#xff0c;但只能是管理员身份。 远程方式2&#xff1a; 通过VM远程登陆系统后&#xff0c;运行输入R…

安卓速度下载v1.0.5/聚合短视频解析下载

功能特色 短视频下载与高级管理 – 支持短视频下载&#xff0c;为您提供一系列高级视频管理功能包括视频内容提取、智能防重复技术、视频体积压缩以及视频转换成GIF图片等&#xff1b; 磁-力链接下载升级 – 现支持磁力链接下载&#xff0c;实现边下载边播放的便捷体验&#x…

LLaMA2模型训练加速秘籍:700亿参数效率提升195%!

点击蓝字 关注我们 关注并星标 从此不迷路 计算机视觉研究院 公众号ID &#xff5c; 计算机视觉研究院 学习群 &#xff5c; 扫码在主页获取加入方式 开源地址&#xff1a;https://github.com/hpcaitech/ColossalAI 计算机视觉研究院专栏 Column of Computer Vision Ins…

【深度学习】服务器炼丹代码配置、Python使用指定gpu显卡运行代码

【显卡】服务器炼丹代码配置 写在最前面一、查看哪几块显卡能用二、使用指定gpu运行代码1、指定使用GPU0运行脚本&#xff08;默认是第一张显卡, 0代表第一张显卡的id,其他的以此类推&#xff09;2、指定使用多张显卡运行脚本 三、如何使用1、单块显卡使用2、多GPU训练使用Data…

亚太杯赛题思路发布(中文版)

导读&#xff1a; 本文将继续修炼回归模型算法&#xff0c;并总结了一些常用的除线性回归模型之外的模型&#xff0c;其中包括一些单模型及集成学习器。 保序回归、多项式回归、多输出回归、多输出K近邻回归、决策树回归、多输出决策树回归、AdaBoost回归、梯度提升决策树回归…

javaSE知识点整理总结(上)

目录 一、面向对象 1. 类、对象、方法 2.面向对象三大特征 &#xff08;1&#xff09;封装 &#xff08;2&#xff09;继承 &#xff08;3&#xff09;多态 二、常用类 1.Object类 2.Array类 3.基本数据类型包装类 4.String类 5.StringBuffer类 6.Math类 7.Random…

ONLYOFFICE 8.1 桌面编辑器测评:引领数字化办公新潮流

目录 前言 下载安装 新功能概述 1.PDF 编辑器的改进 2. 演示文稿中的幻灯片版式 3.语言支持的改进 4. 隐藏“连接到云”板块 5. 页面颜色设置和配色方案 界面设计&#xff1a;简洁大方&#xff0c;操作便捷 性能评测&#xff1a;稳定流畅&#xff0c;高效运行 办公环…

恭喜!Apache SeaTunnel2024开源之夏学生中选名单出炉!

经过严格的筛选&#xff0c;开源之夏组委会及导师已经选出并录取项目对应的学生&#xff0c;社区联合中科院开展的开源之夏活动也进入到了激动人心的中选公示阶段。 在这里&#xff0c;我们恭喜下面的同学&#xff0c;已成功匹配到Apache SeaTunnel社区的项目&#xff0c;即将开…

主从复制、哨兵以及Cluster集群

目录 1.Redis高可用 2.Redis主从复制 2.1 主从复制的作用 2.2 主从复制流程 2.3 搭建Redis主从复制 2.3.1 修改Redis配置文件&#xff08;Master节点操作&#xff09; 2.3.2 修改Redis配置文件&#xff08;Slave节点操作&#xff09; 2.3.2 验证主从复制结果 3.Redis哨…

数据分析三剑客-Matplotlib

数据分析三剑客 数据分析三剑客通常指的是在Python数据分析领域中&#xff0c;三个非常重要的工具和库&#xff1a;Pandas、NumPy和Matplotlib。Pandas主要负责数据处理和分析&#xff0c;NumPy专注于数值计算和数学运算&#xff0c;而Matplotlib则负责数据可视化。这三个库相…

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

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

【python】一篇文零基础到入门:快来玩吧~

本笔记材料源于&#xff1a; PyCharm | 创建你的第一个项目_哔哩哔哩_bilibili Python 语法及入门 &#xff08;超全超详细&#xff09; 专为Python零基础 一篇博客让你完全掌握Python语法-CSDN博客 0为什么安装python和pycharm&#xff1f; 不同于c&#xff0c;c&#xff0…

NFT Insider #136:韩国将为NFT市场带来严格监管,The Sandbox DAO举办Twitter Space AMA

引言&#xff1a;NFT Insider由NFT收藏组织WHALE Members &#xff08;https://twitter.com/WHALEMembers&#xff09;、BeepCrypto &#xff08;https://twitter.com/beep_crypto&#xff09;联合出品&#xff0c;浓缩每周NFT新闻&#xff0c;为大家带来关于NFT最全面、最新鲜…

已解决javax.transaction.InvalidTransactionException:事务无效的正确解决方法,亲测有效!!!

已解决javax.transaction.InvalidTransactionException&#xff1a;事务无效的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 问题分析 报错原因 解决思路 解决方法 1. 确保事务的正确启动和结束 Spring中的事务管理 2. 避免嵌套事务问题…