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