1 /*
2  * Copyright (c) 2006-2021, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2010-02-10     Bernard      first version
9  * 2020-04-12     Jianjia Ma   add msh cmd
10  */
11 
12 #include <rtthread.h>
13 #include <dfs_file.h>
14 #include <unistd.h>
15 #include <stdio.h>
16 #include <sys/stat.h>
17 #include <sys/statfs.h>
18 
readspeed(const char * filename,int block_size)19 void readspeed(const char* filename, int block_size)
20 {
21     int fd;
22     char *buff_ptr;
23     rt_size_t total_length;
24     rt_tick_t tick;
25 
26     fd = open(filename, 0, O_RDONLY);
27     if (fd < 0)
28     {
29         rt_kprintf("open file:%s failed\n", filename);
30         return;
31     }
32 
33     buff_ptr = rt_malloc(block_size);
34     if (buff_ptr == RT_NULL)
35     {
36         rt_kprintf("no memory\n");
37         close(fd);
38         return;
39     }
40 
41     tick = rt_tick_get();
42     total_length = 0;
43     while (1)
44     {
45         int length;
46         length = read(fd, buff_ptr, block_size);
47 
48         if (length <= 0) break;
49         total_length += length;
50     }
51     tick = rt_tick_get() - tick;
52 
53     /* close file and release memory */
54     close(fd);
55     rt_free(buff_ptr);
56 
57     /* calculate read speed */
58     rt_kprintf("File read speed: %d byte/s\n", total_length /tick * RT_TICK_PER_SECOND);
59 }
60 
61 #ifdef RT_USING_FINSH
62 #include <finsh.h>
63 FINSH_FUNCTION_EXPORT(readspeed, perform file read test);
64 
cmd_readspeed(int argc,char * argv[])65 static void cmd_readspeed(int argc, char *argv[])
66 {
67     char* filename;
68     int block_size;
69 
70     if(argc == 3)
71     {
72         filename = argv[1];
73         block_size = atoi(argv[2]);
74     }
75     else if(argc == 2)
76     {
77         filename = argv[1];
78         block_size = 512;
79     }
80     else
81     {
82        rt_kprintf("Usage:\nreadspeed [file_path] [block_size]\n");
83        rt_kprintf("readspeed [file_path] with default block size 512\n");
84        return;
85     }
86     readspeed(filename, block_size);
87 }
88 MSH_CMD_EXPORT_ALIAS(cmd_readspeed, readspeed, test file system read speed);
89 #endif /* RT_USING_FINSH */
90