这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » MicroFAT​​:微控制器的文件系统

共2条 1/1 1 跳转至

MicroFAT​​:微控制器的文件系统

助工
2018-08-16 11:36:00     打赏

文件系统非常适合处理数据和组织内存,但大多数文件系统需要大量内存。这就是MicroFAT的用武之地!

标准文件系统的问题

微控制器正在成为许多爱好者的电子项目的核心,也是整个电子设计的标准。随着项目复杂性的增加和物联网的引入,不久之后微用户也需要增加微控制器的功能。 

微控制器的常见用途是记录来自传感器的数据,例如温度,湿度和其他刺激。此数据可以流式传输到I2C EEPROM,然后在将此数据发送到外部服务器(通过IoT)时读回。如果用户希望存储单独的数据实例(例如,一天中的不同时间),则存储器需要包含关于数据发送时间和存储器组织方式的信息。

虽然用户可以设计一个系统来处理这些问题,但实现FAT等文件系统会更容易。但是,由于存储器的要求,许多微处理器无法使用FAT文件系统。

例如,在PIC范围内使用FAT32需要高达12KB的程序存储器,2KB的数据存储器。FAT16和FAT32也不适用于8位系统,并且包含许多不必要的元数据(文件创建日期,权限等)。

由于文件系统供微控制器和串行存储器之间的私人使用,因此系统不需要与PC标准兼容。如果要在微控制器和PC之间传输文件,那么在Visual C#,C ++或BASIC中创建的简单应用程序可以将字节流入,然后保存到文件中。

MicroFAT是目前正在开发的用于8位设计的标准,其重点在于低内存使用,更小的块大小和更简单的接口。例如,MicroFAT标准设计用于串行存储器,因此不需要当前工作目录的RAM副本(否则需要额外的256字节)。这是因为串行存储器拥有自己的内部地址,因此任何文件操作只需要将内存地址设置为目录位置并逐字节地传输数据。

 

通用布局

MicroFAT系统可以使用两种存储器模型:绝对地址和块地址。由于文件系统中的所有地址都使用16位数编码,因此最大位置数为65,535。因此,这允许64KB(当地址指向单个字节时)或16MB(具有256字节块大小)。

绝对寻址具有将文件大小存储到字节值(例如10个字节)的优点,而块地址模型只能将文件大小存储为块(不适合文件流)。较大的内存模型还要求为当前块中的各个字节存储当前地址指针,但优点是内存量显着增加。

为了实现,本文将MicroFAT的绝对寻址模式视为I2C串行存储器,通常范围为1KB至64KB。 

所有16位值都是小端形式,这意味着16位数的下部首先存储在存储器中,然后存储上部。下面给出一个例子:

数字0x5ADA存储在存储单元0x0010中。这意味着存储单元0x0010的编号为0xDA,存储单元0x0011的编号为0x5A。

 

内存块

内存被分成256个字节的块,这使得寻址非常容易。由于大多数FAT操作涉及块,64KB被分成256个块,因此只需要一个8位计数器来指向系统中的块。 

 

 

内存中的第一个块是根目录,用于存储有关位图位置和设备大小的信息。它还可用于指示有关文件系统的引导选项和其他配置数据。

 

位图块

当操作需要内存中的块时,它不能使用正在使用的块。一个块专门用于存储器的最末端,它记录每个单独块的状态:该块称为位图块。其目的是跟踪块的状态,例如它当前是否正在使用或损坏(无法使用ICfans)。由于每个块由1字节表示,因此用户可以将附加信息编码到位图系统中(例如,保留/系统/引导)。

位图的位置需要位于内存的最末端,其位置必须存储在根目录的条目0中。

由于MicroFAT有两种内存模型(绝对和块),因此位图的编码如下所示。

  • 绝对寻址:每个块由一个字节表示

    • 位0 - 块正在使用中

    • 位1 - 块已损坏

    • 位2:7 - 未使用(免费为用户提供)

  • 块寻址:每个位图字节代表8个块。每个位指示该块是否在使用中。损坏的内存无法编码。

 

 

目录

目录长度为256个字节(1个块),最多可容纳16个条目。第一个条目(FAT INFO)存储有关当前目录的信息,其中包括父目录的块位置(在上升目录时很有用)和当前目录块位置。根目录在其FAT INFO中包含额外的4个字节:设备大小和位图位置。 

 

 

文件和目录条目

所有条目(目录和文件)的长度均为16个字节(与FAT中所需的32个字节不同)。每个目录最多包含15个文件/文件夹,前16个字节用于目录信息。

 image.png

 


由于每个条目的长度只有16个字节,因此很容易获得具有地址高4位的特定条目。添加0x10然后执行逻辑并使用0xF0将进入下一个条目或第一个条目(如果数字溢出)。下面是获取Z80汇编程序中下一个文件的示例:

 image.png


以下是测试根目录的示例,该目录显示位图位置,设备大小和一些条目:

 

 

文件存储 - 链接列表

文件使用链表系统,其中块的最后两个字节指向要加载的下一个块。如果块指针是0x0000,则到达文件的末尾,因为块0x0000指的是作为保留块的根目录。这意味着块中的可用数据实际上是254个字节。这样做的好处是不需要一个文件块所有权表,并且显着减少了所需的内存量。

 

 

第一个块的位置在文件条目字节0x01和0x02中定义。字节存储在小端(与MicroFAT系统中的所有数据一样),因此,例如,如果文件块位于0x1000,则条目字节将被视为0x0001。

删除文件时,重要的是通过整个列表扫描文件以查找正在使用的块,以便位图可以释放旧块。同样重要的是,每个块的最后两个字节在被释放时被替换为0x0000,以便系统不会将文件的末尾误认为是加载下一个块。

无限循环问题

如果文件结束指针指向链中的前一个块,则链接系统可能陷入无限循环。通过保留所有已加载块的记录并将下一个块加载与表进行比较,可以很容易地创建一个检查此类循环的搜索函数。加载文件后,可以丢弃该表并释放内存。如果使用小内存模型,则内存中的单个256字节条目可以存储表比较值,并且对于任何文件都足够大(记住如何使用单个8位数指向块)。 

 

履行

目前,C中没有实现,但可以为Z80汇编程序下载初步。将来,将开发一个通用的C头+源代码,只希望用户为MicroFAT创建写入和读取功能。一个典型的例子如下:

 image.png


这使用户能够创建自己的代码来访问任何类型的串行存储器,无论是SPI,I2C还是外部微控制器。Z80汇编程序仍在进行中,但有效的函数是注释中函数名旁边的(d)。第一条指令设计用于自定义BIOS,但下面是MicroFAT调用的一组基本I2C内存调用:

 image.png


应该注意的是,为了提高速度,提供的Z80汇编程序代码将位图和当前目录的副本直接复制到RAM中。反过来,这又使用了512个字节,但是低内存实现不需要超过32个字节的RAM。如果需要当前目录名,则需要额外的32字节RAM来存储名称。但是,仅在用户可以使用键盘和显示器访问文件系统时才需要这样做。 




关键词: MicroFAT​​     半导体     ICfans     IC    

管理员
2018-08-17 10:15:34     打赏
2楼

谢谢楼主分享


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]