格式化后SPIFFS_open()失败

时间:2019-01-17 17:07:12

标签: spiffs

我正在尝试实现SPIFFS,但是不能超出安装范围。

我的测试代码执行以下操作: 挂载>卸载>格式>重新挂载,然后尝试紧随https://github.com/pellepl/spiffs/wiki/Using-spiffs之后执行SPIFFS_open() 但是,我收到一个SPIFFS_ERR_FULL(-10001)错误

在内部钻孔时,我注意到调用spiffs_gc_check()返回SPIFFS_ERR_FULL时,SPIFFS_open失败

我正在使用Adesto AT45DB641E,并尝试了几种配置各种物理/逻辑页面/块组合的方法。 “普通”闪存的擦除/读取/写入功能按预期工作。

我正在使用以下spiffs_config.h设置:

SPIFFS_BUFFER_HELP 1
SPIFFS_GC_STATS 0
SPIFFS_USE_MAGIC/SPIFFS_USE_MAGIC_LENGTH 1
SPIFFS_SINGLETON 1
SPIFFS_CFG_PHYS_SZ (4 * 1024 * 256)
SPIFFS_CFG_PHYS_ERASE_SZ (8*256) // tried also (1024*256)
SPIFFS_CFG_LOG_PAGE_SZ (256)
SPIFFS_CFG_LOG_BLOCK_SZ (8*256)  // tried also (1024*256)

随附的测试代码:

#define LOG_PAGE_SIZE       256

static u8_t spiffs_work_buf[LOG_PAGE_SIZE*2];
static u8_t spiffs_fds[32*4];
static u8_t spiffs_cache_buf[(LOG_PAGE_SIZE+32)*4];

static spiffs fs;


s32_t my_spi_read(u32_t addr, u32_t size, u8_t *buf)
{
    spiflash_read(addr, size, buf, NULL, NULL);
    return 0;
}

s32_t my_spi_write(u32_t addr, u32_t size, u8_t *buf)
{
    spiflash_write(addr, size, (uint8_t*)buf, false, NULL, NULL);
    return 0;
}

s32_t my_spi_erase(u32_t addr, u32_t size)
{
    spiflash_erase(addr, size, 0, false, NULL, NULL);
    return 0;
}

void my_spiffs_mount(bool forceFormat) 
{
    spiffs_config cfg;
    char str[50];
    int res;

    cfg.hal_read_f = my_spi_read;
    cfg.hal_write_f = my_spi_write;
    cfg.hal_erase_f = my_spi_erase;

    res = SPIFFS_mount(&fs, &cfg, spiffs_work_buf, spiffs_fds, sizeof(spiffs_fds), 
                                spiffs_cache_buf,sizeof(spiffs_cache_buf), 0);

    if(forceFormat) {
        res = SPIFFS_ERR_NOT_A_FS;
    }

    if(res != SPIFFS_OK) {
        SPIFFS_unmount(&fs);
        if(res == SPIFFS_ERR_NOT_A_FS) {
            res = SPIFFS_format(&fs);
            sprintf(str, "format res: %i\n", res);
            LOG_INFO_MESSAGE_LINE(str);
            res = SPIFFS_mount(&fs, &cfg, spiffs_work_buf, spiffs_fds, sizeof(spiffs_fds), 
                                        spiffs_cache_buf,sizeof(spiffs_cache_buf), 0);
        }
    }
    sprintf(str, "mount res: %i\n", res);
    LOG_INFO_MESSAGE_LINE(str);         

    u32_t total, used;
    res = SPIFFS_info(&fs, &total, &used);

    return;
 }


void my_spiffs_create_and_write()
{
    spiffs_file fd;
    int ret;
    char str[50];

    // create a file, delete previous if it already exists, and open it for reading and writing
    fd = SPIFFS_open(&fs, "my_file", SPIFFS_CREAT | SPIFFS_TRUNC | SPIFFS_RDWR, 0);   //  << Returns SPIFFS_ERR_FULL
    if (fd < 0) {
        sprintf(str, "SPIFFS_open: errno %i\n", SPIFFS_errno(&fs));
        LOG_ERROR_MESSAGE_LINE(str);
        return;
    }
    // write to it
    ret = SPIFFS_write(&fs, fd, (u8_t *)"Hello world", 12);
    if ( ret < 0) {
        sprintf(str, "SPIFFS_write: errno %i\n", SPIFFS_errno(&fs));
        LOG_ERROR_MESSAGE_LINE(str);
        return;
    }
    // close it
    ret = SPIFFS_close(&fs, fd);
    if (ret < 0) {
        sprintf(str, "SPIFFS_close: errno %i\n", SPIFFS_errno(&fs));
        LOG_ERROR_MESSAGE_LINE(str);
        return;
    }
}


void my_spiffs_read()
{
    spiffs_file fd;
    int ret;
    char str[50];
    char buf[12];

    // open it
    fd = SPIFFS_open(&fs, "my_file", SPIFFS_RDWR, 0);
    if (fd < 0) {
        sprintf(str, "SPIFFS_open: errno %i\n", SPIFFS_errno(&fs));
        LOG_ERROR_MESSAGE_LINE(str);
        return;
    }

    // read it
    ret = SPIFFS_read(&fs, fd, (u8_t *)buf, 12);
    if (ret < 0) {
        sprintf(str, "SPIFFS_write: errno %i\n", SPIFFS_errno(&fs));
        LOG_ERROR_MESSAGE_LINE(str);
        return;
    }
    // close it
    ret = SPIFFS_close(&fs, fd);
    if (ret < 0) {
        sprintf(str, "SPIFFS_close: errno %i\n", SPIFFS_errno(&fs));
        LOG_ERROR_MESSAGE_LINE(str);
        return;
    }

    sprintf(str, "Read from file: '%s'", buf);
    LOG_INFO_MESSAGE_LINE(str);
}

// called from main() during initialization
void SB_spiffs_init(void)
{
    my_spiffs_mount(true);
    my_spiffs_create_and_write();
    my_spiffs_read();
}

任何人都有使用此软件包的经验吗?

谢谢

0 个答案:

没有答案