Browse Source

Merge pull request #3526 from majianjia/master

Export file examples to MSH
Bernard Xiong 5 years ago
parent
commit
50512e8a8c
5 changed files with 203 additions and 82 deletions
  1. 38 10
      examples/file/listdir.c
  2. 31 8
      examples/file/readspeed.c
  3. 91 46
      examples/file/readwrite.c
  4. 9 10
      examples/file/seekdir.c
  5. 34 8
      examples/file/writespeed.c

+ 38 - 10
examples/file/listdir.c

@@ -1,22 +1,19 @@
 /*
- * File      : listdir.c
- * This file is part of RT-TestCase in RT-Thread RTOS
- * COPYRIGHT (C) 2010, RT-Thread Development Team
+ * Copyright (c) 2006-2020, RT-Thread Development Team
  *
- * The license and distribution terms for this file may be
- * found in the file LICENSE in this distribution or at
- * http://www.rt-thread.org/license/LICENSE
+ * SPDX-License-Identifier: Apache-2.0
  *
  * Change Logs:
  * Date           Author       Notes
  * 2010-02-10     Bernard      first version
+ * 2020-04-12     Jianjia Ma   add msh cmd
  */
 #include <rtthread.h>
 #include <dfs_posix.h>
 
-static char fullpath[256];
 void list_dir(const char* path)
 {
+    char * fullpath;
 	DIR *dir;
 
 	dir = opendir(path);
@@ -25,6 +22,13 @@ void list_dir(const char* path)
 		struct dirent* dirent;
 		struct stat s;
 
+	    fullpath = rt_malloc(256);
+	    if (fullpath == RT_NULL)
+	    {
+	        rt_kprintf("no memory\n");
+	        return;
+	    }
+
 		do
 		{
 			dirent = readdir(dir);
@@ -35,7 +39,7 @@ void list_dir(const char* path)
 			rt_sprintf(fullpath, "%s/%s", path, dirent->d_name);
 
 			stat(fullpath, &s);
-			if ( s.st_mode & DFS_S_IFDIR )
+			if ( s.st_mode & S_IFDIR )
 			{
 				rt_kprintf("%s\t\t<DIR>\n", dirent->d_name);
 			}
@@ -47,10 +51,34 @@ void list_dir(const char* path)
 
 		closedir(dir);
 	}
-	else rt_kprintf("open %s directory failed\n", path);
+	else
+	{
+	    rt_kprintf("open %s directory failed\n", path);
+	}
+
+	rt_free(fullpath);
 }
 
 #ifdef RT_USING_FINSH
 #include <finsh.h>
 FINSH_FUNCTION_EXPORT(list_dir, list directory);
-#endif
+
+#ifdef FINSH_USING_MSH
+static void cmd_list_dir(int argc, char *argv[])
+{
+    char* filename;
+
+    if(argc == 2)
+    {
+        filename = argv[1];
+    }
+    else
+    {
+        rt_kprintf("Usage: list_dir [file_path]\n");
+        return;
+    }
+    list_dir(filename);
+}
+FINSH_FUNCTION_EXPORT_ALIAS(cmd_list_dir, __cmd_list_dir, list directory);
+#endif /* FINSH_USING_MSH */
+#endif /* RT_USING_FINSH */

+ 31 - 8
examples/file/readspeed.c

@@ -1,15 +1,12 @@
 /*
- * File      : readspeed.c
- * This file is part of RT-TestCase in RT-Thread RTOS
- * COPYRIGHT (C) 2010, RT-Thread Development Team
+ * Copyright (c) 2006-2020, RT-Thread Development Team
  *
- * The license and distribution terms for this file may be
- * found in the file LICENSE in this distribution or at
- * http://www.rt-thread.org/license/LICENSE
+ * SPDX-License-Identifier: Apache-2.0
  *
  * Change Logs:
  * Date           Author       Notes
  * 2010-02-10     Bernard      first version
+ * 2020-04-12     Jianjia Ma   add msh cmd
  */
 
 #include <rtthread.h>
