WBR3模块调用uf_file接口出错

Wi-Fi 设备、Wi-Fi 低功耗设备、Wi-Fi BLE 双模设备、Ethernet设备、Ethernet+Wi-Fi设备等
hamiee
Posts: 6

大家好,使用WBR3模块开发产品,程序刚开始运行时会创建一个uf文件,名为"/hy/cfg.bin";刚开始读写是正常的,过几个小时后调用 ufopen("/hy/cfg.bin", "r")会出现“[06-05 19:18:36 TUYA Err][uf_flash_file_app.c:266] uf_open /hy/cfg.bin err 4“指令的报错,且返回值为null,重启之后又正常了,而且数据没丢失,请问需要怎么修复这个问题?

使用的sdk版本:
ty_iot_wf_bt_sdk_rtos_rtl8720cf_ameba_1.0.12


Tags:
愚者千虑必有一得
Posts: 473

Re: WBR3模块调用uf_file接口出错

你好,从你的问题现象来看,是从flash里读取数据,在解析数据的时候,发现数据的crc或者是magic段不正确,导致返回了4, UF_BLOCK_UNVALID错误。

但是后面你重启又恢复了,数据并没有损坏,可能是在读取的时候由于某些未知原因:如电压不稳之类的,导致flash里数据读错了。

另外,你的sdk比较老了,已经eol了,建议更新到新的版本。比如tuyaos 3.8.5版本之后,修复了不少历史问题,稳定性会更好一些。

hamiee
Posts: 6

Re: WBR3模块调用uf_file接口出错

你好,非常感谢解答。因为产品已经出货,更换sdk需要进行详尽测试比较费时,现在有客户投诉,需要短时间内解决问题。现在读取失败后,会一直失败,必须重启才能恢复正常一小段时间,请问旧的sdk有没有办法在软件上规避这个问题?

hamiee
Posts: 6

Re: WBR3模块调用uf_file接口出错

愚者千虑必有一得 2024年 Jun 12日 14:33

你好,从你的问题现象来看,是从flash里读取数据,在解析数据的时候,发现数据的crc或者是magic段不正确,导致返回了4, UF_BLOCK_UNVALID错误。

但是后面你重启又恢复了,数据并没有损坏,可能是在读取的时候由于某些未知原因:如电压不稳之类的,导致flash里数据读错了。

另外,你的sdk比较老了,已经eol了,建议更新到新的版本。比如tuyaos 3.8.5版本之后,修复了不少历史问题,稳定性会更好一些。

你好,非常感谢解答。因为产品已经出货,更换sdk需要进行详尽测试比较费时,现在有客户投诉,需要短时间内解决问题。现在读取失败后,会一直失败,必须重启才能恢复正常一小段时间,请问旧的sdk有没有办法在软件上规避这个问题?

愚者千虑必有一得
Posts: 473

Re: WBR3模块调用uf_file接口出错

你好,能提供一份完整的错误log吗?我们看看有没啥特殊的场景。

另外我们flash存储有两套,一套kv,一套uf,我们kv遇到这样的问题的时候,会做一次软件重启来恢复。目前看,uf没有这样的恢复操作。

愚者千虑必有一得
Posts: 473

Re: WBR3模块调用uf_file接口出错

你们这个文件读写的频率是什么样的?

hamiee
Posts: 6

Re: WBR3模块调用uf_file接口出错

愚者千虑必有一得 2024年 Jun 13日 11:09

你好,能提供一份完整的错误log吗?我们看看有没啥特殊的场景。

另外我们flash存储有两套,一套kv,一套uf,我们kv遇到这样的问题的时候,会做一次软件重启来恢复。目前看,uf没有这样的恢复操作。

打印等级之前设为err了,打印的有点少。rtc预约时间到时,会执行以下代码:
uFILE* tuya_fid = NULL;
static uint8_t try_times=0;
LOG_ERROR(".......alarm active %d",try_times);
++try_times;
LOG_ERROR("UF %d %p",ufexist(FEED_SCHEDULE_LIST),tuya_fid);
tuya_fid = ufopen(FEED_SCHEDULE_LIST,"r");

下面是log:

