Chinaunix首页 | 论坛 | 博客
  • 博客访问: 27264
  • 博文数量: 12
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 82
  • 用 户 组: 普通用户
  • 注册时间: 2015-11-30 14:36
文章分类

全部博文(12)

文章存档

2016年(7)

2015年(5)

我的朋友

分类: 嵌入式

2016-09-20 17:59:22

RAM 文件系统结构

点击(此处)折叠或打开

  1. struct filestate {
  2.   int flag;    /**< 文件是否开启标志*/
  3. #define FLAG_FILE_CLOSED 0
  4. #define FLAG_FILE_OPEN 1
  5.   int fileptr;    /**< 文件写入或读出的的位置*/
  6.   int filesize;   /**< 文件中存储的数据长度*/
  7. };

打开文件系统


点击(此处)折叠或打开

  1. int cfs_open(const char *n, int f)
  2. {
  3.   if(file.flag == FLAG_FILE_CLOSED) {
  4.     file.flag = FLAG_FILE_OPEN;
  5.     if(f & CFS_READ) {
  6.       file.fileptr = 0;  /**< 只读,从文件头部开始读*/
  7.     }
  8.     if(f & CFS_WRITE){
  9.       if(f & CFS_APPEND) {
  10.     file.fileptr = file.filesize;  /**< 追加,从上次写入的位置追加*/
  11.       } else {                     /**< 只写,从头开始写*/
  12.     file.fileptr = 0;
  13.     file.filesize = 0;
  14.       }
  15.     }
  16.     return 1;
  17.   } else {
  18.     return -1;
  19.   }
  20. }
文件有三种方式打开,读,写,追加;分别为CFS_READ;CFS_WRITE;CFS_WRITE | CFS_APPEND(追加)。问价打开成功返回文件描述,否则返回-1.
调用cfs_open以只读方式打开文件,则是从文件头开始读,如果想要指定读的位置需要调用cfs_seek。如果以只写的方式打开,则每次就是从头开始写,可调用cfs_seek函数修改写的位置;追加则是从上一次的尾部开始写入数据。

关闭文件系统


点击(此处)折叠或打开

  1. void cfs_close(int f)
  2. {
  3.   file.flag = FLAG_FILE_CLOSED;  /**< 修改文件系统状态*/
  4. }

寻找文件系统中特定位置


点击(此处)折叠或打开

  1. cfs_offset_t cfs_seek(int f, cfs_offset_t o, int w)
  2. {
  3.   if(w == CFS_SEEK_SET && f == 1) {
  4.     if(o > file.filesize) {  /**< 追寻的位置比文件系统中的数据个数多,调整追寻的位置。注意此函数智能在同一个进程中调用,因为在另一个进程中调用open会把缓存长度清0*/
  5.       o = file.filesize;   
  6.     }
  7.     file.fileptr = o;     /**< 成功返回当前的位置*/
  8.     return o;
  9.   }
  10.   return (cfs_offset_t)-1; /**< 失败*/
  11. }

文件系统写

点击(此处)折叠或打开

  1. int cfs_write(int f, const void *buf, unsigned int len)
  2. {
  3.     /**参数检查及调整写入的长度*/
  4.   if(file.fileptr >= sizeof(filemem)) {
  5.     return 0;
  6.   }
  7.   if(file.fileptr + len > sizeof(filemem)) {
  8.     len = sizeof(filemem) - file.fileptr;
  9.   }

  10.   if(file.fileptr + len > file.filesize) {
  11.     /* Extend the size of the file. */
  12.     file.filesize = file.fileptr + len;
  13.   }
  14.   
  15.   if(f == 1) {
  16.     //写入,并调整下次写入的位置
  17.     memcpy(&filemem[file.fileptr], buf, len);
  18.     file.fileptr += len;
  19.     return len;
  20.   } else {
  21.     return -1;
  22.   }
  23. }
文件系统读


点击(此处)折叠或打开

  1. int cfs_read(int f, void *buf, unsigned int len)
  2. {
  3. //调整读的长度
  4.   if(file.fileptr + len > sizeof(filemem)) {
  5.     len = sizeof(filemem) - file.fileptr;
  6.   }
  7.   
  8.   if(file.fileptr + len > file.filesize) {
  9.     len = file.filesize - file.fileptr;
  10.   }

  11.   if(f == 1) {
  12. //调整下次读的位置
  13.     memcpy(buf, &filemem[file.fileptr], len);
  14.     file.fileptr += len;
  15.     return len;
  16.   } else {
  17.     return -1;
  18.   }
  19. }

注意:
在同一个进程中,读写不能轮询调用,因为读写使用同一指针。如果使用可以调用cfs_seek调整读写指针,进行写入或读出。另外不能再两个进程中调用只写,因为调用只写的时候,会把文件系统中的长度和写入读出指针全部清0 因此会覆盖前个进程的数据。
但两个进程可以,一个调用读,一个调用写(或追加)。


阅读(686) | 评论(0) | 转发(0) |
0

上一篇:contiki学习:事件管理

下一篇:没有了

给主人留下些什么吧!~~