SDO是CANopen协议中最复杂的一部分,带有应答机制,有多种传输方式,并且完整的SDO功能节点需提供1个SDO server和多个SDO client,因此SDO的实现异常困难,协议多种传输方式的解析处理还有迹可循,多个SDO client服务和多个对SDO server的访问的协调就不容易了,这里介绍一种方法——SDO线程来解决。

注意,这里的线程可不是操作系统提供的多线程技术,况且为保证协议栈良好的移植性,在CANopen协议栈核心代码里中也不好去调与操作系统相关的库函数。我们这里的SDO线程只是借鉴了操作系统多线程机制的一套SDO服务处理方法,每个SDO线程表示的是与网络上其他节点建立的一个SDO链接,相当于在两个节点间建立一个SDO通讯路径,其中每个节点都拥有一个对这个路径的描述,在该节点看来好像建立了一个线程来负责这个路径(但决不会真的创建一个系统线程),在通讯过程中双方通过这个路径来交流,SDO通讯结束则释放该线程,每个节点可以同时与多个节点建立多个这样的路径和互不影响,就如同操作系统的线程机制一样的效果。我们知道每建立一个线程都会生成一个描述线程属性的参数表和一些私有数据,类似的,SDO线程的建立也会初始化一个对应的参数和数据结构体——SDO线程参数表,以之来描述这个SDO链接的属性并提供私有通讯数据的存储。

SDO线程参数表可以说是SDO线程的核心,所有SDO线程的建立、删除和SDO通讯都要涉及到这个参数表。参数表内容包括能够描述一个SDO访问过程的所有参数,这里不详述。

一次SDO访问是这样完成的。首先SDO发起节点(SDO client)收集足够的信息,建立一个SDO线程,说白了就是初始化SDO线程参数表,将收集的信息以特定格式放入参数表,形成一帧SDO请求,发送出去。SDO服务节点(SDO server)收到这帧请求,为它建立一个SDO线程,将这帧请求分析分解以获得足够信息来初始化这个SDO线程对应的参数表,然后程序就会按照参数表的描述去执行server的功能收集数据来满足这个SDO请求,然后将收集到的数据形成SDO应答帧返回给SDO client,如果此次请求结束则释放该线程,否则等待下一帧请求到来;SDO client在收到应答后判断该请求是否还有后续请求,无则释放此SDO线程。如果在这个过程中,SDO server 和SDO client所在节点有收到其他节点的SDO请求或需要通过SDO请求其它节点,则新建SDO线程来实现,跟上面的步骤一样,这样就可以实现多个SDO server和SDO client服务都得到实现而互不干扰,相当于双向多线铁路,可比单线爽多了。

该方法已在单片机下实现,效果还不错。

(于2007.11.6)

最新文章

  1. getStyle(obj, attr)兼容获取css
  2. PHP5.5.13 + Apache2.4.7安装配置流程详解
  3. 每天一个linux命令(14):head 命令
  4. 关于oracle with as用法
  5. PowerShell 常用命令
  6. linux源代码阅读笔记 find_entry分析
  7. easyui验证扩展
  8. jsp中的tag与tld
  9. qt 打包发布 获取dll
  10. vue.js 精学记录
  11. HDU 5288 OO’s Sequence
  12. jmeter获取mysql数据并作为请求参数使用
  13. python数据类型之内置方法
  14. [转]Nginx 502 PHP LNMP 502 终极解决方案 完美解决502 用 upstream 和 fastcgi_next_upstream 可以极大缓解
  15. SSM项目的数据库密码加密方案
  16. GitHub支持的Markdown语法 GitHub Flavored Markdown
  17. C语言——<算法>_冒泡算法的使用及理解
  18. Activiti5第一天——待更新
  19. 洛谷 U14475 部落冲突 【比赛】 【树链剖分 + 线段树】
  20. Mongodb 备份 还原 导出 导入 等批量操作

热门文章

  1. battery-historian结果分析
  2. 数据库版本管理工具flyway
  3. if else 选择机构 _多重if选择机构_if选择结构嵌套(综合练习题——code)
  4. spark常用算子总结
  5. UGUI 用脚本动态改变Button颜色组合
  6. [转]JS对JSON的操作总结
  7. 使用mspaint查看图片像素
  8. MVC 模型过滤
  9. JS获取前一个页面
  10. Value cannot be null. Parameter name: source