SOEM源码解析——ecx_init_context(初始化句柄)

0 工具准备

1.SOEM-master-1.4.0源码

1 ecx_init_context函数总览

/*** @brief 初始化句柄* @param context 句柄*/
void ecx_init_context(ecx_contextt *context)
{int lp;*(context->slavecount) = 0;/* clean ec_slave array *//* 清空从站信息数组 */memset(context->slavelist, 0x00, sizeof(ec_slavet) * context->maxslave);memset(context->grouplist, 0x00, sizeof(ec_groupt) * context->maxgroup);/* clear slave eeprom cache, does not actually read any eeprom *//* 清空EEPROM缓存,实际上不读取任何EEPROM */ecx_siigetbyte(context, 0, EC_MAXEEPBUF);for(lp = 0; lp < context->maxgroup; lp++){/* default start address per group entry *//* 设置每个组条目的默认起始地址 */context->grouplist[lp].logstartaddr = lp << EC_LOGGROUPOFFSET;}
}

从以上代码可以看出,ecx_init_context的工作主要分为3块:
(1)初始化从站、分组列表
(2)清空EEPROM缓存
(3)初始化从站分组逻辑起始地址

1.1 初始化从站、分组列表

SOEM源码使用memset函数将从站、分组列表内容全部设置为0x00,相关语句如下:

memset(context->slavelist, 0x00, sizeof(ec_slavet) * context->maxslave);
memset(context->grouplist, 0x00, sizeof(ec_groupt) * context->maxgroup);

1.2 清空EEPROM缓存

SOEM源码通过ecx_siigetbyte函数去读取EEPROM,ecx_siigetbyte函数原型如下:

/** Read one byte from slave EEPROM via cache.通过从站EEPROM缓存区读取一个字节*  If the cache location is empty then a read request is made to the slave. 如果读取的缓存区为空则向从站发起读取*  Depending on the slave capabilities the request is 4 or 8 bytes.*  @param[in] context = context struct 句柄*  @param[in] slave   = slave number 从站序号*  @param[in] address = eeprom address in bytes (slave uses words) EEPROM数据地址(从站使用字为单位)*  @return requested byte, if not available then 0xff 读取结果,如果不可用则返回0xff*/
uint8 ecx_siigetbyte(ecx_contextt *context, uint16 slave, uint16 address)

ecx_init_context函数传入该函数的参数2为0、参数3为EC_MAXEEPBITMAP
(1)当传入的slave不是EEPROM缓存数据从站拥有者时,就会清空EEPROM缓存区。相关语句如下:

/* cache里的EEPROM数据不属于传入从站 */if (slave != context->esislave){/* clear esibuf cache map *//* 清空esibuf指向的EEPROM缓存区*/memset(context->esimap, 0x00, EC_MAXEEPBITMAP * sizeof(uint32));/* 将EEPROM cache所属从站设置为传入从站*/context->esislave = slave;}

其中context->esislave的初始值为0,如果有从站的EEPROM被读取到缓存区,则该值>0。这样当重复初始化从站时便会将之前读取到的EEPROM缓存区清空。简单来说,该语句可以保证context->esislave的值为0,这样后续有人使用到该函数都会因为slave不等于context->esislave从而绕过缓存区去直接读取EEPROM获取EEPROM数据。
(2)当传入的address大于等于EC_MAXEEPBUF不会进行任何操作,这样便完成了EEPROM缓存区的清空操作。相关语句如下:

if (address < EC_MAXEEPBUF){......}

1.3 初始化从站分组逻辑起始地址

这里按顺序为每个从站分组逻辑起始地址设置为0 * 65536、1 * 65536…n * 65536,这样相当于每个分组逻辑寻址空间大小为64KB,这恰好等于ESC支持的最大DPRAM存储空间:64KB。这样大的逻辑寻址空间对于每一个分组来说都绰绰有余,实际的应用中单个从站PDO一般仅几十字节。
在这里插入图片描述
相关语句如下:

for(lp = 0; lp < context->maxgroup; lp++){/* default start address per group entry *//* 设置每个组条目的默认起始地址 */context->grouplist[lp].logstartaddr = lp << EC_LOGGROUPOFFSET;}

2 总结

