Coffee 文件系统

标签: 文件系统
1051人阅读 评论(0) 收藏 举报
分类:

Coffee 文件系统

一、概述

    文件系统 是一种用于向用户提供底层数据存取的机制。它将设备中的空间划分为特定大小的块(或者称为),一般每块512字节。数据存储在这些块中,大小被修正为占用整数个块。由文件系统软件来负责将这些块组织为文件和目录,并记录哪些块被分配给了哪个文件,以及哪些块没有被使用。


二、cfs-coffee

    coffee file system是由contiki团队编写,主要应用对象是有较低RAM(1K-10K)/FLASH(10K-100K)空间的无线传感网终端设备,默认配置正常运行时只需要消耗4K RAM。

    嵌入式设备上使用文件系统可以让设备更有效的利用Flash空间,更高效的存储和组织数据,在此基础上可以有更大的发挥空间,包括数据库、重编程(更新服务)的应用。


  数据库应用


三、移植

    coffee文件系统的实现源代码只有cfs-coffee.c/cfs-coffee.h两个文件,cfs.h对文件操作进行了抽象,包括open、write、read、close、remove等操作。cfs-coffee-arch.c/cfs-coffee-arch.h中需要加入平台相关的FLASH相关操作,包括read、write、erase。


【文件清单】

cfs.h                  --Coffee文件系统抽象API
cfs-coffee.c           --基于FLASH的Coffee API实现 
cfs-coffee.h           --基于FLASH的Coffee 头文件
cfs-coffee-arch.c      --FLASH读、写、擦除接口实现
cfs-coffee-arch.h      --FLASH读、写、擦除接口头文件

【关键宏】
/** 扇区大小,也可以理解为簇大小 */
#define COFFEE_SECTOR_SIZE          (4096)
/** 页大小,一个扇区包含八页 */
#define COFFEE_PAGE_SIZE            (COFFEE_SECTOR_SIZE / 8)
/** coffee 文件系统起始地址 */
#define COFFEE_START                (0x60000)
/** coffee 文件系统总大小 */
#define COFFEE_SIZE                 (128 * 1024) // 0x20000
/** coffee 文件系统结束地址 */
#define COFFEE_END                  (COFFEE_START + COFFEE_SIZE) // 0x80000

【相关接口】
/** FLASH 擦除操作,需要根据平台自己实现 */
#define COFFEE_ERASE(sector)               cfs_coffee_arch_erase(sector)
/** FLASH 写入操作,需要根据平台自己实现 */
#define COFFEE_WRITE(buf, size, offset)    cfs_coffee_arch_write((buf), (size), (offset))
/** FLASH 读取操作,需要根据平台自己实现 */
#define COFFEE_READ(buf, size, offset)     cfs_coffee_arch_read((buf), (size), (offset))

    coffee 创建文件时会对每一页的文件头进行判断,所有的标志位都是1为有效位,当系统首次运行,调用open接口试图创建文件时,由于Flash中所有数据都是0xFF,所以会导致创建失败。这使得coffee的操作流程有以下两种不同的方式:
1、文件系统格式化时,在coffee文件系统区域全部擦出并写入数据0。(STM32平台)
2、文件系统格式化时正常擦出,此时Flash中全部为0xFF,写入和读取数据时全部取反。(CC2538平台)

由于FLASH的特性是由1->0,所以后者的好处是可以大量减少擦除次数。

四、示例

int coffee_example(void)
{
    #define MSG1 "#1.hello world."
    #define MSG2 "#2.contiki is amazing!"
    #define EMPTY "empty string"
    static uint8_t msg1_len, msg2_len;
    msg1_len = strlen(MSG1);
    msg2_len = strlen(MSG2);

    /* */
    /* step 1 */
    /* */
    char message[32];
    char buf[100];
    strcpy(message, MSG1);
    strcpy(buf,message);
    PRINTF("step 1: %s\n", buf );

    /* End Step 1. We will add more code below this comment later */    
    /* */
    /* step 2 */
    /* */
    /* writing to cfs */
    char *filename = "msg_file";
    int fd_write, fd_read;
    // int n;
    fd_write = cfs_open(filename, CFS_WRITE);
    if(fd_write != -1) 
    {
        // n = cfs_write(fd_write, message, sizeof(message));
        cfs_write(fd_write, message, msg1_len);
        cfs_close(fd_write);
        PRINTF("step 2: successfully written to cfs. wrote %i bytes\n", n);
    } 
    else 
    {
        PRINTF("ERROR: could not write to memory in step 2.\n");
        return 0;
    }

    /* */
    /* step 3 */
    /* */
    /* reading from cfs */
    strcpy(buf, EMPTY);
    fd_read = cfs_open(filename, CFS_READ);
    if(fd_read!=-1) 
    {
        cfs_read(fd_read, buf, msg1_len);
        PRINTF("step 3: %s\n", buf);
        cfs_close(fd_read);
    } 
    else 
    {
        PRINTF("ERROR: could not read from memory in step 3.\n");
        return 0;    
    }

    /* */
    /* step 4 */
    /* */
    /* adding more data to cfs */
    strcpy(buf, EMPTY);
    strcpy(message, MSG2);
    fd_write = cfs_open(filename, CFS_WRITE | CFS_APPEND);  
    if(fd_write != -1) 
    {
        // n = cfs_write(fd_write, message, sizeof(message));
        cfs_write(fd_write, message, msg2_len);
        cfs_close(fd_write);
        PRINTF("step 4: successfully appended data to cfs. wrote %i bytes \n",n);
    } 
    else 
    {
        PRINTF("ERROR: could not write to memory in step 4.\n");
        return 0;    
    }

    /* */
    /* step 5 */
    /* */
    /* seeking specific data from cfs */
    strcpy(buf, EMPTY);
    fd_read = cfs_open(filename, CFS_READ);
    if(fd_read != -1) 
    {
        cfs_read(fd_read, buf, msg1_len);
        PRINTF("step 5: #1 - %s\n", buf);
        cfs_seek(fd_read, msg1_len, CFS_SEEK_SET);
        cfs_read(fd_read, buf, msg2_len);
        PRINTF("step 5: #2 - %s\n", buf);
        cfs_close(fd_read);
    } 
    else 
    {
        PRINTF("ERROR: could not read from memory in step 5.\n");
        return 0;    
    }

    /* */
    /* step 6 */
    /* */
    /* remove the file from cfs */
    cfs_remove(filename);
    fd_read = cfs_open(filename, CFS_READ);
    if(fd_read == -1) 
    {
        PRINTF("Successfully removed file\n");
    } 
    else 
    {
        PRINTF("ERROR: could read from memory in step 6.\n");
        return 0;    
    }

    return 1;
}

