用于 Winbond W25N01 闪存设备的 Mongoose-OS VFS 驱动程序在 20 个文件后失败

问题描述

我有一块 ESP32 板和一块通过 SPI 总线连接的 Winbond W25N01 (1Gbit) NAND 闪存芯片。我正在使用 Mongoose OS 和他们的 Winbond VFS 驱动程序。我正在使用 LittleFS。

它基本有效,但在我打开大约 20 个文件后,我在打开更多文件时出错,说“超级块已变得不可写”。我已经编写了一些 Arduino 代码来进行最低限度的测试,我相信硬件是好的,尽管现在它在面包板上。

我想知道我的配置和代码是否正确,希望得到评论

#include "mgos.h"
#include "mgos_system.h"
#include "mgos_vfs_dev_w25xxx.h"

#include <stdio.h>

#define W25XXX_DEBUG 1
#define LED_PIN 13

static void timer_cb(void *arg)
{
  #if 1
  static uint16_t ctr = 0;

  FILE *fp;
  char c[] = "this is a test";
  char buffer[100];
  char writeBuf[100];

  char fileName[50];
  sprintf(fileName,"/data/file-%d.txt",ctr);

  LOG(LL_ERROR,("***** File Name: %s\r\n",fileName));

  /* Open file for both reading and writing */
  fp = fopen(fileName,"w+");

  if(fp == NULL)
  {
    LOG(LL_ERROR,("fopen() Failed"));
    return;
  }
  else
  {
    LOG(LL_ERROR,("fopen() SUCCESS!!"));
  }

  /* Write data to the file */
  sprintf(writeBuf,"Here is some data for the file - %d",ctr);
  fwrite(writeBuf,strlen(writeBuf) + 1,1,fp);

  /* Seek to the beginning of the file */
  fseek(fp,SEEK_SET);

  /* Read and display data */
  fread(buffer,strlen(writeBuf)+1,fp);
  LOG(LL_ERROR,("Read: %s",buffer));
  fclose(fp);

  ctr++;
  #endif

#ifdef LED_PIN
  mgos_gpio_toggle(LED_PIN);
#endif
  (void) arg;
}

enum mgos_app_init_result mgos_app_init(void)
{
  mgos_wdt_disable();

  mgos_gpio_set_mode(LED_PIN,MGOS_GPIO_MODE_OUTPUT);
  mgos_set_timer(2000,MGOS_TIMER_REPEAT,timer_cb,NULL);

  return MGOS_APP_INIT_SUCCESS;
}

mos.yml

author: mongoose-os
description: A Mongoose OS app skeleton
version: 1.0

libs_version: ${mos.version}
modules_version: ${mos.version}
mongoose_os_version: ${mos.version}

# From the W25Nxxx driver code:
#define W25XXX_PAGE_SIZE 2048U
#define W25XXX_BLOCK_SIZE (64 * W25XXX_PAGE_SIZE)
#define W25XXX_DIE_SIZE (1024 * W25XXX_BLOCK_SIZE)

# Optional. List of tags for online search.
tags:
  - c

# List of files / directories with C sources. No slashes at the end of dir names.
sources:
  - src

# List of dirs. Files from these dirs will be copied to the device filesystem
filesystem:
  - fs

config_schema:
  - ["spi.enable",true]
  # Other SPI interface options go here.

  - ["spi.miso_gpio",19]
  - ["spi.mosi_gpio",18]
  - ["spi.sclk_gpio",5]
  - ["spi.cs0_gpio",21]

  - ["devtab.dev0.name","spif0"]
  - ["devtab.dev0.type","w25xxx"]
  - ["devtab.dev0.opts",'{"cs": 0,"freq": 10000000,"ecc_chk": 0}']

#  json_scanf(opts,strlen(opts),#             "{cs: %d,freq: %d,mode: %d,"
#             "bb_reserve: %u,ecc_chk: %B,spi: %T}",#             &cs_num,&spi_freq,&spi_mode,&bb_reserve,&ecc_chk,#             &spi_cfg_json);

  - ["fstab.fs0.dev","spif0"]
  - ["fstab.fs0.type","LFS"]
  - ["fstab.fs0.opts",'{"bs": 131072}'] # bs 1024*64 # Fails without this line
  - ["fstab.fs0.path","/data"]
  - ["fstab.fs0.create",true]

#   // block device configuration
#    .read_size = 16,#    .prog_size = 16,#    .block_size = 2048*64,#    .block_count = 1024,#    .lookahead = 2048,- ["debug.level",3]

libs:
  - origin: https://github.com/mongoose-os-libs/vfs-dev-w25xxx
  - origin: https://github.com/mongoose-os-libs/fstab

# Used by the mos tool to catch mos binaries incompatible with this file format
manifest_version: 2017-09-29

错误

[Mar 17 14:44:13.752] main.c:57               ***** File Name: /data/file-20.txt
[Mar 17 14:44:13.752] 
[Mar 17 14:44:13.758] mgos_vfs.c:283          /data/file-20.txt -> /data/file-20.txt pl 5 -> 2 0x3ffb7e4c (refs 1)
[Mar 17 14:44:14.055] /data/fwbuild-volumes/latest/apps/winbond-w25n-test/esp32/build_contexts/build_ctx_434460174/deps/vfs-fs-lfs/littlefs/lfs.c:1691:warn: Superblock 0x1 has become unwritable
[Mar 17 14:44:14.074] mgos_vfs.c:377          open /data/file-20.txt 0x602 0x1b6 => 0x3ffb7e4c file-20.txt -6 => -6 (refs 0)
[Mar 17 14:44:14.076] main.c:66               fopen() Failed

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)