分类:
2014-01-23 13:36:58
原文地址:yaffs第一篇——yaffs direct综述 作者:myleeming
最近做了一件事情,就是把yaffs从linux中拨出来移植到了实地址模式下(yaffs direct),既然是实地址,所以可以直接用在不跑操作系统的程序中,或者运行ucos, nucleus等实地址的操作系统。网上盛行的将yaffs移植到c51下就是这种方式。yaffs 为这种方式起了个名字叫yaffs dircet,其实这部分的移植只要理解了yaffs的基本框架,读一下yaffs中documents,个人觉得难度不大,这里就不把移植过程贴出来了,如果各位有需要,可以发邮件告诉我,leeming1203@gmail.com,可以提供代码。
好像有点跑题了,为什么之前讲了这么一大堆关于yaffs directory的话,因为如果要真正的理解yaffs,看yaffs directory是最方便,也是最容易理解yaffs核心的方法。因为yaffs direct直接是文件系统和nandflash之间的交互,少了在linux mtd的概念,能更清晰的理解,当然核心代码是不变的。而且阅读yaffs direct还有一个好处,少去了linux下vfs的转换,可以清楚的看到怎么样来构建一个文件系统,怎么对一个文件进行读写,特别是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().