ecx_init_context函数是SOEM主站在初始化网卡及端口参数后首个执行的函数,用于初始化句柄,该函数具体的工作如下:
(1)初始化从站、分组列表
(2)清空EEPROM缓存
(3)初始化从站分组逻辑起始地址

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

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

相关文章

win10设置windows永不更新

以下方法能全部设置都要全部设置。 方法一&#xff1a;Windows设置 要想关闭Win10自动更新&#xff0c;比较简单的一种方法就是进入到Windows设置中&#xff0c;将Windows更新直接关闭。步骤如下&#xff1a; 1、按“Windows I”键&#xff0c;打开Windows设置&#xff0c;再…

服务器数据恢复—Zfs文件系统下文件被误删除的如何恢复数据?

服务器故障&#xff1a; 一台zfs文件系统服务器&#xff0c;管理员误操作删除服务器上的数据。 服务器数据恢复过程&#xff1a; 1、将故障服务器所有磁盘编号后取出&#xff0c;硬件工程师检测所有硬盘后没有发现有磁盘存在硬件故障。以只读方式将全部磁盘做扇区级别的镜像备…

gcc -static 在centos stream8 和centos stream9中运行报错的解决办法

gcc -static 在centos stream8 和centos stream9中运行报错的解决办法&#xff1a; 报/usr/bin/ld: cannot find -lc 我们下载glibc-static&#xff1a; 选择x86_64的。 还有一个是libxcrypt-static&#xff0c;依旧在这个网站里搜。 rpm -ivh glibc-static-2.28-239.el8.x…

使用seldom编写http接口用例

在编写接口用例的过程中&#xff0c;针对一个接口&#xff0c;往往只是参数不同&#xff0c;那么参数化就非常有必要了。 seldom 中参数化的用法非常灵活&#xff0c;这里仅介绍file_data() 的N种玩法。 二维列表 当参数比较简单时可以试试下面的方式。 参数化数据 {"…

onnx 模型加载部署运行方式

1.通过文件路径的onnx模型加载方式: 在onnxruntime下面的主要函数:session Ort::Session(env, w_modelPath.c_str(), sessionOptions); 这里的文件路径是宽字节的&#xff0c;通过onnx文件路径直接加载模型。 在opencv下使用dnn加载onnx模型的主要函数: std::string model…

北京联通iptv组播配置

多年前折腾过iptv&#xff0c;近期搬家换了个大电视&#xff0c;打算把iptv配置好了&#xff0c;尽管不怎么看&#xff0c;但聊胜于无。 其实很简单&#xff0c;用到了一些工具&#xff0c;记录如下 1. openwrt配置 因为有软路由&#xff0c;所以就借助openwrt了&#xff0c;一…

【qemu逃逸】HITB2017-babyqemu 2019数字经济-qemu

前言 由于本地环境问题&#xff0c;babyqemu 环境都没有起起&#xff0c;这里仅仅做记录&#xff0c;exp 可能不正确。 HITB2017-babyqemu 设备逆向 设备定位啥的就不说了&#xff0c;先看下实例结构体&#xff1a; 其中 dma_state 结构体如下&#xff1a; 这里看字段猜测…

linux入门到地狱

linux—001入门 IT圈必备(前端工作者用的比较少) 老旧电脑跑linux不容易卡 我代码没保存windows闪退&#xff0c;僵停(vs2019卡掉线)&#xff0c;重启更新,占用cpu内存服务报错pip各种bug 出来生态环境友好其他的全是bug(bug时间成本超过了windows快捷友好生态) 那就说明wind…

ICP学习记录

1. 流程图 ICP&#xff08;一&#xff09;原理详解_icp原理-CSDN博客 ICP算法详解——我见过最清晰的解释-CSDN博客 ICP算法理解-CSDN博客 ICP知识点梳理笔记_icp非凸_KalutSirocco的博客-CSDN博客 【精选】【图像配准】点云配准ICP算法介绍&#xff1a;基础流程、ICP算法…

MyBatis-Plus复习总结(一)

