由于目前.Net Micro Framework并不支持P/Invoke功能(也无法像WinCE一样开发流式驱动),所以在底层在驱动层面用C直接对存储器(Flash)进行文件系统开发是行不通的。幸好.Net Micro Framework提供了ExtendedWeakReference类,其中赋值Target对象可以把数据存放到存储器上(Flash)。 [Serializable] private class FlashDatas { //调入数据 public static byte[] Load(uint index) { ExtendedWeakReference ewr = ExtendedWeakReference.RecoverOrCreate( typeof(FlashDatas), //类型,任意类都可以,其名称起到一个索引作用 index, //ID号,这个数据比较有用,不同ID号代表不同数据 ExtendedWeakReference.c_SurviveBoot);//该标志和.c_SurviveBoot 区别不大 return ewr.Target as byte[]; } //保存数据 public static void Save(uint index, byte[] data) { ExtendedWeakReference ewr = ExtendedWeakReference.RecoverOrCreate(typeof(FlashDatas), index, ExtendedWeakReference.c_SurviveBoot); ewr.Target = data; } }
上面的代码就是ExtendedWeakReference类的具体使用,从代码可以看出我们无法直接对存储器进行读写,只能通过保存类的方式对数据进行存储,至于该数据存放到何处,那是无从得知的。 我最初的想法是定义一个类,类中定义一个大数组,不过实际调试发现,该数组不能太大,超过几十K就会出现内存溢出。幸好该对象可以是字节数组,所以我产生了另一个想法,每次保存一个512字节大小的字节数组,相当于磁盘上的一个扇区,以此为存取的最小单位,实现FAT文件系统。 我们知道要实现FAT16系统一般至少需要4M存储空间,实现FAT32一般需要256M空间以上。所以我简单的做了一个程序,在实际硬件中测试一下存取1024*4个512字节的数组内存是否可行。 测试代码如下: private const uint SectorSize=512; //扇区大小 private const uint SecPerClus = 4; //一个簇包含的扇区数
public static void Main() { Debug.Print("Start"); for (uint i = 0; i < 512; i++) //1024*4 { byte[] bytData = new byte[SectorSize]; bytData[0] = (byte)(i % 256); bytData[bytData.Length - 1] = bytData[0]; FlashDatas.Save(i, bytData); Debug.Print(i.ToString() + " Save " + bytData[0].ToString() + " " + bytData[bytData.Length - 1].ToString()); //byte[] bytData = FlashDatas.Load(i); //if (bytData == null) //{ // Debug.Print(i.ToString() + " Load Error"); // break; /
|