@@ -34,7 +31,6 @@ void readspeed(const char* filename, int block_size)
     {
         rt_kprintf("no memory\n");
         close(fd);
-
         return;
     }
 
@@ -61,4 +57,31 @@ void readspeed(const char* filename, int block_size)
 #ifdef RT_USING_FINSH
 #include <finsh.h>
 FINSH_FUNCTION_EXPORT(readspeed, perform file read test);
-#endif
+
+#ifdef FINSH_USING_MSH
+static void cmd_readspeed(int argc, char *argv[])
+{
+    char* filename;
+    int block_size;
+
+    if(argc == 3)
+    {
+        filename = argv[1];
+        block_size = atoi(argv[2]);
+    }
+    else if(argc == 2)
+    {
+        filename = argv[1];
+        block_size = 512;
+    }
+    else
+    {
+       rt_kprintf("Usage:\nreadspeed [file_path] [block_size]\n");
+       rt_kprintf("readspeed [file_path] with default block size 512\n");
+       return;
+    }
+    readspeed(filename, block_size);
+}
+FINSH_FUNCTION_EXPORT_ALIAS(cmd_readspeed, __cmd_readspeed, test file system read speed);
+#endif /* FINSH_USING_MSH */
+#endif /* RT_USING_FINSH */

+ 91 - 46
examples/file/readwrite.c

@@ -1,123 +1,168 @@
 /*
- * 代码清单:文件读写例子
+ * Copyright (c) 2006-2020, RT-Thread Development Team
  *
- * 这个例子演示了如何读写一个文件,特别是写的时候应该如何操作。
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2010-02-10     Bernard      first version
+ * 2020-04-12     Jianjia Ma   add msh cmd
  */
 
 #include <rtthread.h>
-#include <dfs_posix.h> /* 当需要使用文件操作时,需要包含这个头文件 */
-
-#define TEST_FN		"/test.dat"
+#include <dfs_posix.h>
 
-/* 测试用的数据和缓冲 */
-static char test_data[120], buffer[120];
+#define TEST_DATA_LEN     120
 
-/* 文件读写测试 */
+/* file read write test */
 void readwrite(const char* filename)
 {
 	int fd;
 	int index, length;
+	char* test_data;
+	char* buffer;
+	int block_size = TEST_DATA_LEN;
 
-	/* 只写 & 创建 打开 */
-	fd = open(TEST_FN, O_WRONLY | O_CREAT | O_TRUNC, 0);
+	/* open with write only & create */
+	fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0);
 	if (fd < 0)
 	{
 		rt_kprintf("open file for write failed\n");
 		return;
 	}
 
-	/* 准备写入数据 */
-	for (index = 0; index < sizeof(test_data); index ++)
+	test_data = rt_malloc(block_size);
+    if (test_data == RT_NULL)
+    {
+        rt_kprintf("no memory\n");
+        close(fd);
+        return;
+    }
+
+    buffer = rt_malloc(block_size);
+    if (buffer == RT_NULL)
+    {
+        rt_kprintf("no memory\n");
+        close(fd);
+        rt_free(test_data);
+        return;
+    }
+
+	/* prepare some data */
+	for (index = 0; index < block_size; index ++)
 	{
 		test_data[index] = index + 27;
 	}
 
-	/* 写入数据 */
-	length = write(fd, test_data, sizeof(test_data));
-	if (length != sizeof(test_data))
+	/* write to file */
+	length = write(fd, test_data, block_size);
+	if (length != block_size)
 	{
 		rt_kprintf("write data failed\n");
 		close(fd);
-		return;
+		goto __exit;
 	}
 
-	/* 关闭文件 */
+	/* close file */
 	close(fd);
 
-	/* 只写并在末尾添加打开 */
-	fd = open(TEST_FN, O_WRONLY | O_CREAT | O_APPEND, 0);
+	/* reopen the file with append to the end */
+	fd = open(filename, O_WRONLY | O_CREAT | O_APPEND, 0);
 	if (fd < 0)
 	{
 		rt_kprintf("open file for append write failed\n");
-		return;
+		goto __exit;;
 	}
 
