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 #include <rtthread.h>
12 #include <dfs_file.h>
13 #include <unistd.h>
14 #include <stdio.h>
15 #include <sys/stat.h>
16 #include <sys/statfs.h>
17
writespeed(const char * filename,int total_length,int block_size)18 void writespeed(const char* filename, int total_length, int block_size)
19 {
20 int fd, index, length;
21 char *buff_ptr;
22 rt_tick_t tick;
23
24 fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0);
25 if (fd < 0)
26 {
27 rt_kprintf("open file:%s failed\n", filename);
28 return;
29 }
30
31 buff_ptr = rt_malloc(block_size);
32 if (buff_ptr == RT_NULL)
33 {
34 rt_kprintf("no memory\n");
35 close(fd);
36 return;
37 }
38
39 /* prepare write data */
40 for (index = 0; index < block_size; index++)
41 {
42 buff_ptr[index] = index;
43 }
44 index = 0;
45
46 /* get the beginning tick */
47 tick = rt_tick_get();
48 while (index < total_length / block_size)
49 {
50 length = write(fd, buff_ptr, block_size);
51 if (length != block_size)
52 {
53 rt_kprintf("write failed\n");
54 break;
55 }
56
57 index ++;
58 }
59 tick = rt_tick_get() - tick;
60
61 /* close file and release memory */
62 close(fd);
63 rt_free(buff_ptr);
64
65 /* calculate write speed */
66 rt_kprintf("File write speed: %d byte/s\n", total_length / tick * RT_TICK_PER_SECOND);
67 }
68
69 #ifdef RT_USING_FINSH
70 #include <finsh.h>
71 FINSH_FUNCTION_EXPORT(writespeed, perform file write test);
72
cmd_writespeed(int argc,char * argv[])73 static void cmd_writespeed(int argc, char *argv[])
74 {
75 char* filename;
76 int length;
77 int block_size;
78
79 if(argc == 4)
80 {
81 filename = argv[1];
82 length = atoi(argv[2]);
83 block_size = atoi(argv[3]);
84 }
85 else if(argc == 2)
86 {
87 filename = argv[1];
88 block_size = 512;
89 length = 1024*1024;
90 }
91 else
92 {
93 rt_kprintf("Usage:\nwritespeed [file_path] [length] [block_size]\n");
94 rt_kprintf("writespeed [file_path] with default length 1MB and block size 512\n");
95 return;
96 }
97 writespeed(filename, length, block_size);
98 }
99 MSH_CMD_EXPORT_ALIAS(cmd_writespeed, writespeed, test file system write speed);
100 #endif /* RT_USING_FINSH */
101