本文简要介绍一下本人在Cortex-M3系统的STM32F10x芯片上开发的一个日志文件系统(与其说是系统,不如说是小小的库)。该库的特点是将在STM32F10x芯片上处理数据(历史记录)变得简单可靠。因为我所做的项目基本上都为监控系统,需要记录各种各样的日志,并可随时上传至中心服务器。利用该库就可以很容易的使用该接口完成数据的初始化、读取、写入和删除。而且随着该库的应用,稳定性也得到了验证,应用到其它项目中也更有底气了。本库分两部分,一部分支持内部FLASH,一部分支持外部FLASH。由于硬件设计的成本考虑,我们经常需要考虑使用内部FLASH或者外部FLASH的情况,在存储数据量不大,而选择的芯片内部FLASH空间足够时,就可以将数据存储在内部FLASH,当数据量大时,却可以选择存储在外部FLASH,对于应用程序而言,只需要修改一下宏定义来映射不同的库函数即可。

通过该库在我的项目团队中应用,感觉对于数据存储部分,大家都形成了共识,代码基本上不用考虑FLASH地址如何计算,如果确保擦写平均等……通过应用此库,并规划好空间分析,并设定,即可开始记录的操作了。

以下是关于此库的简要说明:

内部FLASH采用的是NOR FLASH,它的特点是芯片内执行,这样应用程序就可以直接在FLASH闪存内运行,不必再把代码读到系统的RAM中。日志文件系统的主要功能是以内部FLASH地址作为存储空间(直接使用内部FLASH空间,减少硬件成本),在Cortex-M3系统CPU芯片上,按页建立的一个日志文件系统。可以使用一个或者多个连续页建立一个文件系统,一个文件系统可以存储一个定长的数据,对于不定长的数据,可以按最长长度建立。日志文件系统提供统一的API接口来访问内部FLASH中的数据,同时提供了FLASH空间的平均擦除算法,提高FLASH的使用寿命。日志文件系统按记录方式进行存储,对于需要提供记录方式的应用来说,利用此文件系统可以带来很大的便利性。例如:某监控系统需要记录历史告警信息,又或某系统需要记录操作日志记录等。

内部文件系统按扇区建立记录引导表,通过扇区引导表可快速定位记录位置,同时,通过扇区记录表的信息可以快速建立文件的信息(记录数量,第一条记录位置)等。一般情况下,每个扇区为2K,为充分利用文件系统的优势,记录长度应该远小于2K,以确保合适的空间利用率。建立扇区数据存储可支持不定长记录,同时存储了数据的校验和,同时数据写入后会立马会立即校验,以确保数据成功写入,失败时会继续向后写入,以应对各种异常情况。数据存储时会写入的数据长度,读取时也会有返回写入的长度,写入时会生成校验,并在写入和读取时都会校验。

本文件系统具有任意时间掉电恢复功能,由于操作FLASH过程中,程序出现意外死机或者掉电,程序可最大限度的保障用户数据的安全,并对数据进行恢复。日志文件系统使用连续的空间作为其存储的条件,因此,在日志文件系统中的记录是有序的,不能从中间删除记录,以确保日志记录的完整性。

本说明书编写的目的是介绍内部FLASH日志文件系统包含的API函数信息、各函数的作用、各函数如何调用和它们之间的关联以及一些结构体和常数的定义。本说明可作为初级程序员使用本文件系统的程序员在使用FLASH时的参考手册。

主要优势:

1、 日志化记录结构,方便操作和维护

2、 平均擦除算法,提高FLASH使用寿命

3、 异常掉电自恢复功能

4、 数据校验功能

5、 无需操作系统支持,简单易用

日志文件系统使用的方式非常简单,通过简单三步即可完成日志文件系统的使用。

(1)       定义一个文件描述句柄对象

定义文件描述句柄对象,是使用前必须完成的一步,该描述定义了本文件系统使用扇区开始地址(注意:不般在程序用不到的空间之外的连续空间)、使用扇区的数量、本文件的区别ID,本日志文件记录的最大数据长度,提供了上述信息之后,就已经定义好了一个日志文件了。

