怎样利用好单片机上的存储器资源来实现OD的存储与访问
轉自: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的存储与访问的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Noip模拟By yxj】
- 下一篇: 使用DFS求任意两点的所有路径