转自:http://www.cnblogs.com/winshton/p/4897789.html

我们知道OD(对象字典)是CANopen的核心,所有功能都是围绕它开展的,是协议栈的数据中心,良好的OD实现是协议栈高效稳定运行的基础,而OD的实现最基本的一点就是怎么去保存它。因为OD的内容比较杂,读写属性上,有只读数据、只写数据、可读写数据;保存要求上有非易失和掉电丢失两种类型;数据类型上有字符型、整型、长整型等等;存储格式上有8位、16位、32位等。其它的不管,本文现只讨论怎么利用单片机的资源去尽量满足OD的存储需求。

有人会以为这还要讨论么?只读的就放在只读存储器中,可写的就放在RAM中,需要掉电保存的就放在非易失可读写存储器中。话是这么说,但实际上问题很多,罗列如下:

1. 对协议栈只读并不表示对应用程序只读。

2.  可读写而又掉电保存的数据不能放在RAM里。

3.  频繁读写的数据不能放在非易失存储器中,因为非易失存储器往往速度慢,有写次数限制。

4.  单片机资源有限,存取方式和读写速度有限值,因此得合理利用。

既然有这些问题,我们先对OD的数据进行分析分类:

1.  系统只读参数。自节点出厂就无需更改,例如,节点硬件序列号、软硬件版本等。

2.  过程数据对象。频繁读写,掉电无需保存。例如,采集的模拟量、待输出的开关量。

3.  系统配置参数。可读写,偶尔配置,大部分时间只读。

基本上所有的OD对象都可以归到这三类中去。下面再以AVR单片机为例说说单片机的几类存储资源以及其特点:

类型

运行中读写属性

访问速度

容量

特点

FLASH

程序存储器

只读

一般

较大

操作方便但只能放程序和初始化只读数据,掉电不丢失

SRAM

数据存储器

读写

最快

操作方便,速度快,掉电数据丢失

EEPROM

数据存储器

读写

读一般,写很慢

操作复杂,写速度极慢

看到上面这个表,你会马上把OD的三类数据存放位置定下来吧,系统只读参数放在FLASH中;过程数据对象放在SRAM中;系统配置参数放在EEPROM中。

实际上确实该如此安排,但是所有问题的解决了?NO,NO,NO!OD中的数据对象是怎么安排进存储器的?系统启动怎么初始化?怎么去访问?下面提供一种方案:

出厂设置随程序一起写入FLASH,然后系统重器开始运行,在软件初始化过程中,程序将出厂默认的整个OD对象从FLASH 载入到RAM中去,不论是OD的那种分类的数据;之后如果判断是第一次运行,将用RAM中属于的统配置参数的那一类数据去初始化EEPROM,否则用EEPROM中的系统配置参数去重新覆盖对应的RAM映像。好了初始化完成,开始运行,因为所有OD数据都load到RAM中,因此OD对外可以提供统一快速的数据服务接口,外部的读操作就是直接读RAM,写则是先写RAM映像,然后再判断如果是OD的系统配置参数那一类则同时更新EEPROM。最后要注意一点就是OD的对象属性等信息一定要放在FLASH中,否则将是一个极大的RAM开销。

上面方案优点是在满足OD需求的前提下能够提供统一快速的OD访问接口;能够及时存储非易失性数据;并能在软件上实现恢复出厂设置的操作而不增加额外的出厂设置备份空间(在EEPROM中置一标志就行了,自己去想)。明显的优点也意味着明显的缺点,就是占用较多RAM空间,只读数据和非易失性数据都要映射到RAM中,浪费了一部分RAM,这将使得本来就紧张的RAM资源更加紧张,好在一般节点上的OD内容一般不多,而且现在RAM非常便宜。

上面的方案同样适用于其他单片机,基本上现在的单片机上都有FLASH和RAM,而即使有的单片机没有EEPROM,但是本身FLASH区是可以运行中在线写入的,也可以当EEPROM用(但此时最好就不要来一个写一个了,因为FLASH是页擦除的,比较耗时间,因此建议做成批量写入方式,OD的0x1010和0x1011对象有涉及),实在不行还可以外扩。

(于2007.11.08)

