关闭

Coffee 文件系统

标签: 文件系统
783人阅读 评论(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


1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:26405次
    • 积分:298
    • 等级:
    • 排名:千里之外
    • 原创:13篇
    • 转载:0篇
    • 译文:0篇
    • 评论:26条
    文章分类
    最新评论