-	length = write(fd, test_data, sizeof(test_data));
-	if (length != sizeof(test_data))
+	length = write(fd, test_data, block_size);
+	if (length != block_size)
 	{
 		rt_kprintf("append write data failed\n");
 		close(fd);
-		return;
+		goto __exit;
 	}
-	/* 关闭文件 */
+	/* close the file */
 	close(fd);
 
-	/* 只读打开进行数据校验 */
-	fd = open(TEST_FN, O_RDONLY, 0);
+	/* open the file for data validation. */
+	fd = open(filename, O_RDONLY, 0);
 	if (fd < 0)
 	{
 		rt_kprintf("check: open file for read failed\n");
-		return;
+		goto __exit;
 	}
 
-	/* 读取数据(应该为第一次写入的数据) */
-	length = read(fd, buffer, sizeof(buffer));
-	if (length != sizeof(buffer))
+	/* read the data (should be the data written by the first time ) */
+	length = read(fd, buffer, block_size);
+	if (length != block_size)
 	{
 		rt_kprintf("check: read file failed\n");
 		close(fd);
-		return;
+		goto __exit;
 	}
 
-	/* 检查数据是否正确 */
-	for (index = 0; index < sizeof(test_data); index ++)
+	/* validate */
+	for (index = 0; index < block_size; index ++)
 	{
 		if (test_data[index] != buffer[index])
 		{
 			rt_kprintf("check: check data failed at %d\n", index);
 			close(fd);
-			return;
+			goto __exit;
 		}
 	}
 
-	/* 读取数据(应该为第二次写入的数据) */
-	length = read(fd, buffer, sizeof(buffer));
-	if (length != sizeof(buffer))
+	/* read the data (should be the second time data) */
+	length = read(fd, buffer, block_size);
+	if (length != block_size)
 	{
 		rt_kprintf("check: read file failed\n");
 		close(fd);
-		return;
+		goto __exit;
 	}
 
-	/* 检查数据是否正确 */
-	for (index = 0; index < sizeof(test_data); index ++)
+	/* validate */
+	for (index = 0; index < block_size; index ++)
 	{
 		if (test_data[index] != buffer[index])
 		{
 			rt_kprintf("check: check data failed at %d\n", index);
 			close(fd);
-			return;
+			goto __exit;
 		}
 	}
 
-	/* 检查数据完毕,关闭文件 */
+	/* close the file */
 	close(fd);
-	/* 打印结果 */
-	rt_kprintf("read/write done.\n");
+	/* print result */
+	rt_kprintf("read/write test successful!\n");
+
+__exit:
+    rt_free(test_data);
+    rt_free(buffer);
 }
 
 #ifdef RT_USING_FINSH
 #include <finsh.h>
-/* 输出函数到finsh shell命令行中 */
+/* export to finsh */
 FINSH_FUNCTION_EXPORT(readwrite, perform file read and write test);
-#endif
+
+#ifdef FINSH_USING_MSH
+static void cmd_readwrite(int argc, char *argv[])
+{
+    char* filename;
+
+    if(argc == 2)
+    {
+        filename = argv[1];
+    }
+    else
+    {
+        rt_kprintf("Usage: readwrite [file_path]\n");
+        return;
+    }
+    readwrite(filename);
+}
+FINSH_FUNCTION_EXPORT_ALIAS(cmd_readwrite, __cmd_readwrite, perform file read and write test);
+#endif /* FINSH_USING_MSH */
+#endif /* RT_USING_FINSH */

+ 9 - 10
examples/file/seekdir.c