[14:53:02:044] ␍[06-13 14:53:01 TUYA Err][feeder_hw.c:343] .......alarm active 0␍␊
[14:53:02:171] ␍[06-13 14:53:01 TUYA Err][uf_flash_file_app.c:411] uf_get_size err,filepath:/hy_feeder/schedulelist.bin,ret:4␍␊
[14:53:02:180] ␍[06-13 14:53:01 TUYA Err][sys_storage.c:504] UF 8 0 ->00000000␍␊
[14:53:02:186] ␍[06-13 14:53:01 TUYA Err][uf_flash_file_app.c:266] uf_open /hy_feeder/schedulelist.bin err 4␍␊

[14:53:02:206] ␍[06-13 14:53:01 TUYA Err][feeder_hw.c:343] .......alarm active 1␍␊
[14:53:02:220] ␍[06-13 14:53:01 TUYA Err][sys_storage.c:504] UF 8 1 ->00000000␍␊
[14:53:02:225] ␍[06-13 14:53:01 TUYA Err][uf_flash_file_app.c:266] uf_open /hy_feeder/schedulelist.bin err 4␍␊

[14:53:02:237] ␍[06-13 14:53:01 TUYA Err][feeder_hw.c:343] .......alarm active 2␍␊
[14:53:02:254] ␍[06-13 14:53:01 TUYA Err][uf_flash_file_app.c:411] uf_get_size err,filepath:/hy_feeder/schedulelist.bin,ret:4␍␊
[14:53:02:262] ␍[06-13 14:53:01 TUYA Err][sys_storage.c:504] UF 8 0 ->00000000␍␊
[14:53:02:277] ␍[06-13 14:53:01 TUYA Err][uf_flash_file_app.c:266] uf_open /hy_feeder/schedulelist.bin err 4␍␊

hamiee
Posts: 6

Re: WBR3模块调用uf_file接口出错

愚者千虑必有一得 2024年 Jun 13日 11:16

你们这个文件读写的频率是什么样的?

这个读写频率是根据用户设置的预约决定的,每个预约执行一次,一般一天执行5次左右

愚者千虑必有一得
Posts: 473

Re: WBR3模块调用uf_file接口出错

那你们 逻辑是:预约了一个喂食,到时间的时候会去读这个文件?读出错就重复读直到try-times?超过try-times如何处理?

如果这样做:配置内容保存在配置文件,同时ram里缓存一份,上电启动设备运行起来的时候,把配置文件读到ram里。正常的时候使用ram里的数据。如果预约有更新的时候就去更新文件,同时刷新ram缓存。如果读出错超过try-times,对设备做一个重启恢复。这样可以减少flash的读写次数,遇到问题也可以恢复。

flash读错的问题,可能是读的时候电压变化(比如电机运行导致系统供电负担较大,电压降低等)、flash自身品质(硬件也都是有良率的)等情况导致 ,软件无法完全解决,需要能够尽量规避、恢复。

hamiee
Posts: 6

Re: WBR3模块调用uf_file接口出错

愚者千虑必有一得 2024年 Jun 13日 16:01

那你们 逻辑是:预约了一个喂食,到时间的时候会去读这个文件?读出错就重复读直到try-times?超过try-times如何处理?

如果这样做:配置内容保存在配置文件,同时ram里缓存一份,上电启动设备运行起来的时候,把配置文件读到ram里。正常的时候使用ram里的数据。如果预约有更新的时候就去更新文件,同时刷新ram缓存。如果读出错超过try-times,对设备做一个重启恢复。这样可以减少flash的读写次数,遇到问题也可以恢复。

flash读错的问题,可能是读的时候电压变化(比如电机运行导致系统供电负担较大,电压降低等)、flash自身品质(硬件也都是有良率的)等情况导致 ,软件无法完全解决,需要能够尽量规避、恢复。

超过try-times会忽略本次预约;我们ram里也是有保存一份的,但是uf文件出现问题后,预约有更新也三写不进去的,如果重启设备,ram数据丢失,预约就更新不了;
看到你们sdk有个接口“tuya_hal_storage_reset_init”,如果ufopen失败后调用这个接口可行吗?会不会导致其他的隐患?

Post Reply