OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6365|回复: 6

原子例程之文件系统学习困惑求解

[复制链接]

14

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2014-9-18
在线时间
0 小时
发表于 2014-11-9 11:42:52 | 显示全部楼层 |阅读模式
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, ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-9 11:42:53 | 显示全部楼层
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,文件夹打开可以不用关闭,早期的FATFS版本,并没有提供关闭文件夹的函数,直到R0.10才添加进来。
8,恭喜你,发现我的一个bug了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

17

主题

342

帖子

0

精华

高级会员

Rank: 4

积分
544
金钱
544
注册时间
2014-4-24
在线时间
20 小时
发表于 2014-11-9 14:09:34 | 显示全部楼层
 回复【2楼】 正点原子 :
---------------------------------
原子哥,对于问题5:
5、您在配置SPI的GPIO时,为什么把MISO引脚也配置为推挽输出?,这个引脚不是输入引脚吗?
这个脚其实应该配置为输入的。


这是官方的SPI的IO配置,主模式MISO脚应配置成浮空输入或者上拉输入。
我做这个实验时,把这个IO改成了上拉输入,完全没有问题。
当然啦,你的配置为输出,经千千万万的客户验证,也是完全没问题滴~~~~~
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-9 14:38:41 | 显示全部楼层
回复【3楼】STM32VBT6:
---------------------------------
所以我配置成推挽输出也可以用。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

14

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2014-9-18
在线时间
0 小时
 楼主| 发表于 2014-11-10 15:57:00 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
非常感谢原子哥!
回复

使用道具 举报

头像被屏蔽

6168

主题

7036

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
19705
金钱
19705
注册时间
2012-12-27
在线时间
25 小时
发表于 2014-11-13 18:52:58 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

9

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2016-4-7
在线时间
41 小时
发表于 2017-2-27 17:03:18 | 显示全部楼层
6:fname[]保存文件名的头尾
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-12 18:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表