运行结果
Starting 'Coffee test process'
step 1: #1.hello world.
step 2: successfully written to cfs. wrote 32 bytes
step 3: #1.hello world.
step 4: successfully appended data to cfs. wrote 32 bytes  
step 5: #1 - #1.hello world.
step 5: #2 - #2.contiki is amazing!
Successfully removed file


查看评论

CoffeeScript入门

CoffeeScript 是一门编译到 JavaScript 的小巧语言. 在 Java 般笨拙的外表下, JavaScript 其实有着一颗华丽的心脏. CoffeeScript 尝试用简洁的方式展...
  • sysuzjz
  • sysuzjz
  • 2015-09-15 23:19:10
  • 2063

MTD,文件系统,存储器分区的个人理解

MTD是 memory technology device的简称 (奇怪的中文译名内存技术设备) 个人理解:MTD实际上是跟VFS差不多的东西,VFS是虚拟文件系统,在VFS中有对各种具体文件系统的接...
  • u013562393
  • u013562393
  • 2016-03-12 22:19:22
  • 1778

H5本地存储详细使用教程(localStorage + JSON数据存储应用框架)

H5本地存储有两个API,一个是Web Storage,还有一个是Web SQL。不管是哪一个,都是基于JavaScript语言来使用,接下来我就教你怎么使用H5本地存储,本文篇幅较大,JS代码较多,...
  • a727911438
  • a727911438
  • 2017-01-09 17:26:49
  • 27547

H5存储(web Storage和web SQL)

一、Web Storage教程 1、概述: 对于Web Storage来说,实际上是Cookies存储的进化版。如果了解Cookie的人几乎一看Web Storage就会用,如果你从来没用...
  • gaomengwang
  • gaomengwang
  • 2017-07-07 10:18:51
  • 1515

Coffee 文件系统

一、概述     文件系统 是一种用于向用户提供底层数据存取的机制。它将设备中的空间划分为特定大小的块(或者称为簇),一般每块512字节。数据存储在这些块中,大小被修正为占用整数个块。由文件系统软件...
  • xianrenqiu90
  • xianrenqiu90
  • 2016-08-31 13:23:05
  • 1051

监听目录 <em>coffee文件</em>变化 vbs实现

于是自己写了个vbs脚本,监听某目录下所有<em>coffee文件</em>,如有变化自动编译。原理是无限循环扫描目录,比对<em>coffee文件</em>MD5值是否变化,不等则执行dos命令编译。需要的人可以...
  • 2018年04月09日 00:00

coffee编译coffee到js

coffee -c -o destination(directory)  original(coffee file) 例子: coffee -c -o /home/user/Desktop /...
  • u014788227
  • u014788227
  • 2015-11-27 16:11:59
  • 871

coffee在nodejs端的调试

coffee对javascript语言重新定义了语法,它比后者更简洁,很多开发者在用。其实他最终还是要靠解析器解析为javascript后才能在浏览器或后端运行。 如果nodejs后端是用coffe...
  • taoerchun
  • taoerchun
  • 2016-08-15 21:49:49
  • 877

下载,上传,文件 C# .net

1.将下载的文件的路径,放到form下的隐藏标签,设置value的值为下载文件的路径。 2.将存放下载文件路径的form进行submit()。 3.后台接收文件路径,解码,使用webutility...
  • cherish1forever
  • cherish1forever
  • 2016-11-04 09:46:13
  • 223

Grunt安装及Gruntfile.js介绍

什么是Grunt?Grunt是基于Node.js的项目构建工具。它可以自动运行你所设定的任务。Grunt拥有数量庞大的插件,几乎任何你所要做的事情都可以用Grunt实现。Npm/Node.jsGrun...
  • Anway12138
  • Anway12138
  • 2018-03-06 11:00:39
  • 66
    个人资料
    等级:
    访问量: 3万+
    积分: 289
    排名: 27万+
    文章分类
    文章存档
    最新评论