annotate packages/fs/yaffs/current/tests/mounttime.c @ 336:38a956139d12

Import tests from eCosPro
author Ross Younger <wry@ecoscentric.com>
date Tue, 03 Nov 2009 18:00:39 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
336
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
1 //=============================================================================
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
2 //
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
3 // mounttime.c
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
4 //
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
5 // Mount timings exerciser, use on a filesystem filled by `makefiles'
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
6 // THIS DOES NOT CURRENTLY WORK ON non-PRO eCos!
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
7 //
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
8 //=============================================================================
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
9 // ####ECOSGPLCOPYRIGHTBEGIN####
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
10 // -------------------------------------------
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
11 // This file is part of eCos, the Embedded Configurable Operating System.
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
12 // Copyright (C) 2009 Free Software Foundation, Inc.
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
13 //
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
14 // eCos is free software; you can redistribute it and/or modify it under
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
15 // the terms of the GNU General Public License as published by the Free
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
16 // Software Foundation; either version 2 or (at your option) any later
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
17 // version.
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
18 //
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
19 // eCos is distributed in the hope that it will be useful, but WITHOUT
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
20 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
21 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
22 // for more details.
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
23 //
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
24 // You should have received a copy of the GNU General Public License
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
25 // along with eCos; if not, write to the Free Software Foundation, Inc.,
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
26 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
27 //
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
28 // As a special exception, if other files instantiate templates or use
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
29 // macros or inline functions from this file, or you compile this file
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
30 // and link it with other works to produce a work based on this file,
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
31 // this file does not by itself cause the resulting work to be covered by
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
32 // the GNU General Public License. However the source code for this file
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
33 // must still be made available in accordance with section (3) of the GNU
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
34 // General Public License v2.
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
35 //
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
36 // This exception does not invalidate any other reasons why a work based
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
37 // on this file might be covered by the GNU General Public License.
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
38 // -------------------------------------------
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
39 // ####ECOSGPLCOPYRIGHTEND####
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
40 //==========================================================================
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
41 //#####DESCRIPTIONBEGIN####
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
42 //
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
43 // Author(s): wry
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
44 // Date: 2009-06-29
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
45 // Description: File system mount and unmount timing benchmark.
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
46 // Intended to be used on a complicated filesystem, e.g.
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
47 // one filled up by `makefiles'.
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
48 // Some timing code borrowed from mmfs tests.
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
49 //
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
50 //####DESCRIPTIONEND####
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
51 //=============================================================================
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
52
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
53 #include <cyg/infra/testcase.h>
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
54 #include <cyg/infra/diag.h>
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
55 #include <cyg/infra/cyg_ass.h>
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
56 #include <pkgconf/system.h>
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
57 #include <pkgconf/hal.h>
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
58 #include <cyg/hal/hal_intr.h>
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
59
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
60 #ifndef HAL_CLOCK_READ
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
61 # error "HAL_CLOCK_READ not defined!"
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
62 #endif
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
63
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
64 #if !defined(CYGPKG_LIBC_TIME) || !defined(CYGPKG_ERROR) || !defined(CYGPKG_LIBC_STDIO) || !defined(CYGPKG_KERNEL)
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
65
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
66 void cyg_user_start(void)
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
67 {
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
68 CYG_TEST_NA("Needs CYGPKG_KERNEL, CYGPKG_LIBC_TIME, CYGPKG_ERROR and CYGPKG_LIBC_STDIO");
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
69 }
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
70
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
71 #else
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
72
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
73 #include <cyg/fileio/fileio.h>
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
74 #include <string.h>
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
75 #include <stdio.h>
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
76 #include <unistd.h>
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
77 #include <sys/types.h>
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
78 #include <dirent.h>
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
79 #include <stdlib.h>
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
80
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
81 #include <cyg/kernel/kapi.h>
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
82
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
83 #ifdef CYGPKG_DEVS_NAND_SYNTH
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
84 #define DEVICE "synth/0"
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
85 #else
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
86 #define DEVICE "onboard/0"
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
87 #endif
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
88
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
89 #define MOUNTPOINT "/n"
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
90 #define FSTYPE "yaffs"
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
91 #define _NOCACHE "skip-checkpoint-read"
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
92
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
93 #define FS_NOCACHE FSTYPE":"_NOCACHE
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
94
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
95 //#define MUST(what) do { CYG_TEST_CHECK((what), #what); } while(0)
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
96
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
97 #define MUST(what) do { \
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
98 if (0 != what) { \
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
99 perror(#what); \
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
100 CYG_TEST_FAIL(#what); \
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
101 cyg_test_exit(); \
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
102 } \
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
103 } while(0)
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
104
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
105 #define min(a,b) ( (a) > (b) ? (b) : (a) )
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
106
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
107 // --------------------------------------------------------------
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
108
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
109 void RM_RF_work(const char *f, int recurse)
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
110 {
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
111 MUST(chdir(f));
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
112 DIR *d = opendir(".");
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
113 if (!d) {
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
114 diag_printf("opendir %s: %s\n", f, strerror(errno));
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
115 return;
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
116 }
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
117 struct dirent de_stack;
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
118 struct dirent *de_res;
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
119 while (0==readdir_r(d, &de_stack, &de_res) && de_res) {
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
120 struct stat st;
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
121 if (0==strcmp(de_res->d_name,".")) continue;
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
122 if (0==strcmp(de_res->d_name,"..")) continue;
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
123 MUST(stat(de_res->d_name,&st));
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
124 if (S_ISDIR(st.st_mode)) {
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
125 RM_RF_work(de_res->d_name, recurse+1);
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
126 if (rmdir(de_res->d_name))
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
127 perror("rmdir");
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
128 } else {
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
129 MUST(unlink(de_res->d_name));
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
130 }
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
131 }
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
132 closedir(d);
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
133 MUST(chdir(".."));
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
134 }
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
135
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
136 void RM_RF(const char *p)
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
137 {
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
138 diag_printf("rm -rf %s\n",p);
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
139 RM_RF_work(p,0);
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
140 MUST(rmdir(p));
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
141 }
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
142
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
143 // --------------------------------------------------------------
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
144 // Timing code cribbed from pvr5.c
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
145
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
146 typedef struct
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
147 {
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
148 cyg_int64 ticks;
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
149 cyg_uint32 halticks;
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
150 } timestamp;
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
151
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
152 typedef struct
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
153 {
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
154 timestamp start;
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
155 timestamp end;
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
156 cyg_int64 interval; // In HAL ticks
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
157 cyg_int64 us_interval; // Interval in microseconds
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
158 } timing;
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
159
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
160 static cyg_int64 ticks_overhead = 0;
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
161 static cyg_int32 us_per_haltick = 0;
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
162 static cyg_int32 halticks_per_us = 0;
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
163
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
164 static cyg_int64 rtc_resolution[] = CYGNUM_KERNEL_COUNTERS_RTC_RESOLUTION;
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
165 static cyg_int64 rtc_period = CYGNUM_KERNEL_COUNTERS_RTC_PERIOD;
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
166
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
167 static void wait_for_tick( void )
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
168 {
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
169 cyg_tick_count_t now = cyg_current_time();
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
170
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
171 while( cyg_current_time() == now )
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
172 continue;
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
173 }
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
174
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
175 static void get_timestamp( timestamp *ts )
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
176 {
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
177 ts->ticks = cyg_current_time();
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
178 HAL_CLOCK_READ( &ts->halticks );
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
179 }
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
180
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
181 static cyg_int64 ticks_to_us( cyg_int64 ticks )
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
182 {
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
183 cyg_int64 us;
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
184
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
185 if( us_per_haltick != 0 )
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
186 us = ticks * us_per_haltick;
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
187 else
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
188 us = ticks / halticks_per_us;
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
189
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
190 return us;
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
191 }
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
192
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
193 static void calculate_interval( timing *t )
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
194 {
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
195 t->interval = t->end.halticks - t->start.halticks;
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
196
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
197 t->interval += (t->end.ticks - t->start.ticks) * rtc_period;
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
198
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
199 t->interval -= ticks_overhead;
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
200
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
201 t->us_interval = ticks_to_us( t->interval );
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
202 }
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
203
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
204 static void init_timing( void )
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
205 {
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
206 timing t;
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
207 cyg_thread_delay(2); // ensure clock running - asserts if not
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
208
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
209 us_per_haltick = 1000000/(rtc_period * rtc_resolution[1]);
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
210 halticks_per_us = (rtc_period * rtc_resolution[1])/1000000;
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
211
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
212 wait_for_tick();
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
213
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
214 get_timestamp( &t.start );
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
215 get_timestamp( &t.end );
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
216
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
217 calculate_interval( &t );
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
218
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
219 ticks_overhead = t.interval;
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
220
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
221 diag_printf("Timing overhead %lld ticks (%lluus), this will be factored out of all other measurements\n", ticks_overhead, t.us_interval );
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
222 }
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
223
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
224 static timing tm;
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
225
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
226 #define START() do { \
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
227 wait_for_tick(); \
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
228 get_timestamp(&tm.start); \
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
229 } while(0)
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
230
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
231 static void report(const char *what, timing tm)
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
232 {
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
233 if (tm.us_interval > 1100000)
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
234 diag_printf("%30s: %2d.%03d s\n", what, (int)(tm.us_interval/1000000), (int)(tm.us_interval/1000)%1000);
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
235 else
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
236 diag_printf("%30s: %2d.%03d ms\n", what, (int)(tm.us_interval/1000), (int)(tm.us_interval%1000));
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
237
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
238 }
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
239
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
240 #define STOP(what) do { \
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
241 get_timestamp(&tm.end); \
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
242 calculate_interval(&tm); \
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
243 report(what, tm); \
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
244 } while(0)
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
245
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
246 // --------------------------------------------------------------
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
247
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
248 void dumpmallinfo(void)
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
249 {
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
250 struct mallinfo mi = mallinfo();
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
251 int total_ord = mi.uordblks + mi.fordblks;
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
252 double pct = (double)mi.uordblks / (double)total_ord;
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
253 diag_printf("! Arena: size 0x%x, small blks %u/%u, ord blks used %u/%u (%u%%)\n",
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
254 mi.arena,
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
255 mi.usmblks, mi.fsmblks,
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
256 mi.uordblks, total_ord, (int)(100.0*pct));
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
257 }
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
258
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
259 // --------------------------------------------------------------
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
260
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
261 #define WORKDIR MOUNTPOINT "/" "test"
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
262
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
263 void mounttime_main(void)
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
264 {
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
265 #define NTIMES 3
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
266 int i;
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
267 for (i=0; i<NTIMES; i++) {
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
268 START();
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
269 MUST(mount(DEVICE, MOUNTPOINT, FSTYPE));
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
270 STOP("remount");
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
271 //if (i==0) dumpmallinfo();
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
272 START();
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
273 MUST(umount(MOUNTPOINT));
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
274 STOP("unmount");
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
275
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
276 START();
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
277 MUST(mount(DEVICE, MOUNTPOINT, FS_NOCACHE));
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
278 // plain eCos does not support mount options, this test won't work there.
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
279 STOP("remount without checkpoint");
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
280 //if (i==0) dumpmallinfo();
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
281 START();
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
282 MUST(umount(MOUNTPOINT));
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
283 STOP("unmount");
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
284 //if (i==0) dumpmallinfo();
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
285 }
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
286 //dumpmallinfo();
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
287
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
288 // then consider repeats..
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
289
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
290 CYG_TEST_EXIT("Run complete");
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
291 }
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
292
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
293 int main(void)
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
294 {
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
295 CYG_TEST_INIT();
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
296 init_timing();
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
297
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
298 mounttime_main();
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
299 return 0;
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
300 }
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
301
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
302 #endif
38a956139d12 Import tests from eCosPro
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
303