APP下载

基于Zynq7000的简易数据采集记录系统

2018-07-10陈维蛇姜文博

通信电源技术 2018年4期
关键词:扇区磁盘字节

陈维蛇,姜文博,刘 洪

(陕西长岭电子科技有限责任公司,陕西 宝鸡 721006)

0 引 言

Zynq-7000 SoC xilinx是新一代FPGA(Artix-7与Kintex-7FPGA)与Cortex-A9 ARM相结合的一款可扩展处理平台。它的可编程逻辑部分被称为PL,采用了28 nm可编程技术,使用户可以利用它进行系统可编程逻辑部分的开发;ARM部分被称为PS,为Cortex-A9双精度浮点引擎的双核ARM,集成了L1和L2缓存、DDR3控制器、以太网、串口和IIC总线等常用外设。用户可以利用它进行C语言部分开发。ARM核可以裸机运行,也可以灵活搭载Linux、VxWorks等操作系统。Zynq-7000 SoC的PL与PS部分采用AXI总线系统进行通信,xilinx公司提供了APB桥、DMA高速数据通道以及GPIO、UART等AXI总线标准外设通信模块。用户可以利用它们方便地搭载自己的可裁剪系统。

在包含Zynq7000的嵌入式系统工作过程中,有时需要记录一些系统工作过程中的数据,如AD采集的数据、系统工作状态等。如果使用标准的数据记录系统,则需要额外的硬件软件开销,无形中增加了系统的成本和复杂性。本文介绍了一种简易记录这些数据的方法。

1 系统构架

本例硬件采用AX7020和其配套的AD卡,开发环境采用VIVADO2015.4,系统结构如图1所示。

图1 系统结构

打开开发环境,建立Zynq7000工程,然后添加ARM核,在配置界面中添加SD卡和UART1。ARM核的外围设备如DMA模块、APB桥等,这里不再进行一一叙述。配置完PL部分后,编译导出硬件,打开SDK,新建hello world模板工程。之后,在XILINX TOOLS→BOARD SUPPORT PACKAGE SETTING中设置选择xilffs,版本为3.1。各参数采用默认设置。

1.1 xilffs文件系统

xilffs针对FAT32文件系统。对一个机械硬盘而言,柱面、磁头和扇区确定唯一的扇区物理地址。在数据组织上看,总是按照主引导区→引导扇区→数据→引导扇区…来排列。一块硬盘上,基本分区的最大数目为4个,大于4个的被自动分配为扩展分区。SD卡的分区结构和普通磁盘类似,沿用了普通机械硬盘的大多数概念术语。因为它无需启动,所以MBR区没有引导信息。

一个硬盘中主引导分区位于硬盘的起始扇区,共512个字节,包含了446字节的MBR和64字节的DPT,并以55 AA作为结束标志。因为SD卡不用启动,所以MBR区域不包含引导数据。SD卡的MBR为小端模式,低字节在前,其中包含了2个重要数据:偏移地址0x1C6开始的4字节决定了引导扇区DBR的位置;偏移地址0x1CA开始的4字节表示了SD卡的总扇区数。

引导扇区DBR共512个字节,以55 AA结束。前11个字节为跳转指令和文件系统类型、版本号信息。偏移地址0x0D标记每簇的扇区数。文件系统中保存数据的最小单位为簇。只要本簇中写入了当前文件的数据,它就不可以被其他文件使用。此外,偏移地址0xE~0xF标记了本分区的保留扇区数,偏移地址0x10~0x11标记了FAT表的个数,偏移地址0x24~0x27标记了FAT表的大小。

信息分区FSINFO用以记录文件系统中未使用的空闲簇的数量和下一个可用簇的簇号等信息,位于1号逻辑扇区。

从FAT表开始,是文件系统的核心内容。文件占用磁盘的最小单位是簇。即使文件只有一个字节,它也占用一个簇的磁盘空间。大文件会占用多个簇。

