Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Filesystem
UFFS文件系统写文件失败_CheckDirtyList问题
发布于 2019-08-13 11:38:02 浏览:1321
订阅该版
static URET _CheckDirtyList(uffs_Buf *dirty) { u16 parent; u16 serial; if (dirty == NULL) { return U_SUCC; } parent = dirty->parent; serial = dirty->serial; dirty = dirty->next_dirty; while (dirty) { if (parent != dirty->parent || serial != dirty->serial) { uffs_Perror(UFFS_MSG_SERIOUS, "parent or serial in dirty pages buffer are not the same ?"); return U_FAIL; } if (dirty->mark != UFFS_BUF_DIRTY) { uffs_Perror(UFFS_MSG_SERIOUS, "non-dirty page buffer in dirty buffer list ?"); return U_FAIL; } dirty = dirty->next_dirty; } return U_SUCC; } 这个函数运行 偶尔会进入uffs_Perror错误日志打印,问下是不是nandflash存在坏区,出错之后重启下运行正常,运行一段时间后还会出现uffs_Perror错误情况
查看更多
30
个回答
默认排序
按发布时间排序
llichunfei
2019-08-13
这家伙很懒,什么也没写!
UFFS自己有擦写平衡和坏区检测机制,是不是重启后 会把之前的坏区记录 不再操作之前那个坏区了呢?
iamyhw
2019-08-13
这家伙很懒,什么也没写!
uffs设置的参数与nandflash芯片的参数是否一致
llichunfei
2019-08-13
这家伙很懒,什么也没写!
>uffs设置的参数与nandflash芯片的参数是否一致 --- 一致,运行 好几天才会出现这个问题 我是1秒钟写一次nandflash
iamyhw
2019-08-13
这家伙很懒,什么也没写!
[i=s] 本帖最后由 iamyhw 于 2019-8-13 16:46 编辑 [/i] uffs每一次完整的写操作(写node)都要还要使用一个新的page,即使只有一个字节, 如果1s写一次,差不多1分钟写"废"一个block,只要有大于一定数量的空闲block, uffs不会触发回收机制,而且uffs希望有一部分用户不要使用的空闲block来做badblock的替换工作, 如果空闲block太少,可能遇到你的问题了, 您为什么要1s写一次nandflash呢,这个自己挖个坑然后埋了自己的节奏. 如果RAM够大,开辟个page大小的缓存,甚至block大小的,优先写RAM, 如果RAM太小,扩展个铁电的EEPROM,当做缓存用, 记录的数据够多了再往nandflash内写. 说的够详细了,总之要给使用Nand的文件系统留点自留地.这些坑都在实际项目中趟过了.
iamyhw
2019-08-13
这家伙很懒,什么也没写!
[i=s] 本帖最后由 iamyhw 于 2019-8-13 17:06 编辑 [/i] uffs每次重启都会建立一个文件node结构(文件系统),并将一些空闲的pages加入dirty buffer list, 这些pages也是可以使用的,假如不回收dirty(脏的,被写过的)page,用不到dirty buffer,如果要回收, 当一个block中只有少量的dirty page时,会将这些page拷到其他地方,并重建node节点.这个其他 地方就会用到dirty buffer.随着系统的长期运行,dirty buffer list自然会不够用的.重启后,重建文件结构时,会回收一批block, 像你的应用,超过90%都会被回收.之后又够用一段时间.修改程序事务逻辑,降低block变dirty的速率. 不过不用担心正常数据,大不了这次不回收了,下次回收也可以. 好像有个API可以检查空闲page,用它手动触发回收,自己研究一下.
llichunfei
2019-08-14
这家伙很懒,什么也没写!
>uffs每次重启都会建立一个文件node结构(文件系统),并将一些空闲的pages加入dirty buffer list, >这些pages也 ... --- 恩,我读写了所有page 都是好的 有没有UFFS资料 网上很少有 空闲page的设置在哪个变量?
llichunfei
2019-08-14
这家伙很懒,什么也没写!
>uffs每次重启都会建立一个文件node结构(文件系统),并将一些空闲的pages加入dirty buffer list, >这些pages也 ... --- dirty buffer list不停的被用掉,用完了 是不是 就会报出我那个错误了 如何不被用完呢 我现在是往nand中存储日志文件 3M一个 当剩余空间小于16M(总共128M)时会删除最老的日志文件保证nand不会溢出
llichunfei
2019-08-14
这家伙很懒,什么也没写!
>uffs每次重启都会建立一个文件node结构(文件系统),并将一些空闲的pages加入dirty buffer list, >这些pages也 ... --- 相当于dirty buffer list在不停的消耗,dirty page占用了dirty buffer list,dirty buffer list需要不停的补充新的空闲的page,我程序始终剩余16M空间 怎样让系统 补充到dirty buffer list,有什么函数吗
iamyhw
2019-08-14
这家伙很懒,什么也没写!
刚看到你的信息, 检查你的系统给uffs_BufInit()传入的参数: /** * \brief initialize page buffers for device * in UFFS, each device has one buffer pool * \param[in] dev uffs device * \param[in] buf_max maximum buffer number, normally use #MAX_PAGE_BUFFERS * \param[in] dirty_buf_max maximum dirty buffer allowed, * if the dirty buffer over this number, * than need to be flush to flash */ URET uffs_BufInit(uffs_Device *dev, int buf_max, int dirty_buf_max) 上面,作者讲的很清楚,参数dirty_buf_max控制刷新flash的时机.
iamyhw
2019-08-14
这家伙很懒,什么也没写!
[i=s] 本帖最后由 iamyhw 于 2019-8-14 17:31 编辑 [/i] uffs最终的写动作有_BufFlush()函数完成, 贴出后面的代码: ret = uffs_BlockInfoLoad(dev, bc, UFFS_ALL_PAGES); if (ret == U_SUCC) { n = uffs_GetFreePagesCount(dev, bc); if (n >= dev->buf.dirtyGroup[slot].count && !force_block_recover) { //The free pages are enough for the dirty pages ret = uffs_BufFlush_Exist_With_Enough_FreePage(dev, slot, node, bc); } else { ret = uffs_BufFlush_Exist_With_BlockCover(dev, slot, node, bc); } } 意思是,如果读取所有页面,发现有空闲页,那么调用uffs_BufFlush_Exist_With_Enough_FreePage写, 否则使用块覆盖写, 此函数会调用_FindMinimunPageIdFromDirtyList()获取一个空闲页写入, 之后可能会耗空dirty buf list,所以下次再调用_BufFlush(),会触发你贴出的代码了. 而作者提供了一个API:uffs_BufFlushEx()写函数 可以强制回收block,无论是否有空闲pages使用. 在程序中可以不定期的调用它来完成写动作,这个函数不能频繁使用!(通过dirty list比例) 因为它调用了_FindMostDirtyGroup()重建dirty list, 如果频繁使用,则有些page会频繁的因为变dirty而被重复使用,不利于擦写平衡! 多看看代码吧,uffs的代码写的非常易懂的!
撰写答案
登录
注册新账号
关注者
0
被浏览
1.3k
关于作者
llichunfei
这家伙很懒,什么也没写!
提问
5
回答
32
被采纳
0
关注TA
发私信
相关问题
1
字库除了SD卡和http还有别的方式导入吗
2
如何同时使用RTT文件系统于NAND Flash 和 SD卡,针对Realboard4088?
3
EasyFlash好棒
4
SD卡挂在的SPI总线又要加个DA设备
5
sd卡与flash 同时挂载 挂载路径shell怎么区分 访问
6
请教ramfs使用方法
7
rtt stable2.0.x版本 sd卡及文件系统
8
nandflash文件系统UFFS请教
9
关于SD卡挂载文件系统的问题(已解决)
10
Yaffs采用GPL2许可
推荐文章
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
【24嵌入式设计大赛】基于RT-Thread星火一号的智慧家居系统
2
RT-Thread EtherKit开源以太网硬件正式发布
3
如何在master上的BSP中添加配置yml文件
4
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
5
RT-Thread 发布 EtherKit开源以太网硬件!
热门标签
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
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
MicroPython
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
16
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
6
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
5
次点赞
RTT_逍遥
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部