7. M601 文件系统的使用

    技术2022-07-16  70

    1 文件系统 API

    本文介绍的数据结构和 API 可以参考 SDK 中 zyf_fs.h 文件

    1.1 用法

    存储只支持 FLASH 存储,想要创建或者打开一个文件或者目录时,必须使用绝对路径。例如,想要创建一个文件,可以这样设置 "/"。 ·ZYF_FS_GetDiskTotalSpace 函数可以用来获得 Flash 的总空间大小 ·ZYF_FS_GetDiskFreeSpace 函数可以用来获得 Flash 的剩余大小 ·ZYF_FS_GetFileSize 函数用来获取特定文件大小,单位字节 ·ZYF_FS_Open 函数用来创建或者打开文件。必须定义打开和访问模式。更多信息请参考此函数的头文件描述 ·ZYF_FS_Read 函数 ZYF_FS_Write 函数用来读写文件,必须确认文件已经打开 ·ZYF_FS_Seek 函数 ZYF_FS_GetFilePosition 函数用来设置或者获取文件指针位置,必须确认文件已经打开 ·ZYF_FS_Delete 函数 ZYF_FS_CheckFile 函数用来删除和查找文件 ·ZYF_FS_Close 函数用来关闭文件

    1.2 API 函数

    1.2.1. ZYF_FS_Open 打开或者创建指定名称的文件· 函数原型 int32_t ZYF_FS_Open(const char *fileName, uint32_t Flag)· 参数 fileName:[输入] 文件名称。最长 252 个字符,必须使用绝对路径,如"/" Flag:[输入] 打开和访问模式,可能的值如下所示: ZYF_FS_READ_WRITE, 可读写 ZYF_FS_READ_ONLY, 只读 ZYF_FS_CREATE, 如果文件存在,打开文件;如果文件不存在,则创建文件: ZYF_FS_CREATE_ALWAYS, 创建新文件;如果文件存在,覆盖文件并清除现有的属性

    返回结果 成功:返回一个值指定文件句柄 失败:返回一个负数,表示打开文件失败

    1.2.2 ZYF_FS_Close 关闭指定句柄的文件· 函数原型 void ZYF_FS_Close(int32_t fileHandle); · 参数 fileHandle:文件句柄。为 ZYF_FS_Open 打开文件时返回的句柄· 返回值 无

    1.2.3 ZYF_FS_Read 读取文件内容· 函数原型 int32_t ZYF_FS_Read(int32_t fileHandle, uint8_t *readBuffer, uint32_t numberOfBytesToRead, uint32_t *numberOfBytesRead);· 参数 fileHandle:[输入] 文件句柄。为 ZYF_FS_Open 打开文件时返回的句柄 readBuffer:[输出] 读取数据,指向读取的数据缓冲区 numberOfBytesToRead:[输入] 要读取的数据长度 numberOfBytesRead:[输出] 从文件读取到的数据长度。在执行操作或检查错误之前,将此值设置为零· 返回值 成功 FS_NO_ERROR 失败请参考 fs_error_enum

    1.2.4 ZYF_FS_Write 此函数用于写文件· 函数原型 int32_t ZYF_FS_Write(int32_t fileHandle, uint8_t *writeBuffer, uint32_t numberOfBytesToWrite, uint32_t *numberOfBytesWritten);· 参数 fileHandle:[输入] 文件句柄。为 ZYF_FS_Open 打开文件时返回的句柄 writeBuffer:[输入] 要写入文件的数据,指向读取的数据缓冲区 numberOfBytesToWrite:[输入] 要写入的数据长度 numberOfBytesWritten:[输出] 已经写入文件的数据长度。在执行操作或检查错误之前,将此值设置为零· 返回值 成功 FS_NO_ERROR 失败请参考 fs_error_enum

    1.2.5 ZYF_FS_Seek 此函数用来操作文件指针偏移· 函数原型 int32_t ZYF_FS_Seek(int32_t fileHandle, int32_t offset, uint32_t whence);· 参数 fileHandle:[输入] 文件句柄。为 ZYF_FS_Open 打开文件时返回的句柄 offset:[输入] 从文件指针偏移的字节数 whence:[输入] 文件指针参考位置,见 Enum_FsSeekPos·返回值

    成功返回结果大于等于 0(文件偏移量), 失败请参考 fs_error_enum

    1.2.6 ZYF_FS_GetFileSize 此函数用来获取文件大小· 函数原型 int32_t ZYF_FS_GetFileSize(int32_t fileHandle, uint32_t *size);· 参数 fileHandle:[输入] 文件句柄。为 ZYF_FS_Open 打开文件时返回的句柄 size:[输出] 检索到的文件大小· 返回值 成功 FS_NO_ERROR 失败请参考 fs_error_enum

    1.2.7 ZYF_FS_Delete 此函数用来删除文件· 函数原型 int32_t ZYF_FS_Delete(const char *fileName);· 参数 fileName:[输入] 需要删除的文件名称。最长 252 个字符,必须使用绝对路径,如"/"· 返回值 成功 FS_NO_ERROR 失败请参考 fs_error_enum

    1.2.8 ZYF_FS_CheckFile 此函数用来检查文件是否存在·函数原型

    int32_t ZYF_FS_CheckFile(const char *fileName);· 参数 fileName:[输入] 需要检查的文件名称· 返回值 成功 FS_NO_ERROR 失败请参考 fs_error_enum

    1.2.9 ZYF_FS_Rename 此函数用来文件重命名· 函数原型 int32_t ZYF_FS_Rename(const char *fileName, const char *newName);· 参数 fileName:[输入] 需要重命名的文件名称。最长 252 个字符,必须使用绝对路径,如"/" newName:[输入] 文件的新名称。最长 252 个字符,必须使用绝对路径,如"/"· 返回值 成功 FS_NO_ERROR 失败请参考 fs_error_enum

    1.2.10 ZYF_FS_GetDiskFreeSpace 此函数用来获取磁盘剩余空间· 函数原型 int32_t ZYF_FS_GetDiskFreeSpace(, uint32_t *free_space);· 参数 free_space:[输出] 对应磁盘的剩余空间大小· 返回值 成功 FS_NO_ERROR 失败请参考 fs_error_enum

    1.2.11 ZYF_FS_CreateDir 此函数用来创建文件目录· 函数原型 int32_t ZYF_FS_CreateDir(constchar *dirName);· 参数 dirName:[输入] 目录名称· 返回值 成功 FS_NO_ERROR 失败请参考 fs_error_enum

    1.2.12 ZYF_FS_DeleteDir 此函数用来删除文件目录· 函数原型 int32_tZYF_FS_DeleteDir (const char *dirName);· 参数 dirName:[输入] 目录名称· 返回值 成功 FS_NO_ERROR 失败请参考 fs_error_enum

    2 文件系统例程介绍

    本章节主要介绍如何在 SDK 中使用 example_fs.c 单独测试文件系统功能。 编译方法:.\examples\build\对应的.bat 文件双击执行或打开就可以编译。 生成文件:.\out\对应目录\hex\M601_example_**.pac

    使用 ZYF_FS_GetDiskFreeSpace()获取磁盘剩余空间大小,使用 ZYF_FileWrite()向磁盘中写入0x35,再用 ZYF_FileRead()将磁盘中的信息读出来。

    #include <string.h> #include "zyf_fs.h" #include "zyf_trace.h" #include "zyf_app.h" #include "zyf_uart.h" #include "zyf_thread.h" #define USER_DIR "user" #define USER_FILE "user_test.txt" #define SD_USER_FILE "/user_test.txt" static Uart_Param_t g_uart1param; void UartWriteCallBack(void* Param) // general com { Uart_Param_t *uartparam = (Uart_Param_t *)Param; if(Param == NULL) { return; } ZYF_UartWrite(uartparam->port,(uint8_t *)"UartWrite succeed\r\n",strlen("UartWrite succeed\r\n")); ZYF_UartWriteCallbackSwitch(uartparam->port,false); } void UartReadCallBack(void* Param) // { uint32_t recvlen = 0; Uart_Param_t *uartparam = (Uart_Param_t *)Param; ZYF_LOG("Uart%d recv",uartparam->port); while(ZYF_UartRead(uartparam->port, &(uartparam->uartbuf[recvlen]), 1)) { ZYF_LOG("recv :x",uartparam->uartbuf[recvlen]); recvlen++; } ZYF_UartWrite(uartparam->port,uartparam->uartbuf,recvlen); ZYF_UartWriteCallbackSwitch(uartparam->port,true); } static void AppUartInit(void) { int32_t ret; g_uart1param.port = DEBUG_PORT; ZYF_UartRegister(g_uart1param.port, UartReadCallBack,&g_uart1param); ZYF_UartWriteCbRegister(g_uart1param.port,UartWriteCallBack,&g_uart1param); ZYF_UartOpen(g_uart1param.port, 115200, ZYF_FC_NONE); ZYF_LOG("AppUartInit"); return; } uint32_t ZYF_FileRead(const char *path, void *dst, uint32_t size) { int fd = ZYF_FS_Open(path, ZYF_RDONLY); if (fd < 0) return -1; uint32_t read_len = 0; ZYF_FS_Read(fd, dst, size,&read_len); ZYF_FS_Close(fd); return read_len; } uint32_t ZYF_SD_FileRead(const char *path, void *dst, uint32_t size) { int fd = ZYF_FS_SD_Open(path, ZYF_RDONLY); if (fd < 0) return -1; uint32_t read_len = 0; ZYF_FS_Read(fd, dst, size,&read_len); ZYF_FS_Close(fd); return read_len; } uint32_t ZYF_FileWrite(const char *path, void *dst, uint32_t size) { //check size int fd = ZYF_FS_Open(path, ZYF_RDWR | ZYF_CREAT | ZYF_TRUNC); if (fd < 0) return -1; uint32_t write_len = 0; ZYF_FS_Write(fd, dst, size,&write_len); ZYF_FS_Close(fd); return write_len; } uint32_t ZYF_SD_FileWrite(const char *path, void *dst, uint32_t size) //added by ldk for sdcard { //check size int fd = ZYF_FS_SD_Open(path, ZYF_RDWR | ZYF_CREAT | ZYF_TRUNC); if (fd < 0) return -1; uint32_t write_len = 0; ZYF_FS_Write(fd, dst, size,&write_len); ZYF_FS_Close(fd); return write_len; } void ZYF_FSTest(void) { uint8_t buf[128] = {0}; uint32_t len = 0; ZYF_FS_GetDiskFreeSpace( &len); ZYF_LOG("Free Space:%lu",len); #if 1 memset(buf,0x35,sizeof(buf)); len = ZYF_FileWrite(USER_FILE,buf,sizeof(buf)); if(len != sizeof(buf)) { ZYF_LOG("ZYF_FS_Write fail!ret:%d",len); return; } ZYF_LOG("ZYF_FS_Write succeed!"); #endif len = 0; memset(buf,0x00,sizeof(buf)); len = ZYF_FileRead(USER_FILE,buf,sizeof(buf)); if(len != sizeof(buf)) { ZYF_LOG("ZYF_FS_Read fail!ret:%d",len); return; } buf[127] = '\0'; ZYF_LOG("ZYF_FS_Read data:%s",buf); if(ZYF_FS_CheckFile(USER_FILE)) { ZYF_LOG("%s file exists",USER_FILE); //ZYF_FS_Delete(USER_FILE); } else { ZYF_LOG("%s file does not exist",USER_FILE); } /* //unimplement memset(buf,0x35,sizeof(buf)); len = ZYF_SD_FileWrite(SD_USER_FILE,buf,sizeof(buf)); if(len != sizeof(buf)) { ZYF_LOG("ZYF_SD_FileWrite fail!ret:%d",len); return; } ZYF_LOG("ZYF_SD_FileWrite succeed!"); len = 0; memset(buf,0x00,sizeof(buf)); len = ZYF_SD_FileRead(SD_USER_FILE,buf,sizeof(buf)); if(len != sizeof(buf)) { ZYF_LOG("ZYF_SD_FileRead fail!ret:%d",len); return; } buf[127] = '\0'; ZYF_LOG("ZYF_SD_FileRead data:%s",buf); if(ZYF_FS_SD_CheckFile(SD_USER_FILE)) { ZYF_LOG("%s file exists",SD_USER_FILE); //ZYF_FS_Delete(USER_FILE); } else { ZYF_LOG("%s file does not exist",SD_USER_FILE); } */ } void FileSystemThread_Example(void * Param) { ZYF_MsgQ_t *ptMsg; ZYF_AppMsg_t tMsg; int iRet = -1; ptMsg = ZYF_MsgQCreate(10, sizeof(ZYF_AppMsg_t)); ZYF_LOG("thread enter!"); ZYF_FSTest(); while (1) { ZYF_LOG("in while."); iRet = ZYF_MsgQGet(ptMsg, (void *)&tMsg); if (iRet < 0) { ZYF_LOG("Failed to get msg"); ZYF_ThreadSleep(1000); } } } static void prvInvokeGlobalCtors(void) { extern void (*__init_array_start[])(); extern void (*__init_array_end[])(); size_t count = __init_array_end - __init_array_start; for (size_t i = 0; i < count; ++i) __init_array_start[i](); } int appimg_enter(void *param) { AppUartInit(); ZYF_LOG("application image enter, param 0x%x", param); prvInvokeGlobalCtors(); ZYF_ThreadCreate("FileSystemThread_Example", FileSystemThread_Example, NULL, ZYF_PRIORITY_HIGH, 10*1024); return 0; } void appimg_exit(void) { OSI_LOGI(0, "application image exit"); }

     

    Processed: 0.015, SQL: 9