@@ -1,15 +1,12 @@
 /*
- * File      : seekdir.c
- * This file is part of RT-TestCase in RT-Thread RTOS
- * COPYRIGHT (C) 2011, RT-Thread Development Team
+ * Copyright (c) 2006-2020, RT-Thread Development Team
  *
- * The license and distribution terms for this file may be
- * found in the file LICENSE in this distribution or at
- * http://www.rt-thread.org/license/LICENSE
+ * SPDX-License-Identifier: Apache-2.0
  *
  * Change Logs:
  * Date           Author       Notes
  * 2011-06-02     Bernard      first version
+ * 2020-04-12     Jianjia Ma   add msh cmd
  */
 #include <dfs_posix.h>
 
@@ -17,7 +14,6 @@ void seekdir_test(void)
 {
 	DIR * dirp;
 	long save3 = 0;
-	long cur;
 	int i = 0;
 	struct dirent *dp;
 
@@ -27,14 +23,14 @@ void seekdir_test(void)
 	{
 		rt_kprintf("direntry: %s\n", dp->d_name);
 
-		/* 保存第三个目录项的目录指针 */
+		/* save the pointer of the third directory */
 		if (i++ == 3)
 		{
 			save3 = telldir(dirp);
 		}
 	}
 
-	/* 回到刚才保存的第三个目录项的目录指针 */
+	/* get back to the third directory */
 	seekdir (dirp, save3);
 	rt_kprintf("seek dientry to: %d\n", save3);
 	for (dp = readdir(dirp); dp != RT_NULL; dp = readdir(dirp))
@@ -42,9 +38,12 @@ void seekdir_test(void)
 		rt_kprintf("direntry: %s\n", dp->d_name);
 	}
 
-	/* 关闭目录 */
+	/* close the directory */
 	closedir (dirp);
 } 
 
+#ifdef RT_USING_FINSH
 #include <finsh.h>
 FINSH_FUNCTION_EXPORT(seekdir_test, perform directory seek test);
+MSH_CMD_EXPORT(seekdir_test, perform directory seek test);
+#endif /* RT_USING_FINSH */

+ 34 - 8
examples/file/writespeed.c

@@ -1,15 +1,12 @@
 /*
- * File      : writespeed.c
- * This file is part of RT-TestCase in RT-Thread RTOS
- * COPYRIGHT (C) 2010, RT-Thread Development Team
+ * Copyright (c) 2006-2020, RT-Thread Development Team
  *
- * The license and distribution terms for this file may be
- * found in the file LICENSE in this distribution or at
- * http://www.rt-thread.org/license/LICENSE
+ * SPDX-License-Identifier: Apache-2.0
  *
  * Change Logs:
  * Date           Author       Notes
  * 2010-02-10     Bernard      first version
+ * 2020-04-12     Jianjia Ma   add msh cmd
  */
 #include <rtthread.h>
 #include <dfs_posix.h>
@@ -32,7 +29,6 @@ void writespeed(const char* filename, int total_length, int block_size)
     {
         rt_kprintf("no memory\n");
         close(fd);
-
         return;
     }
 
@@ -69,4 +65,34 @@ void writespeed(const char* filename, int total_length, int block_size)
 #ifdef RT_USING_FINSH
 #include <finsh.h>
 FINSH_FUNCTION_EXPORT(writespeed, perform file write test);
-#endif
+
+#ifdef FINSH_USING_MSH
+static void cmd_writespeed(int argc, char *argv[])
+{
+    char* filename;
+    int length;
+    int block_size;
+
+    if(argc == 4)
+    {
+        filename = argv[1];
+        length = atoi(argv[2]);
+        block_size = atoi(argv[3]);
+    }
+    else if(argc == 2)
+    {
+        filename = argv[1];
+        block_size = 512;
+        length = 1024*1024;
+    }
+    else
+    {
+       rt_kprintf("Usage:\nwritespeed [file_path] [length] [block_size]\n");
+       rt_kprintf("writespeed [file_path] with default length 1MB and block size 512\n");
+       return;
+    }
+    writespeed(filename, length, block_size);
+}
+FINSH_FUNCTION_EXPORT_ALIAS(cmd_writespeed, __cmd_writespeed, test file system write speed);
+#endif /* FINSH_USING_MSH */
+#endif /* RT_USING_FINSH */