OpenEdv-开源电子网

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

新手求解,fatfs的写函数指针只能指向常量吗?如果我想写入一个变量每次的取值改怎么办?

[复制链接]

2

主题

11

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2021-11-21
在线时间
7 小时
发表于 2021-11-23 22:18:54 | 显示全部楼层 |阅读模式
1金钱

最佳答案

查看完整内容[请看2#楼]

你这样在循环里进行文件操作当然慢了。要注意:文件适合批量操作,也就是说适合一次性写入一个数组。 方案1: fopen(); for(j=0;j
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

3402

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8686
金钱
8686
注册时间
2020-5-11
在线时间
4168 小时
发表于 2021-11-23 22:18:55 | 显示全部楼层
本帖最后由 LcwSwust 于 2021-11-24 15:04 编辑
xhp123 发表于 2021-11-24 14:20
我自己觉得问题可能是出在
1.移植两个程序的时候没有避开两个例程都用到的IO口。
2.读写太慢了

你这样在循环里进行文件操作当然慢了。要注意:文件适合批量操作,也就是说适合一次性写入一个数组。

方案1:
fopen();
for(j=0;j<76800;j++)
{
......
f_lseek();
f_write();
}
f_close();

方案2:如果内存足够 ,可将for循环的数据放入数组:

for(j=0;j<76800;j++)

{
....
buf[j]=color;
}
fopen();
f_write();//写入数组buf的所有数据
f_close();
方案3:如果内存不足,将数据放入尽量大的数组,达到一定量后才存入文件:
fopen();
for()
{
......
buf[i++]=color;
if(i>=512)//达到一定量后写入
{
i=0;
f_lseek();
f_write();//写入数组buf中的所有数据
}
}
f_close();



专治疑难杂症
回复

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2021-11-21
在线时间
7 小时
 楼主| 发表于 2021-11-23 22:22:20 | 显示全部楼层
就比如,我要读取摄像头的一帧的像素值,color就是这个变量,读取完一帧320*240的图片就需要写76800次值,而这些值是不同的,该怎么做。。
回复

使用道具 举报

12

主题

3402

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8686
金钱
8686
注册时间
2020-5-11
在线时间
4168 小时
发表于 2021-11-24 11:28:51 | 显示全部楼层
上代码,没看懂“写函数指针”是个啥。为啥说它“只能指向常量”?
专治疑难杂症
回复

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2021-11-21
在线时间
7 小时
 楼主| 发表于 2021-11-24 14:10:17 | 显示全部楼层
LcwSwust 发表于 2021-11-24 11:28
上代码,没看懂“写函数指针”是个啥。为啥说它“只能指向常量”?

好像加个强制转换(u16*就行了),不过我有个新问题,想请教你一下,如下
回复

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2021-11-21
在线时间
7 小时
 楼主| 发表于 2021-11-24 14:17:39 | 显示全部楼层
我想读取一帧的像素数据,移植了原子哥的摄像头例程和fatfs实验例程,改了一下更新LCD屏的代码(即camera refresh的代码),比如我要读取第100帧的数据吗,代码放下面了,问题是单片机跑到第100帧的时候就卡住了,LCD卡在99帧的画面,我拔下SD卡,在电脑上查看文件,倒是有创建一个txt文件,就是文件是空的。。。
回复

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2021-11-21
在线时间
7 小时
 楼主| 发表于 2021-11-24 14:18:03 | 显示全部楼层
void camera_refresh(u8 t)
{
        u32 j;
        u16 color;         
        if(ov_sta==2)
        {
                if(t==100)
                {
                        f_open(file,"0:/photo.txt",FA_CREATE_ALWAYS|FA_WRITE);
                        f_close(file);  
                LCD_Scan_Dir(U2D_L2R);                //′óé&#207;μ&#189;&#207;&#194;,′ó×óμ&#189;óò
                LCD_SetCursor(0x00,0x0000);        //éè&#214;&#195;1a±ê&#206;&#187;&#214;&#195;
                LCD_WriteRAM_Prepare();     //&#191;aê&#188;D′è&#235;GRAM       
                OV7670_CS=0;         
                OV7670_RRST=0;                                //&#191;aê&#188;&#184;′&#206;&#187;&#182;á&#214;&#184;&#213;&#235;
                OV7670_RCK=0;
                OV7670_RCK=1;
                OV7670_RCK=0;
                OV7670_RRST=1;                                //&#184;′&#206;&#187;&#182;á&#214;&#184;&#213;&#235;&#189;áê&#248;
                OV7670_RCK=1;  
                for(j=0;j<76800;j++)
                {
                        GPIOB->CRL=0X88888888;                  
                        OV7670_RCK=0;
                        color=OV7670_DATA;                //&#182;áêy&#190;Y
                        OV7670_RCK=1;        
                        color<<=8;                                          
                        OV7670_RCK=0;
                        color|=OV7670_DATA;                //&#182;áêy&#190;Y                  
                        OV7670_RCK=1;
                        GPIOB->CRL=0X33333333;                                       
                        LCD_WR_DATA(color);       
                        f_open(file, "0:photo.txt", FA_WRITE);
      f_lseek(file,file->fptr+file->fsize);      
      f_write(file, (u16*)color, 20, &bw);  
                        f_close(file);
                }   
                OV7670_CS=1;                                                          
                OV7670_RCK=0;
                OV7670_RCK=1;
                EXTI->PR=1<<15;                     //&#199;&#229;3yLINE8é&#207;μ&#196;&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;
                ov_sta=0;                                        //&#191;aê&#188;&#207;&#194;ò&#187;′&#206;2é&#188;ˉ
                ov_frame++;
                LCD_Scan_Dir(DFT_SCAN_DIR);        //&#187;&#214;&#184;′&#196;&#172;è&#207;é¨&#195;è·&#189;&#207;ò                                                     
        }
                else
                {LCD_Scan_Dir(U2D_L2R);                //′óé&#207;μ&#189;&#207;&#194;,′ó×óμ&#189;óò
                LCD_SetCursor(0x00,0x0000);        //éè&#214;&#195;1a±ê&#206;&#187;&#214;&#195;
                LCD_WriteRAM_Prepare();     //&#191;aê&#188;D′è&#235;GRAM       
                OV7670_CS=0;         
                OV7670_RRST=0;                                //&#191;aê&#188;&#184;′&#206;&#187;&#182;á&#214;&#184;&#213;&#235;
                OV7670_RCK=0;
                OV7670_RCK=1;
                OV7670_RCK=0;
                OV7670_RRST=1;                                //&#184;′&#206;&#187;&#182;á&#214;&#184;&#213;&#235;&#189;áê&#248;
                OV7670_RCK=1;  
                for(j=0;j<76800;j++)
                {
                        GPIOB->CRL=0X88888888;                  
                        OV7670_RCK=0;
                        color=OV7670_DATA;                //&#182;áêy&#190;Y
                        OV7670_RCK=1;        
                        color<<=8;                                          
                        OV7670_RCK=0;
                        color|=OV7670_DATA;                //&#182;áêy&#190;Y                  
                        OV7670_RCK=1;
                        GPIOB->CRL=0X33333333;                                                          
                        LCD_WR_DATA(color);         
                }  
                OV7670_CS=1;                                                          
                OV7670_RCK=0;
                OV7670_RCK=1;
                EXTI->PR=1<<15;                     //&#199;&#229;3yLINE8é&#207;μ&#196;&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;
                ov_sta=0;                                        //&#191;aê&#188;&#207;&#194;ò&#187;′&#206;2é&#188;ˉ
                ov_frame++;
                LCD_Scan_Dir(DFT_SCAN_DIR);        //&#187;&#214;&#184;′&#196;&#172;è&#207;é¨&#195;è·&#189;&#207;ò          
                }
        }
}          
回复

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2021-11-21
在线时间
7 小时
 楼主| 发表于 2021-11-24 14:20:08 | 显示全部楼层
我自己觉得问题可能是出在
1.移植两个程序的时候没有避开两个例程都用到的IO口。
2.读写太慢了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-23 03:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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