Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1003028
  • 博文数量: 153
  • 博客积分: 4195
  • 博客等级: 上校
  • 技术积分: 2631
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-22 11:32
文章存档

2012年(7)

2010年(35)

2009年(111)

分类:

2009-06-22 12:55:53

最近做了一件事情,就是把yaffslinux中拨出来移植到了实地址模式下(yaffs direct),既然是实地址,所以可以直接用在不跑操作系统的程序中,或者运行ucos, nucleus等实地址的操作系统。网上盛行的将yaffs移植到c51下就是这种方式。yaffs 为这种方式起了个名字叫yaffs dircet,其实这部分的移植只要理解了yaffs的基本框架,读一下yaffsdocuments,个人觉得难度不大,这里就不把移植过程贴出来了,如果各位有需要,可以发邮件告诉我,leeming1203@gmail.com,可以提供代码。

 

好像有点跑题了,为什么之前讲了这么一大堆关于yaffs directory的话,因为如果要真正的理解yaffs,看yaffs directory是最方便,也是最容易理解yaffs核心的方法。因为yaffs direct直接是文件系统和nandflash之间的交互,少了在linux mtd的概念,能更清晰的理解,当然核心代码是不变的。而且阅读yaffs direct还有一个好处,少去了linuxvfs的转换,可以清楚的看到怎么样来构建一个文件系统,怎么对一个文件进行读写,特别是yaffs direct可以直接用ice单步,感觉棒极了!

 

先贴一段基于yaffs direct的应用代码:

int file_rw_test(void)

{

       int a;

       int i;

       char buffer1[1000];

      

       memset(buffer1,0,sizeof(buffer1));

             

       yaffs_StartUp();

      

       yaffs_mount("/flash");

      

       a = yaffs_open("/flash/j",O_CREAT | O_RDWR , S_IREAD | S_IWRITE);

       yaffs_lseek(a,0,SEEK_SET);

       yaffs_write(a,"abcdefghijklmnopqrstuvwxyz",20);

       yaffs_lseek(a,0,SEEK_SET);

       yaffs_read(a,buffer1,20);

       printf("the read buffer is %s\n",buffer1);

      

       // if you want the data from cache to the nand, must remember yaffs_close

       yaffs_close(a);

       return 1

}

可以看到使用yaffs最最核心的函数有:

yaffs_StartUp();//对使用的yaffs分区设定

 

yaffs_mount("/flash");// /flash是在yaffs_StartUp()设定的分区,这里是把这个分区挂载上去

 

yaffs_open("/flash/j",O_CREAT | O_RDWR , S_IREAD | S_IWRITE);///flash目录下创建一个名叫j的文件。

 

yaffs_write(a,"abcdefghijklmnopqrstuvwxyz",20);//a这个文件进行写操作

 

yaffs_lseek(a,0,SEEK_SET);//移动读写的偏移量

 

yaffs_read(a,buffer1,20); //a这个文件进行读操作

 

yaffs_close(a);//yaffs 有自己的一套缓冲机制,只有yaffs_close()之后才能真正保证写入nandflash

很简单,不是么?试想一下,我们一般的操作最主要的也就是这么几条(还有一些功能,比较建立文件夹,删除文件等由于篇幅暂时不列出),因此能把这几个函数理解透了,就是把yaffs的思想基本理解了。我的笔记也将随着这个思想来进行。下一讲将是yaffs_StartUp().

阅读(3725) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~