文件描述句柄对象一般为全局变量,一般可在文件范围内使用,同时必须保存句柄在整个程序运行期内有效。

(2)       初始化文件句柄

定义的文件描述句柄仅仅指定了文件需要使用的空间位置,日志记录大小,区别ID等信息,为正式开始使用此日志文件,需要对其进行初始化,包括扫描指定FLASH地址的各扇区,确保与文件描述句柄描述一致,当出现不一致的扇区时,将会重新初始化此扇区。同时初始化会扫描扇区分区表信息,获取扇区内记录数量。

(3)       使用文件句柄

当初始化成功后,就可以开始使用此日志文件了。包括取得日志文件中包括的记录数量,读取、删除其中的记录,向日志文件记录中添加记录等操作。

一段简单应用的示例:

// 从FLASH中加载某一配置,成功返回0,否则返回1
// 通过使用日志文件系统的方式,将可以占用一个扇区来存放配置(实际上你必须这么做-
// FLASH只能按扇区擦除),如此,当多次配置变更时,通过写入一条新的配置,并删除
// 前一条配置(置删除标志),正至配置写完整个区域,才会开始删除扇区,并开始新的写入。
// 以下示例占用一个扇区的空间作为配置空间,写的配置的大小由参数设定(cfg)
lfsin_t lfs_cfg =
{
FLASH_OFFSET_CFG, // 开始地址偏移(FLASH的偏移地址)
0, // 开始页
1, // 结束页[start, end),占用一页空间
LFS_TYPE_CFG, // 该文件系统的类型标识
sizeof(cfg_t), // 记录的日志最大大小
-1, // 用于内部表示开始的头(写的位置),不需要指定
-1, // 用于内部表示开始的尾(读的位置) ,不需要指定
0, // 可用日志记录条数,不需要指定
0 // 当前读的头位置(扇区的ID位置) ,不需要指定
}; int LoadCfg(void)
{
int rdlen;
int buf[10];
unsigned char cfg_load = 0;
lfsin_load(&lfs_cfg); // 初始化日志文件(扫描记录区) // 读取第一条记录(如果有一条配置信息),buf用来存放读出数据的缓冲区
rdlen = lfsin_read(&lfs_cfg, 0, buf, sizeof(cfg_t)) // 判断读取的数据是否符合要求
if (rdlen == sizeof(cfg_t)){
cfg_load = 1; // 成功加载配置
return 0;
}else{
cfg_load = 0; //加载配置失败
return 1;
}
}

我将在另一篇博客中详细说明具体的实现方式。