文章目录 一、环境搭键二、基本CRUD2.1 BaseMapper2.2 插入2.3 删除2.4 修改2.5 查询 三、通用Service四、常用注解4.1 雪花算法4.2 注解TableLogic 五、条件构造器和常用接口5.1 Wrapper介绍5.2 QueryWrapper5.3 UpdateWrapper5.4 condition5.5 LambdaQueryWrapper5.6 LambdaU…

Gradle中的依赖Dependencies说明与使用总结

【1】依赖的方式 Gradle 中的依赖分别为直接依赖&#xff0c;项目依赖&#xff0c;本地jar 依赖。 dependencies {//①.依赖当前项目下的某个模块[子工程]implementation project(:subject01)//②.直接依赖本地的某个jar文件implementation files(libs/foo.jar, libs/bar.jar…

行业安卓主板-基于RK3568/3288/3588的电子班牌/人脸识别门禁/室内对讲门禁方案解决方案(二)

电子班牌 智能电子班牌可在主页实时显示班级全面的基本信息&#xff0c;包括天气、班名、课程表、值日表等&#xff0c;并发布学校通知、班级通知。学生可刷卡自动登陆系统进行课堂反馈&#xff0c;教师和家长可及时了解教学反馈&#xff0c;打通学校、教师、学生之间的互动通…

Hive 解析 JSON 字符串数据的实现方式

文章目录 通过方法解析现实示例 通过序列化实现示例 通过方法解析现实 在 Hive 中提供了直接解析 JSON 字符串数据的方法 get_json_object(json_txt, path)&#xff0c;该方法参数解析如下&#xff1a; json_txt&#xff1a;顾名思义&#xff0c;就是 JSON 字符串&#xff1b;…

elasticsearch索引按日期拆分

1.索引拆分原因 如果单个索引数据量过大会导致搜索变慢&#xff0c;而且不方便清理历史数据。 例如日志数据每天量很大&#xff0c;而且需要定期清理以往日志数据。例如原索引为sc_all_system_log&#xff0c;现按天拆分索引sc_all_system_log20220902&#xff0c;sc_all_syste…

B-DS二叉树_输出所有目标路径

Description 给定二叉树和一个整数目标targetSum&#xff0c;输出所有从根结点到叶子结点的路径总和等于targetSun的路径。 Input 第一行输入t&#xff0c;表示有t个测试样例。 第二行起&#xff0c;每一行首先输入一个整数targetSum&#xff0c;接着输入n&#xff0c;接着输…

AMD老电脑超频及性能提升方案及实施

收拾电子元件的时候找到了若干古董的CPU 其中有一个X3 440 是原来同学主板烧了之后给我的&#xff0c;我从网上配了AM2 昂达主板&#xff0c;然后又买了AMD兼容内存&#xff0c;组成了win7 64位电脑&#xff0c;用起来非常不错&#xff0c;我把硬件配置和升级过程说明下&#x…

ELK极简上手

目录 引言 首先&#xff0c;下载相关的包 其次&#xff0c;安装启动elasticsearch 下一步&#xff0c;安装并启动logstash 最后&#xff0c;安装并启动kibana 进一步的&#xff0c;测试数据的流动 引言 最近整理电脑发现之前的一篇ELK极简入门笔记&#xff0c;现整理发出…

开发小程序需要多少钱?

随着移动互联网的快速发展&#xff0c;小程序已经成为了企业、个人创业者获取用户、提升品牌影响力的重要工具。然而&#xff0c;对于许多初次接触小程序的人来说&#xff0c;开发小程序需要多少钱&#xff0c;是他们最关心的问题。 首先我们需要明确的是&#xff0c;开发小程…

【漏洞复现】Drupal_小于7.32版本 _“Drupalgeddon” SQL注入漏洞(CVE-2014-3704)

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞扫描3、漏洞验证 说明内容漏洞编号CVE-2014-3704漏洞名称Drupal “Drupalgeddon” SQL注入漏洞漏洞…

hackergame2023菜菜WP

文章目录 总结Hackergame2023更深更暗组委会模拟器猫咪小测标题HTTP集邮册Docker for everyone惜字如金 2.0Git? Git!高频率星球低带宽星球小型大语言模型星球旅行日记3.0JSON ⊂ YAML? 总结 最近看到科大在举办CTF比赛&#xff0c;刚好我学校也有可以参加&#xff0c;就玩了…