一个文件的数据在磁盘中并不是连续存储的。它会根据磁盘簇的占用情况被分为很多段。文件系统需要记录哪些磁盘簇已经被占用,同时需要指明一个文件中已经占用的簇的下一个簇的簇号。对于文件的最后一个簇,要指明本簇后面再没有簇被占用,类似于数据结构中的链表结构,所以被称为文件的链式存储。这些信息由FAT表来保存,FAT表分为FAT12、FAT16和FAT32。常用的FAT32表按4字节为一个表项进行分割,从2号表项开始,每个表项与磁盘数据区的簇一一对应。3号簇跟3号FAT表项映射,4号簇跟4号FAT表项映射,以此类推,直到数据区中的最后一个簇。它的内容为空闲标志、坏簇标志或者一个文件的下一个簇号。

FAT表中每簇的地址固定为32 bit,按四字节对其进行划分,并由0开始进行编号。0号和1号簇由系统保留作特殊使用,从2号簇开始,其分别对应文件系统的实际数据区簇号。FAT表中的簇地址编号与数据区的簇号相同[1]。在创建文件系统(格式化)时,所有的FAT表均被清空。FAT1和FAT2的0号、1号表项写入特定值。2号表项常为根目录,因此2号表被写入结束标志。

根目录在文件系统建立时即已被创建,目的是存储目录(也称文件夹)或文件的目录项。目录所在的扇区,都以32 Bytes划分为一个单位,每个单位称为一个目录项(DirectoryEntry),即每个目录项的长度都是32 Bytes。目录项包含了文件名、文件大小、文件类型、创建时间和修改时间等文件信息。

1.2 程序结构

首先,定义2个数据结构:

static FATFS fatfs;

FIL fil;

第一步,利用f_mount挂载SD卡,指令为:

rc=f_mount(&fatfs,"0:",0);\挂载SD卡

注意,函数中的第2个参数不能为空,必须要加上盘符,否则后续操作中将无法创建文件。

第二步,利用f_open函数打开或创建一个文件,指令为:

rc=f_open(&fil,FileName, FA_CREATE_ALWAYS|FA_WRITE);\创建文件

注意,文件名参数为短文件名,即不大于8个英文字符,长文件名系统不支持。

第三步,将文件指针移动到文件头,指令为:

rc=f_lseek(&fil,0);\移动文件指针

第四步,写数据到文件中,指令为:

rc=f_write(&fil,(void*)SourceAddress,ByteLength,&bw);\写数据

第五步,将数据更新到SD卡,指令为:

rc=f_sync(&fil);//更新数据到SD卡

如果系统采用直接断电的方法关机,需要用这条指令更新数据。这条指令的缺点在于,SD卡的写入次数是有限的,如果数据更新周期较快,由于每次更新数据都要同步更新文件大小,那么在较短时间内就会损坏目录扇区。所以,尽量使用f_close指令关闭文件。

如果需要从SD卡中读取一个文件,那么在第二步打开文件的时候需要执行:

rc=f_open(&fil,FileName,FA_READ);//打开只读文件

然后,同样执行第三步移动文件指针,然后第四步读取数据:

rc=f_read(&fil,(void*)DestinationAddress,ByteLen gth,&br);//读数据

一般可以将系统的工作模式、初始化参数等数据存储到SD卡中,以达到方便修改系统参数的目的。

2 结 论

利用Zynq7000和xilffs文件系统,可以较为方便地将系统工作过程中产生的各种数据存储到SD卡中,其连续存储速率不低于500 kb/s,也可以从SD卡中读取系统工作的初始信息,方便配置系统的工作模式和初始化参数。

[1] 何 宾 .Xilinx All Programmable Zynq-7000 SoC 设 计指南[M].北京:清华大学出版社,2013.

猜你喜欢

扇区磁盘字节
叶腊石聚合成型及其旋转磁盘的制作方法
分阶段调整增加扇区通行能力策略
No.8 字节跳动将推出独立出口电商APP
它的好 它的坏 详解动态磁盘
解决Windows磁盘签名冲突
No.10 “字节跳动手机”要来了?
空中交通管制扇区复杂网络建模与特性分析
空域扇区网络级联失效抗毁性及优化策略
轻量级分组密码Midori64的积分攻击
U盘故障排除经验谈