Cortex-M3 FLASH 日志文件系统的更多相关文章

  1. kernel下nand flash的文件系统总结

    1.FLASH转换层(FTL) EXt2/EXT3/EXT4文件系统可以通过FTL实现对flash的支持,因为FTL可以将闪存flash模拟成磁盘结构. 在ext2文件系统的基础上上,为了保证数据的一 ...

  2. Implementation of Serial Wire JTAG flash programming in ARM Cortex M3 Processors

    Implementation of Serial Wire JTAG flash programming in ARM Cortex M3 Processors The goal of the pro ...

  3. ext3是对ext2文件系统的一个扩展高性能日志文件系统

    嵌入式开发者所做的最重要的决定之一就是部署哪种文件系统.有些文件系统性能比较高有些文件系统空间利用率比较高,还有一些文件系统设备故障或者意外断电后恢复数据比较方便. linux文件系统概念 分区 分区 ...

  4. ARM Cortex M3(V7-M架构)硬件启动程序 一

    Cortex-m3启动代码分析笔记 启动代码文件名是STM32F10X.S,它的作用先总结下,然后再分析. 启动代码作用一般是: 1)堆和栈的初始化: 2)中断向量表定义: 3)地址重映射及中断向量表 ...

  5. 转 Linux日志文件系统及性能分析

    日志文件系统可以在系统发生断电或者其它系统故障时保证整体数据的完整性,Linux是目前支持日志文件系统最多的操作系统之一,本文重点研究了Linux常用的日志文件系统:EXT3.ReiserFS.XFS ...

  6. ARM Cortex M3系列GPIO口介绍(工作方式探讨)

    一.Cortex M3的GPIO口特性    在介绍GPIO口功能前,有必要先说明一下M3的结构框图,这样能够更好理解总线结构和GPIO所处的位置. Cortex M3结构框图     从图中可以看出 ...

  7. 日志文件系统syslog,syslog-ng

    日志文件系统syslog,syslog-ng   余二五 2017-11-07 20:37:00 浏览127 评论0 日志 LOG 配置 主机 正则表达式 syslog 表达式 source file ...

  8. ARM 架构、ARM7、ARM9、STM32、Cortex M3 M4 、51、AVR 之间有什么区别和联系?(转载自知乎)

    ARM架构:  由英国ARM公司设计的一系列32位的RISC微处理器架构总称,现有ARMv1~ARMv8种类. ARM7:       一类采用ARMv3或ARMv4架构的,使用冯诺依曼结构的内核. ...

  9. STM32学习之路入门篇之指令集及cortex——m3的存储系统

    STM32学习之路入门篇之指令集及cortex——m3的存储系统 一.汇编语言基础 一).汇编语言:基本语法 1.汇编指令最典型的书写模式: 标号 操作码        操作数1, 操作数2,... ...

随机推荐

  1. 配置NTP时间服务器

    一.安装ntp软件 1.检查是否安装了ntp相关包. rpm -qa | grep ntp 2.安装ntp软件. yum -y install ntp 二.参数讲解 ignore  :关闭所有的 NT ...

  2. 配置keil MDK和keil C51共存

    配置keil MDK和keil C51共存:1.首先安装keilMDK或者安装KeilC51其中一个:2.安装到D:\keil路径下,按照默认的配置安装,完成:3.使用管理员身份打开安装好的软件,打开 ...

  3. C# DateTimePicker控件如何精确设置显示时分秒

    项目中需要使用DateTimePicker空间选定当前的时间,但是这个空间默认显示到天,如何能让它显示具体的小时和分钟呢? 我们看到有一个Format属性,Format令我们想到格式化,有这几种格式 ...

  4. php long time(1)

    好久好久没有发表新的文章了,主要是懒得在这里写,都记在记事本上,所得都是自己理解的情况下写的,如今借此闲暇记录下来,:::: ****************PHP****************** ...

  5. Ecstore内置表单验证?

       

  6. (转)asp.net中Literal与label的区别

    asp.net中Literal与label的区别 一.Literal Web 服务器控件概述(摘于MSDN) 可以使用 Literal Web 服务器控件作为页面上其他内容的容器.Literal 最常 ...

  7. 解决CENTOS7虚拟机更改静态IP无法启动

    在linuxman的编辑中,未出现问题.反复的查看原因未果,后查明是虚拟机所致.1.在开启网络时,有错误提示:Restarting network (via systemctl):  Job for ...

  8. 禁止Windows远程桌面拷贝文件

    通过组策略,我们可以解决以上问题,开始菜单运行输入gpedit.msc,进入“计算机配置”项,按顺序进入“管理模板”.“windows组件”.“终端服务”.“客户端/服务器数据重定向”.在详细描述栏中 ...

  9. 【转】Qt之模型/视图

    [本文转自]http://blog.sina.com.cn/s/blog_a6fb6cc90101hh20.html   作者: 一去丶二三里 关于Qt中MVC的介绍与使用,助手中有一节模型/视图编程 ...

  10. linux学习第一天(X window 及 语系查询设置)

    前言: 在写这篇博文之前,我已经详细阅读了<鸟哥的Linux私房菜>,但是实践并不深入,只是单纯的为了了解常用的命令,扩展自己的知识广度.看过一遍感觉收获还是有的,但是并不是很精通.因此, ...