怎样利用好单片机上的存储器资源来实现OD的存储与访问的更多相关文章

  1. 旧文备份:怎样利用好单片机上的存储器资源来实现OD的存储与访问

    我们知道OD(对象字典)是CANopen的核心,所有功能都是围绕它开展的,是协议栈的数据中心,良好的OD实现是协议栈高效稳定运行的基础,而OD的实现最基本的一点就是怎么去保存它.因为OD的内容比较杂, ...

  2. 微信小程序连接低功率蓝牙控制单片机上硬件设备

    1.软件部分介绍 微信小程序是一种新的应用,用户不需要下载应用只用通过扫二维码或者打开链接就能使用,使用完后不需要卸载,直接关闭就行了.微信在2017年初推出微信小程序开发环境.任何企业,媒体,个人都 ...

  3. Azure DevOps(二)利用Azure DevOps Pipeline 构建基础设施资源

    一,引言 上一篇文章记录了利用 Azure DevOps 跨云进行构建 Docker images,并且将构建好的 Docker Images 推送到 AWS 的 ECR 中.今天我们继续讲解 Azu ...

  4. 单片机上使用TEA加密通信(转)

    源:单片机上使用TEA加密通信 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN7 开发环境:MDK4.72 单片机:STM32 说 ...

  5. CSDN没有审核投诉的真实性直接删除博主上传的资源

      今天打开博客,发现一条未读通知:您上传的资源* * * *因质量投诉没有通过审核,如有疑问,请联系webmaster@csdn.net 我马上去看了下我的资源下载页,资源已经被删除,积分也已清空- ...

  6. App上架流程[利用Archive进行上传]

    作者 M_Lee2016.01.22 10:47 写了14852字,被32人关注,获得了49个喜欢 [iOS]App上架流程[利用Archive进行上传] 字数2186 阅读507 评论3 喜欢9 今 ...

  7. 如何删除一个CSDN上自己上传的资源

    原文地址:http://www.xuebuyuan.com/1875216.html 昨天晚上进行测试,上传了一个压缩包和大家分享,测试完成后,为了不想给被测试的公司造成伤害,决定把上传的包删除,结果 ...

  8. 前端遇上Go: 静态资源增量更新的新实践

    前端遇上Go: 静态资源增量更新的新实践https://mp.weixin.qq.com/s/hCqQW1F8FngPPGZAisAWUg 前端遇上Go: 静态资源增量更新的新实践 原创: 洋河 美团 ...

  9. Microsoft Dynamics CRM 批量上传web资源(非官方WebResourceUtility)并替换实体图标

    背景: 去年以前可以按照目录WebResourceUtility批量上传web资源,昨天发现用不了了,拿到WebResourceUtility源码改了一下都不是很方便,感觉官方写的太冗余,太长了,跟我 ...

随机推荐

  1. WPF中使用WindowChrome美化窗口过程中的一个小问题

    WPF中使用WindowChrome美化窗口,在园子里有几篇不错的文章,我也是参考练习过程中发现的问题,并记录下来. 在看过几篇教程后,给出的窗口很多出现这样一个问题,如果设置了窗口标题栏的高度大于默 ...

  2. 【HNOI2014】米特运输

    题面 题解 首先我们需要看懂题目 然后我们需要发现一个结论 只要有一个节点的权值确定,那么整棵树的权值就确定了 就像这样:(图片来源于网络,侵删) 然后我们根据这张图片,可以设\(f[i] = a[i ...

  3. 洛谷 P1337 [JSOI2004]平衡点 / 吊打XXX

    洛谷 P1337 [JSOI2004]平衡点 / 吊打XXX 点击进入FakeHu的模拟退火博客 神仙模拟退火...去看fakehu的博客吧...懒得写了... 因为精度问题要在求得的最优解附近(大约 ...

  4. Linux下nginx编译安装教程和编译参数详解

    这篇文章主要介绍了Linux下nginx编译安装教程和编译参数详解,需要的朋友可以参考下 一.必要软件准备1.安装pcre 为了支持rewrite功能,我们需要安装pcre 复制代码代码如下: # y ...

  5. 关于判断用户输入的是不是int类型,这次没有正则表达式

    末尾没有目的地的出租车,污点证人禁止入内!!! 不同的尝试有不同的方法 关于int类型的判断,我尝试了这么一个方法,可行,只是笨 正则表达式我没有搞清楚,没办法给大家讲解,欢迎各位明白人讲解,或者是我 ...

  6. java实现哈弗曼树

    O(∩_∩)O~~ 概述 我想学过数据结构的小伙伴一定都认识哈弗曼,这位大神发明了大名鼎鼎的“最优二叉树”,为了纪念他呢,我们称之为“哈弗曼树”.哈弗曼树可以用于哈弗曼编码,编码的话学问可就大了,比如 ...

  7. 二、Unity Editor模式下,操作选中对象

    使用Unity提供的工具类 UnityEditor.Selection public static GameObject activeGameObject public static UnityEng ...

  8. Siki_Unity_3-3_背包系统

    Unity 3-3 背包系统(基于UGUI) 任务1&2&3:演示.介绍.类图分析 背包面板.箱子面板.锻造合成面板.装备佩戴面板.商店面板等 面板的显示和隐藏.保存和加载.拾起物品. ...

  9. SpringCloud 学习(二)-1 :服务注册与发现Eureka扩展

    上一篇介绍了Eureka Server的搭建跟配置.Eureka Client的搭建跟配置.服务间通过服务名调用等,还有几个实际实验中遇到的问题及处理方案,本篇来玩一下Eureka的其他配置. 上一篇 ...

  10. 零基础学Python之结构化数据(附详细的代码解释和执行结果截图)

    3结构化数据 字典(查找表).集合.元组.列表 3.1字典 是有两列任意多行的表,第一列存储一个键,第二列存储一个值. 它存储键/值对,每个唯一的键有一个唯一与之关联的值.(类似于映射.表) 它不会维 ...