第七章 TinyOS典型应用
第二节 存储
7.2 存储
本节将对TinyOS系统中永久性(或非易失性)数据存储操作进行介绍。具体的来讲就是对flash芯片上进行存储的操作,这种数据存储方式允许节点在即使断电或者重新编程的情况下也能够保持原来的数据。针对TinyOS系统不同的数据存储类型,本节将就一下问题展开具体的介绍:
1)如何把flash芯片划分为卷,允许多种不同类型数据的存储;
2)如何使配置数据保存时间超过一个电源开/关周期(Power Cycle);
3)如何使用日志存储方式。
7.2.1 存储简介
TinyOS 2.x提供了3种基本的存储类型:小数据对象存储、循环的日志存储以及大数据对象存储。TinyOS 2.x也提供了相应的接口与组件来对底层的存储服务进行抽象。
通过一些相关接口(/tos/interfaces)与类型定义(/tos/types),我们可以大致了解到存储系统的功能。几个重要的相关文件包括:BlockRead、BlockWrite、Mount、ConfigStorage、LogRead、LogWrite和Storage.h,而组件ConfigStorageC、LogStorageC和BlockStorageC为上述接口提供了具体实现。
在不同的硬件平台,同一存储抽象的组件虽然名字相同,但实际的实现代码却可能不同。这看起来虽然繁琐,不过不用担心,因为TinyOS的编译系统会自动包含相关芯片的正确驱动。在应用开发环节,程序员不需要担心这些相关驱动的文件位置,只需知道这些组件的名称即可。
如果读者对这些特定芯片的存储驱动比较好奇,以Mica2/MicaZ节点上的Atmel AT45DB系列flash存储为例,可以试着去了解它们的具体实现:
\tos\chips\at45db\ConfigStorageC
\tos\chips\at45db\LogStorageC
\tos\chips\at45db\BlockStorageC
下面是M25Pxx系列flash存储和Intel imote2 节点flash存储的具体实现。
M25Pxx系列flash:
\tos\chips\stm25p\ConfigStorageC
\tos\chips\stm25p\LogStorageC
\tos\chips\stm25p\BlockStorageC
Intel imote2节点的flash:
\tos\platforms\intelmote2\ConfigStorageC
\tos\platforms\intelmote2\LogStorageC
\tos\platforms\intelmote2\BlockStorageC
在TinyOS 2.x系统中,编译时可以用XML文件来说明flash芯片的分卷情况。这个XML文件,称作卷表(volume table),它指明了卷的名称、大小以及在flash中的起始地址。每个卷只能提供一种存储类型(如配置存储、日志存储或块存储)。存储类型定义了flash存储体上数据的物理布局。以下是一个卷表实例:
<volume_table>
<volume name="CONFIGLOG" size="65536"/>
<volume name="PACKETLOG" size="65536"/>
<volume name="SENSORLOG" size="131072"/>
<volume name="CAMERALOG" size="524288"/>
</volume_table>
该卷表定义了CONFIGLOG卷,其大小为65536B,起始位置为0B;而PACKETLOG卷的大小为65536B,起始位置则为65536B,因为前面的65536B属于CONFIGLOG卷。此外,该卷表还定义了131072B的SENSORLOG卷和524288B的CAMERALOG卷。
具体应用程序的卷表必须放在该程序的目录下,且必须命名为volumesCHIPNAME.xml,其中CHIPNAME为flash存储芯片的名称。例如,Twlos节点使用的是ST微电子公司的M25P系列flash存储体,其芯片驱动可以在“tos/chips/stm25p”目录中找到。因此,一个基于Telos平台且使用存储功能的应用程序都需要一个名为volumes-stm25p.xml文件。
注意:卷表中的size参数必须是flash芯片可擦写单元的倍数,而不同flash芯片可擦写单元的字节数可能各有不同。