转自: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)


本作品采用知识共享署名-非商业性使用-禁止演绎 3.0 未本地化版本许可协议进行许可。

转载于:https://www.cnblogs.com/shirishiqi/p/5363087.html

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

  1. 利用开发板上的RS485模块与PC机的串口通讯

    上网买的RS232转RS485的接口迟迟没有送到,程序又着急写,所以本人就利用开发板上现有的资源实现了一个简单的转化功能 本人利用的开发板资源:RS485模块(MAX 485芯片),U软串(PL230 ...

  2. 单片机c语言using,C语言在8051单片机上的扩展(interrupt、using关键字的用法)

    C语言在8051单片机上的扩展(interrupt.using关键字的用法) 直接访问寄存器和端口 定义 sfr   P0 0x80 sfr    P1 0x81 sfr    ADCON; 0xDE ...

  3. 利用51单片机+hc595芯片配合在led点阵上玩贪吃蛇 第一篇“显示贪吃蛇”

    利用51单片机+hc595芯片配合在led点阵上玩贪吃蛇 第一篇"显示贪吃蛇" 完整的项目链接: https://github.com/linxinloningg/51_chip_ ...

  4. 利用51单片机+hc595芯片配合在led点阵上玩贪吃蛇 第二篇“自动运行函数”

    利用51单片机+hc595芯片配合在led点阵上玩贪吃蛇 第二篇"自动运行函数" 完整的项目链接: https://github.com/linxinloningg/51_chip ...

  5. stm32f103c8t6+ESP8266利用onenet平台上传数据到云平台,再利用云平台远程下发命令给单片机控制LED灯亮灭

    stm32f103c8t6+ESP8266利用onenet平台上传数据到云平台,再利用云平台远程下发命令给单片机控制LED灯亮灭 接触stm32已经有一年半的时间了,从最开始的stm32F103ZET ...

  6. uIP TCP/IP协议栈在51系列单片机上的应用

    uIP 协议栈是一种免费的可实现的极小的TCP/IP协议栈,可以使用于由8位或16位微处理器构建的嵌入式系统.本文分析了uIP协议栈的结构和应用接口,并讨论了如何将其应用到51系列单片机上. 关键字: ...

  7. 对存储还搞不清楚,先看看这篇文章-从51单片机上去理解存储器

    存储器是许多存储单元的集合,存储器单元实际上是时序逻辑电路(锁存器)的一种,按单元号顺序排列.每个单元由若干二进制位构成,以表示存储单元中存放的数值,这种结构和数组的结构非常相似.按存储器的使用类型可 ...

  8. (15)FPGA面试题存储器资源区别

    1.1 FPGA面试题存储器资源区别 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题存储器资源区别: 5)结束语. 1.1.2 本节引言 "不积 ...

  9. 单片机中存储器扩展位地址线怎么算_51单片机外部扩展存储器时,分时复用做数据线和低8位地址线的是( )...

    [单选题]AT89C51单片机的P3.4脚功特殊能( ) [简答题] [判断题]读风玫瑰图时,它的f风向中心吹向外缘. [简答题](16.0分) [判断题]项目建议书仅是项目建设轮廓的一个初步研究,批 ...

最新文章

  1. 号称下一代监控系统?
  2. http php mysql_apache+php+mysql
  3. SharePoint 2013: The New Web Application button is disabled is the central administration
  4. One Day-XML:XSLT
  5. ASP获取地址栏URL地址方法
  6. Python全栈开发之路 【第六篇】:Python基础之常用模块
  7. Python基础知识(第四天)
  8. XCode 4.2(4.1)真机调试及生成IPA全攻略
  9. java fangfa_java 集合
  10. android thread实例
  11. c语言学生成绩查询系统2018,南昊网上阅卷学生成绩查询系统
  12. Mac上时钟也能自定义的方法你知道吗
  13. double 保留两位小数
  14. 《企业安全软件能否免费?》 ——百位中国CIO对免费企业级信息安全软件的态度调查报告...
  15. fastjson 序列化 不包括转义字符_fastjson再次发现漏洞,可能发生OOM导致宕机
  16. 追MM与23种设计模式
  17. WebService工具类调用远程接口服务时java.io.IOException: Server returned HTTP response code: 500 for URL XXX
  18. 黄聪:mysql 存在该记录则更新,不存在则插入记录的sql
  19. 前期拍摄注意的简要几点,总结了一哈,与大家分享!
  20. U盘修复,U盘量产教程(以台电晶彩NCU,容量为32G的U盘为实例)by aser

热门文章

  1. Framework中网络定位服务简介
  2. 一个例子让你了解Java反射机制
  3. w3c的html4.0规范,W3C标准以及规范
  4. python编写函数_python函数式编程
  5. python双精度浮点数怎么写_Python双精度浮点数运算并分行显示操作示例
  6. html5 如何局部放大,【HTML5特效】挺简单的HTML5放大效果
  7. mysql 5.5 barracuda_MySQL Antelope和Barracuda的区别分析
  8. [JLOI2011]不重复数字
  9. 2017年11月01日普及组 I Like Matrix!
  10. luogu P4512 多项式除法 (模板题、FFT、多项式求逆)