Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
jffs2
JFFS2文件系统open完偶尔flag不正确的BUG
发布于 2013-09-26 14:55:07 浏览:3212
订阅该版
在调用VFS的open后通过dfs_jffs2_open打开JFFS2文件系统,VFS为了兼容各种文件系统,将data指向`cyg_file * jffs2_file`。 `result = jffs2_opendir(mte, mte->root, name, jffs2_file);`时,会初始化一些变量 ```c file->f_type = CYG_FILE_TYPE_FILE; file->f_ops = &jffs2_dirops; file->f_offset = 0; file->f_data = (CYG_ADDRWORD) ds.node; file->f_xops = 0; ``` 此时这里并没有初始化f_flag变量,也就是说jffs2_file结构其实是指向一块没有初始化过的内存区域,里面的值是随机的。 jffs2_opendir函数结束后,此时访问文件的flag才开始确定,代码如下: ```c /* regular file operations */ mode = 0; if (oflag & DFS_O_RDONLY) mode |= JFFS2_O_RDONLY; if (oflag & DFS_O_WRONLY) mode |= JFFS2_O_WRONLY; if (oflag & DFS_O_RDWR) mode |= JFFS2_O_RDWR; /* Opens the file, if it is existing. If not, a new file is created. */ if (oflag & DFS_O_CREAT) mode |= JFFS2_O_CREAT; /* Creates a new file. If the file is existing, it is truncated and overwritten. */ if (oflag & DFS_O_TRUNC) mode |= JFFS2_O_TRUNC; /* Creates a new file. The function fails if the file is already existing. */ if (oflag & DFS_O_EXCL) mode |= JFFS2_O_EXCL; // if (oflag & DFS_O_APPEND) mode |= JFFS2_O_APPEND; rt_mutex_take(&jffs2_lock, RT_WAITING_FOREVER); result = jffs2_open(mte, 0, name, mode, jffs2_file); ``` 由以上代码可以看出mode将在调用jffs2_open时,传递给jffs2_file结构体下的flag,代码如下: ```c // Initialise the file object file->f_flag |= mode & CYG_FILE_MODE_MASK; file->f_type = CYG_FILE_TYPE_FILE; file->f_ops = &jffs2_fileops; file->f_offset = (mode & O_APPEND) ? node->i_size : 0; file->f_data = (CYG_ADDRWORD) node; file->f_xops = 0; ``` 此处`file->f_flag |= mode & CYG_FILE_MODE_MASK; `这里是或等于啊!就是说`file->f_flag`的值并不确定,又或上一个正确的值。 有木有啊!!!
查看更多
8
个回答
默认排序
按发布时间排序
bernard
2013-09-26
这家伙很懒,什么也没写!
谢谢反馈。@prife 请确认下 JFFS2文件系统比较老,问题也比较多,当时选择方案时我们应该坚持下的,难为你们了。
haitao52198
2013-09-26
这家伙很懒,什么也没写!
>谢谢反馈。@prife 请确认下 > >JFFS2文件系统比较老,问题也比较多,当时选择方案时我们应该坚持下的,难为你们了。 --- 我是将 ``` // Initialise the file object file->f_flag = mode & CYG_FILE_MODE_MASK; ``` 这里修改为=测试就可以了,不知@prife是否认可修改。 其他方案是什么呢?当时我还没有入职,对于这个方案不知晓都。
bernard
2013-09-26
这家伙很懒,什么也没写!
是初始化吧,应该是"="。
prife
2013-09-28
这家伙很懒,什么也没写!
谢谢反馈,测试发现,这个地方确实是个问题。稍后把代码提交上。 jffs2_opendir里与jffs2_open里是两个地方,修改方法如下。 ``` diff --git a/components/dfs/filesystems/jffs2/src/fs-ecos.c b/components/dfs/filesystems/jffs2/src/fs-ecos.c index 5f3b5d6..814d2e3 100644 --- a/components/dfs/filesystems/jffs2/src/fs-ecos.c +++ b/components/dfs/filesystems/jffs2/src/fs-ecos.c @@ -747,7 +747,7 @@ int jffs2_open(cyg_mtab_entry * mte, cyg_dir dir, const char *name, } // Initialise the file object - file->f_flag |= mode & CYG_FILE_MODE_MASK; + file->f_flag = mode & CYG_FILE_MODE_MASK; file->f_type = CYG_FILE_TYPE_FILE; file->f_ops = &jffs2_fileops; file->f_offset = (mode & O_APPEND) ? node->i_size : 0; @@ -1065,6 +1065,7 @@ static int jffs2_opendir(cyg_mtab_entry * mte, cyg_dir dir, const char *name, // Initialize the file object, setting the f_ops field to a // special set of file ops. + file->f_flag = 0; file->f_type = CYG_FILE_TYPE_FILE; file->f_ops = &jffs2_dirops; file->f_offset = 0; ```
haitao52198
2013-09-28
这家伙很懒,什么也没写!
file->f_flag = 0; 这里我认为可要可不要,关键是上面那处的修改,谢谢。 看了下linux里的JFFS2和ecos里的源码都对不上,莫非这个文件也是移植工作的一部分?
prife
2013-09-29
这家伙很懒,什么也没写!
>file->f_flag = 0; >这里我认为可要可不要,关键是上面那处的修改,谢谢。 >看了下linux里的JFFS2和ecos里的源码都对不上,莫非这个文件也是移植工作的一部分? --- 这个代码跟linux里的JFFS2源代码是对不上的。但是跟ecos里的源代码基本可以对上的。但是其中也做了一些修改,以移植到RTT中。找个winMerge,或者beyond compare来对比文件即可。
haitao52198
2013-09-29
这家伙很懒,什么也没写!
恩,对比过了。看了ecos里的代码就是一直有这个问题,就想看看linux里该不会有这个问题吧,想参考下linux里的处理,结果看了linux里的代码后完全没有找到相似的代码,可以说open的完全不一样的实现,linux里没有参考价值
撰写答案
登录
注册新账号
关注者
0
被浏览
3.2k
关于作者
haitao52198
这家伙很懒,什么也没写!
提问
42
回答
260
被采纳
0
关注TA
发私信
相关问题
1
jffs2编译不过,jffs2已经不支持了吗?
2
simulator工程了修改JFFS2文件系统的大小
3
关于jffs2文件系统的三个问题
4
JFFS2文件系统挂载失败时处理上的漏洞
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
7
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部