从nodemcu lua中的lua函数返回大字符串

时间:2018-08-09 13:46:25

标签: c esp8266 nodemcu

我正在尝试修改nodemcu lua file.list functon /app/modules/file.c 返回由换行符char分隔的大文件名字符串。目前它返回数组,并且非常消耗内存,而且我正在剥离文件大小。 这是我所做的(检查了其他函数如何返回字符串)

static int file_list( lua_State* L )
{
    char temp[32];
    unsigned st = luaL_optinteger( L, 1, 1 ); // start offset
    unsigned tf = luaL_optinteger( L, 2, 100000 ); // how much files to list
    tf=tf+st;
    vfs_dir *dir;

    if (dir = vfs_opendir("")) {
        lua_newtable( L );
        struct vfs_stat stat;
        int i=1;
        int ii=0;
        while (vfs_readdir(dir, &stat) == VFS_RES_OK) {
            if (i<st)
            {
                i++;
                continue;
            }
            if (i>=tf)
            {
                break;
            }
            strcpy (temp,stat.name);
            strcat (temp,"\n");
            lua_pushstring( L, temp );
            i++;
            ii++;
        }
        vfs_closedir(dir);
        return ii;
    }
    return 0;
}

它无法正常工作,如果我请求40个以上的文件(设备重新启动后一次),我将看到如下输出:

....
3fff0d10 already freed
3fff11b8 already freed
3fff0cc8 already freed
3fff1f88 already freed
.....

并重新启动设备,但是如果我请求30个文件,并且每次以30的步长增加它们,则设法一次获取400个文件。

=file.list(1,30)
=file.list(1,60)
=file.list(1,90)

以这种方式工作,如果我直接这样做:

=file.list(1,60)

它不起作用。还要注意的是,在函数完成后,内存已分配且未设置为空闲,但在同一命令执行后也不会重新分配,因此这不是内存泄漏,只是某些日期可能保留在堆栈中。

0 个答案:

没有答案