由于目前.Net Micro Framework并不支持P/Invoke功能(也无法像WinCE一样开发流式驱动),所以在底层在驱动层面用C直接对存储器(Flash)进行文件系统开发是行不通的。幸好.Net Micro Framework提供了ExtendedWeakReference类,其中赋值Target对象可以把数据存放到存储器上(Flash)。
[Serializable]
privateclassFlashDatas
{
//调入数据
publicstaticbyte[]Load(uintindex)
{
ExtendedWeakReferenceewr=ExtendedWeakReference.RecoverOrCreate(
typeof(FlashDatas),//类型,任意类都可以,其名称起到一个索引作用
index,//ID号,这个数据比较有用,不同ID号代表不同数据
ExtendedWeakReference.c_SurviveBoot);//该标志和.c_SurviveBoot区别不大
returnewr.Targetasbyte[];
}
//保存数据
publicstaticvoidSave(uintindex,byte[]data)
{
ExtendedWeakReferenceewr=ExtendedWeakReference.RecoverOrCreate(typeof(FlashDatas),index,ExtendedWeakReference.c_SurviveBoot);
ewr.Target=data;
}
}
上面的代码就是ExtendedWeakReference类的具体使用,从代码可以看出我们无法直接对存储器进行读写,只能通过保存类的方式对数据进行存储,至于该数据存放到何处,那是无从得知的。
我最初的想法是定义一个类,类中定义一个大数组,不过实际调试发现,该数组不能太大,超过几十K就会出现内存溢出。幸好该对象可以是字节数组,所以我产生了另一个想法,每次保存一个512字节大小的字节数组,相当于磁盘上的一个扇区,以此为存取的最小单位,实现FAT文件系统。
测试代码如下:
privateconstuintSectorSize=512;//扇区大小
privateconstuintSecPerClus=4;//一个簇包含的扇区数
publicstaticvoidMain()
{
Debug.Print("Start");
for(uinti=0;i<512;i++)//1024*4
{
byte[]bytData=newbyte[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()+"LoadError");
//break;
//}
//else
//{
//Debug.Print(i.ToString()+"Load"+bytData[0].ToString()+""+bytData[bytData.Length-1].ToString());
//}
}
Debug.Print("Exit");
}
让我失望的是,Digi的开发板存储个数一旦超过128个就会出现读失败,新拿来的iPac-9302开发板要好一些,512个之内读写没有什么问题,超过这个数就会出现和Digi开发板一样的问题。需要说明的时,在使用读写的过程中如果不断电,读写都会成功的。一但断电重新读取,读就会失败。(当然在我测试过程中出现了各种各样不同的现象,如只能成功读取前几个)。
杜伟当初还想直接支持FAT32系统呢,目前恐怕FAT16的支持都很困难了,如果实现FAT12系统就有点不值当了。不过杜伟建议说模拟器也支持数据存储功能,所以先在模拟器中实现该功能。
没有想到,模拟器存储器最大存储仅支持1M,开始我还以为我配置参数不当呢,后来反编译了模拟器相关的核心代码,发现1M在代码中就已经写死了,相关内容如下。
反编译 Microsoft.SPOT.Emulator.dll,下面是关键代码
------------------------------------------------------------------------
//内存大小0x10000*16 = 1024*1024也就是1M空间。
publicclassFlashManager:MemoryManagerBase
{
//Fields存储空间已经写死,就是1M
privateFlashSector[]_flashSectors=newFlashSector[]{
newFlashSector(0x10000,FlashSectorUsage.Log,FlashSectorPartition.Start),
newFlashSector(0x10000,FlashSectorUsage.Log,FlashSectorPartition.None),
newFlashSector(0x10000,FlashSectorUsage.Log,FlashSectorPartition.None),
newFlashSector(0x10000,FlashSectorUsage.Log,FlashSectorPartition.None),
newFlashSector(0x10000,FlashSectorUsage.Log,FlashSectorPartition.None),
newFlashSector(0x10000,FlashSectorUsage.Log,FlashSectorPartition.None),
newFlashSector(0x10000,FlashSectorUsage.Log,FlashSectorPartition.None),
newFlashSector(0x10000,FlashSectorUsage.Log,FlashSectorPartition.End),
newFlashSector(0x10000,FlashSectorUsage.Log,FlashSectorPartition.Start),
newFlashSector(0x10000,FlashSectorUsage.Log,FlashSectorPartition.None),
newFlashSector(0x10000,FlashSectorUsage.Log,FlashSectorPartition.None),
newFlashSector(0x10000,FlashSectorUsage.Log,FlashSectorPartition.None),
newFlashSector(0x10000,FlashSectorUsage.StorageA,FlashSectorPartition.None),
newFlashSector(0x10000,FlashSectorUsage.StorageA,FlashSectorPartition.None),
newFlashSector(0x10000,FlashSectorUsage.StorageB,FlashSectorPartition.None),
newFlashSector(0x10000,FlashSectorUsage.StorageB,FlashSectorPartition.End)};
....
}
//分配内存
internaloverridevoidAllocateMemory()
{
this.ValidateFlashSectorsInternal();
uintnum=0;
for(inti=0;i<this._flashSectors.Length;i++)
{
num+=this._flashSectors[i].Length;
}
base._size=num;
base.AllocateMemory();//分配内存......
for(intj=0;j<base._size;j++)
{
base._memory[j]=0xff;
}
this.InitializeFlashSectorsInternal();
}
//分配内存
internalvirtualvoidAllocateMemory()
{
this._memory=newbyte[this._size];
this._handle=GCHandle.Alloc(this._memory,3);
}
此外模拟器在运行结束时,不能保证执行重载的UninitializeComponent函数,所以无法保存内存的数据,代码如下。
///<summary>
///Calledbytheemulatorafterallcomponentsweresetupandregistered
///</summary>
publicoverridevoidInitializeComponent()
{
base.InitializeComponent();
_form=newYFEmulatorForm(this.Emulator);
_form.OnInitializeComponent();
//LaunchtheUIthread.
ThreaduiThread=newThread(RunForm);
uiThread.SetApartmentState(ApartmentState.STA);
uiThread.Start();
//读Flash数据
EmulatorFlashPersistance.Load(this);
//必须添加这句,否则不会执行UninitializeComponent方法
Application.DoEvents();//这是我添的
}
///<summary>
///Calledbytheemulatoraftertheprogramexits
///</summary>
publicoverridevoidUninitializeComponent()//这个函数不能保证会运行
{
//保存数据
EmulatorFlashPersistance.Save(this);//所以无法保存最后的结果
Application.DoEvents();//保存数据
base.UninitializeComponent();
//WhentheMicroFrameworkisshuttingdown,informthetheWinFormapplication
//toexitaswell.
Application.Exit();
}
目前该工作的开展对我来说,实在是一个不小的挑战。由于国内研究.Net Micro Framework不多,不仅没有人进行深层次的讨论,也少见相关资料,所以.Net Micro Framework推广真是任重而道远啊。
附记:在我上两篇关于串口部署的文章又有了新的进展,最近花了300多元购买了Moxa的UPort1110 USB转串口设备(一般的杂牌子的设备大约几十元一个)还真不错,在我笔记本上终于可以直接通过串口对.Net Micro Framework进行调试了。
分享到:
相关推荐
The Microsoft .NET Micro Framework is a small and efficient .NET runtime environment used to run managed code on devices that are too small and resource constrained for Windows CE and the Compact ...
安装后,开发者可以在Visual Studio环境中集成.NET Micro Framework的开发工具,实现高效且便捷的开发流程。 总之,.NET Micro Framework 4.0 SDK为开发者提供了构建物联网和嵌入式设备应用的全面工具集,使得高级...
这本书旨在帮助读者理解和掌握如何在嵌入式系统中应用.NET Micro Framework进行高效开发。 .NET Micro Framework 是微软推出的一个轻量级的.NET运行时环境,专门设计用于资源受限的设备,如物联网(IoT)中的传感器、...
### .NET Micro Framework Key文件部署说明 #### 一、概述 .NET Micro Framework(.NET MF)是一种用于构建和运行小型嵌入式设备上的应用程序的框架。它为开发人员提供了类似于桌面版.NET Framework的功能,但针对...
6. **固件更新与调试工具**:了解如何使用JTAG或SWD接口进行调试,以及如何通过.NET MF的Update Framework实现远程固件更新。 7. **功耗优化**:在嵌入式系统中,电源管理至关重要。书中可能涉及如何在.NET MF环境...
微软的.NET Micro Framework(简称.NET MF)是一个专为嵌入式设备设计的轻量级.NET运行时环境,它允许开发者使用C#和.NET编程语言来构建和控制低功耗、资源受限的硬件系统。.NET Micro Framework 2.5 SDK是该框架的...
通过上述API,开发者可以在.NET Micro Framework环境下实现各种文件和目录的操作。不过,由于.NET MF资源有限,与桌面版的.NET Framework相比,某些高级功能可能不支持或者有不同的实现方式。在实际开发中,务必了解...
### .Net Micro Framework 移植说明文档 #### 概述 .Net Micro Framework(.Net MF)是微软为小型设备设计的一个精简版的.NET框架。它不仅继承了.NET的硬件独立性,还提供了两个关键的抽象层:硬件抽象层(HAL)与...
《Expert .NET Micro Framework》是由Jens Kühner编著的一本专著,该书深入探讨了.NET Micro Framework这一小巧而强大的嵌入式系统开发框架。.NET Micro Framework是微软推出的一个开源平台,旨在为资源有限的设备...
expert .net micro frameworkexpert .net micro frameworkexpert .net micro framework
在Windows 7(64位)系统上安装.NET Micro Framework的USB驱动是连接和调试这些设备的关键步骤。驱动程序是操作系统与硬件之间的一座桥梁,确保操作系统能够识别并正确通信。在描述中提到的"USB_Driver_X64"文件,...
本教材《GHI .NET Micro Framework培训教材》专为初学者设计,旨在介绍.NET Micro Framework及其在嵌入式系统开发中的应用。教材详细介绍了如何使用C#语言进行编程,并提供了丰富的实例来帮助读者理解和掌握.NET ...
.NET Micro Framework(简称.NET MF)是微软公司推出的一个嵌入式操作系统平台,主要设计用于资源有限的设备,如物联网(IoT)中的智能硬件、工业自动化设备和消费电子等产品。红牛开发板是一款基于.NET Micro ...
.NET Micro Framework自动化测试工具,需.NET Micro Framework3.0和.NET Micro Framework Test Kit支持...
综上所述,基于.Net Micro Framework的电动汽车充电桩控制系统是一种有效的解决方案,它克服了传统开发方式的局限,实现了更快的开发速度、更低的成本和更强的扩展能力,对于推动电动汽车充电桩技术的进步具有积极...
.NET Micro Framework(MF)是微软为嵌入式系统设计的一种软件框架,它基于.NET平台,提供了操作系统级别的功能,包括启动管理、中断处理、线程调度和内存管理等关键特性。MF设计目标是针对传统的SOC(System on ...