初级会员

- 积分
- 109
- 金钱
- 109
- 注册时间
- 2014-9-18
- 在线时间
- 0 小时
|
5金钱
原子哥,最近在学习您例程中的文件系统,有很多语句花了很长时间钻研还是有疑惑,恳请您给我解答一下,小弟不胜感激!
1、动态内存申请是在堆区,但您的例程中__align(4) u8 memory1[MEM1_TOTAL_SIZE];,怎么判断您定义的这个数组是在堆区?还有,为什么要__align(4) ?如果不用这一个,会有什么后果?
2、__align(4) u8 memory2[MEM2_TOTAL_SIZE] __attribute__((at(0X68000000)));,弄不懂后面的__attribute__((at(0X68000000)))
3、tfileinfo.lfsize=_MAX_LFN*2+1;但#define _MAX_LFN 255,已经超过文件名的最大长度了?_MAX_LFN*2后面为什么还要加1?
4、我发现您例程中W25Q64和SD卡都是使用SPI2,不会相互干扰吗?
5、您在配置SPI的GPIO时,为什么把MISO引脚也配置为推挽输出?,这个引脚不是输入引脚吗?
6、如果一个长文件名是luruichaoshiygezhgoubbdsbs.bmp的话,在f_readdir(&picdir,&picfileinfo);之后,短文件名fname[]是不是=oubbdsbs.bmp?
7、一个文件打开之后要及时关闭,但文件夹为什么不用?(您的例程中,多次打开同一个文件夹,但没有关闭)
8、动态内存申请之后要及时释放,可我发现您的代码中有一段没有
u16 pic_get_tnum(u8 *path)
{
u8 res;
u16 rval=0;
DIR tdir; //临时目录
FILINFO tfileinfo; //临时文件信息
u8 *fn;
res=f_opendir(&tdir,(const TCHAR*)path); //打开目录
tfileinfo.lfsize=_MAX_LFN*2+1; //长文件名最大长度
tfileinfo.lfname=mymalloc(SRAMIN,tfileinfo.lfsize); //为长文件缓存区分配内存
if(res==FR_OK&&tfileinfo.lfname!=NULL)
{
while(1)//查询总的有效文件数
{
res=f_readdir(&tdir,&tfileinfo); //读取目录下的一个文件
if(res!=FR_OK||tfileinfo.fname[0]==0)break; //错误了/到末尾了,退出
fn=(u8*)(*tfileinfo.lfname?tfileinfo.lfname:tfileinfo.fname);
res=f_typetell(fn);
if((res&0XF0)==0X50)//取高四位,看看是不是图片文件
{
rval++;//有效文件数增加1
}
}
}
return rval;
}
|
最佳答案
查看完整内容[请看2#楼]
1,不是堆区。这个概念你看这个帖子:http://www.openedv.com/posts/list/24152.htm。__align(4)是四字节对齐,不这么做,后果就是有时候用sprintf等需要字节对齐的函数,会莫名其妙死机。或者结果不正确。
2,学会百度学习。
3,长文件名用UNICODE表示,一个字符的UNICODE码占2字节,255个就是255*2,最后的+1用来存放结束符。
4,分时复用,不干扰。
5,很明显不需要,否则我例程无法正常运行。
6,这个请自己动手得出答案。
7, ...
|