加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

嵌入式文件系统之--【2】使用MDK自带的FlashFS

(2013-11-07 20:19:58)
分类: 技术类文档
        首先提下为什么会使用MDK自带的FlashFS呢?网上找了好多嵌入式的文件系统,大部分都是Fatfs、yaffs2等,前期使用了一下Fatfs移植到NAND上,移植地时候就发现其实是有点不相容的,Fatfs没有损耗平衡及坏块处理,这样的系统用在Nand上又有什么作用呢?再者yaffs2就更坑了,自称是专为NAND而做的,既然是为NAND而做,NAND不只用于linux等高级系统呀,还是很常用于嵌入式低端的,为什么就没怎么支持呢?网上通编都是那一两个小白鼠写的,可靠否?实在不敢用,幸好MDK神器自带了文件系统包,不过是有版权的,这东西,你懂怎么处理的!以下是我使用过程中的一些记录。

1、在工程源文件里建立一个文件夹叫"FlashFS" ,里面要放以下几个东西:File_Config.c    Retarget.c    FS_CM3.lib,它们分别在MDK安装程序的以下路径:
        File_Config.c    Retarget.c      都在    \ARM\RL\FlashFS\Config            
        FS_CM3.lib                                在     \ARM\RV31\LIB(也可以把FSN_CM3.lib加复制过来,它们间差别只在文件名长度上)
        然后把"FlashFS"的内容加入你的MDK工程里。

2、移植的工作大部分在于需要自行建立一个文件,添加Nnad的底层操作代码即可,我这边建立的是NAND_LPC177x_8x.c文件,命名你自己喜欢,主要是完成以下几个MDK自带文件系统RL-FlashFS内核接口:
static uint32_t Init         (NAND_DRV_CFG *cfg);
static uint32_t UnInit       (NAND_DRV_CFG *cfg);
static uint32_t PageRead     (U32 row, U8 *buf, NAND_DRV_CFG *cfg);
static uint32_t PageWrite    (U32 row, U8 *buf, NAND_DRV_CFG *cfg);
static uint32_t BlockErase   (U32 row, NAND_DRV_CFG *cfg);

const NAND_DRV nand0_drv = {
    Init,
    UnInit,
    PageRead,
    PageWrite,
    BlockErase
};
        RL-FlashFS的接口是做地很好的,从上面的字母意思也能猜出要实现什么,这里面重点说一说PageRead、PageWrite、BlockErase函数的参数,这也是很容易被搞混的地方,因为我使用NXP官方的Nand例程,它操作Nand是乱来的,完全没有理透数据手册。
        Nand里面有Col地址、Row地址概念,从上面的函数参数可知,只对Row地址进行了操作,即上面3个函数都是针对Nand里面的Page的绝对址址来操作的,每次操作都是以Page为单位读写,不能详细到Page里面的每个字节,即是Col地址。如果理解这意思,就不需要我在下面贴相应代码了。

3、最后是一个可有可无的函数Retarget.c,这个函数在MDK里面有自带,说白了,就是要取代微库里面的输入输出相关函数,比如printf函数,只是要增加UART接口。比如宏定义了STDIO后,sendchar、getkey函数分别代表UART的发送、接收字节函数,是需要自自己增加的。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有