Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1706046
  • 博文数量: 98
  • 博客积分: 667
  • 博客等级: 上士
  • 技术积分: 1631
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-27 15:59
个人简介

一沙一世界 一树一菩提

文章分类

全部博文(98)

文章存档

2021年(8)

2020年(16)

2019年(8)

2017年(1)

2016年(11)

2015年(17)

2014年(9)

2013年(4)

2012年(19)

2011年(1)

2009年(4)

分类: 嵌入式

2019-12-17 13:20:03

把以前的一些开发记录慢慢都记录在这。以便自己查找,顺便希望可以给大家带来一些帮助。

这个任务是开发单相机云台时候的事,过去大概1年多了。具体单相机云台的细节就不说了,主要说说在ucosii上的移植fatfs和简单内存池的事。这部分代码,有一部分是从正点原子代码中扣出来的,也有直接使用的,所以本着没有问题能使用就不深挖的原则,可能有的地方不够完美,错误难免。如果有侵权事宜,请联系本人:34275076@qq.com。

由于项目需求,需要在产品上的sd卡上记录gps信息的文件,所以才需要在sd卡上建立文件系统。最方便使用的应该就是fatfs了,修改简单,方便快捷。推荐指数五颗星。这部分代码网络上有不少现成的,大家可以多搜索下,应该可以找到适合自己的。找到以后,我们要做的主要是2部分工作,第一部分是:自己的应用程序读写操作fatfs的函数封装,第二部分是底层sd卡部分的修改,使得应用层的读写操作能落实在sd卡上正确执行,其它直接编译,哪有问题修改哪,一般稍微修改就用使用。在建立文件结构,写文件内容的时候,我们用到了malloc动态内存管理。我的这个c文件是直接使用正点原子提供的文件,这个文件也比较简单,大概就是下面描述的样子:
1 只实现了malloc,free,realloc函数,但是可能你使用的时候会需要对这几个函数进行封装。
2 固定block大小为32B,在内部sram中申请一块区域,统计有多少个block,后面使用的时候都是以block为基本单位进行操作的。当然也可以申请在外部ram,或者ccm,但是ccm区域只能cpu使用。具体可以参考407数据手册。
3 建立一个和block数量对应的数组表,用来标识对应block的是否使用的状态,这个主要用于申请内存和释放内存时候进行检查,0表明这个block没有使用,那么可以使用,如果是其它大于0的数,表明这block已经使用。
4 申请空间的原则是:先计算需要申请的空间需要多少个block,比如15个,然后从后往前查找block状态表,找到连续没有使用的15个block,然后修改状态标识,返回这15个block的首地址给应用程序。
5 使用完需要free时候,根据传递到free函数的起始地址,找到对应数量的block,修改使用状态,就相当于释放了内存。这里找到对应数量的block,大家可以自己看是怎么找到的,也很简单。
6 另外还实现了一个realloc函数,这个我没有使用到,这个函数可用于内存区域重新分配。另外使用得当的话,当你多次malloc后,可能内存池里连续的没有使用的block数量都很小时,你再申请大一点的内存区域,就没有足够的空闲block能用,这个可以使用realloc来调节内存池中的block顺序。

fatfs这部分内容看起来多一些,其实如果你不想深挖的话,使用也很简单。
sdio_sd.c这个文件放到工程目录的HARDWARE目录下,主要是sd卡的驱动,并且需要提供fatfs使用的接口。我主要提供了初始化,读和写函数。
diskio.c ff.c exfuns.c这三个文件都放在FATFS目录,我不使用中文,去掉了cc936文件,编译后会小很多。这三个文件需要修改的主要是diskio文件和exfuns文件,diskio文件是fatfs里的底层驱动,它封装sdio_sd里的函数,ff.c使用diskio里的函数,exfuns文件提供外部访问接口。我在这个文件里提供了下面几个函数:
mf_mount:用于挂载文件系统
mf_open:用于新建文件
mf_close:用于文件关闭
mf_write:写内容到文件
大家可以根据自己的实际要求编写这几个类似的函数,具体可以参考ff.c中提供的实例,也很简单。另外,如果你想仔细琢磨下文件系统的内部结构,什么是节点,什么是卷、目录等信息,可以详细阅读ff.c。


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