Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
F
Firmware
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Alberto Ruiz Garcia
Firmware
Commits
73f507da
Commit
73f507da
authored
11 years ago
by
Lorenz Meier
Browse files
Options
Downloads
Patches
Plain Diff
Make tests file complete up to 64 byte shifts and 1.5 K chunks
parent
260ab559
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
src/systemcmds/tests/tests_file.c
+133
-137
133 additions, 137 deletions
src/systemcmds/tests/tests_file.c
with
133 additions
and
137 deletions
src/systemcmds/tests/tests_file.c
+
133
−
137
View file @
73f507da
...
...
@@ -54,7 +54,8 @@
int
test_file
(
int
argc
,
char
*
argv
[])
{
const
iterations
=
200
;
const
unsigned
iterations
=
100
;
const
unsigned
alignments
=
65
;
/* check if microSD card is mounted */
struct
stat
buffer
;
...
...
@@ -63,194 +64,189 @@ test_file(int argc, char *argv[])
return
1
;
}
uint8_t
write_buf
[
512
+
64
]
__attribute__
((
aligned
(
64
)));
/* perform tests for a range of chunk sizes */
unsigned
chunk_sizes
[]
=
{
1
,
5
,
8
,
16
,
32
,
33
,
64
,
70
,
128
,
133
,
256
,
300
,
512
,
555
,
1024
,
1500
};
/* fill write buffer with known values */
for
(
int
i
=
0
;
i
<
sizeof
(
write_buf
);
i
++
)
{
/* this will wrap, but we just need a known value with spacing */
write_buf
[
i
]
=
i
+
11
;
}
for
(
unsigned
c
=
0
;
c
<
(
sizeof
(
chunk_sizes
)
/
sizeof
(
chunk_sizes
[
0
]));
c
++
)
{
uint8_t
read_buf
[
512
+
64
]
__attribute__
((
aligned
(
64
)));
hrt_abstime
start
,
end
;
perf_counter_t
wperf
=
perf_alloc
(
PC_ELAPSED
,
"SD writes (aligned)"
);
printf
(
"
\n
====== FILE TEST: %u bytes chunks ======"
,
chunk_sizes
[
c
]);
int
fd
=
open
(
"/fs/microsd/testfile"
,
O_TRUNC
|
O_WRONLY
|
O_CREAT
);
for
(
unsigned
a
=
0
;
a
<
alignments
;
a
++
)
{
warnx
(
"
testing unaligned writes - please wait.."
);
warnx
(
"
----- alignment test: %u bytes -----"
,
a
);
start
=
hrt_absolute_time
();
for
(
unsigned
i
=
0
;
i
<
iterations
;
i
++
)
{
perf_begin
(
wperf
);
int
wret
=
write
(
fd
,
write_buf
+
1
/*+ (i % 64)*/
,
512
);
uint8_t
write_buf
[
chunk_sizes
[
c
]
+
alignments
]
__attribute__
((
aligned
(
64
)));
if
(
wret
!=
512
)
{
warn
(
"WRITE ERROR!"
);
/* fill write buffer with known values */
for
(
int
i
=
0
;
i
<
sizeof
(
write_buf
);
i
++
)
{
/* this will wrap, but we just need a known value with spacing */
write_buf
[
i
]
=
i
+
11
;
}
if
((
0x3
&
(
uintptr_t
)(
write_buf
+
1
/* (i % 64)*/
)))
warnx
(
"memory is unaligned, align shift: %d"
,
1
/*(i % 64)*/
);
uint8_t
read_buf
[
chunk_sizes
[
c
]
+
alignments
]
__attribute__
((
aligned
(
64
)));
hrt_abstime
start
,
end
;
//perf_counter_t wperf = perf_alloc(PC_ELAPSED, "SD writes (aligned)");
}
int
fd
=
open
(
"/fs/microsd/testfile"
,
O_TRUNC
|
O_WRONLY
|
O_CREAT
);
fsync
(
fd
);
perf_end
(
wperf
);
warnx
(
"testing unaligned writes - please wait.."
);
}
end
=
hrt_absolute_time
();
start
=
hrt_absolute_time
();
for
(
unsigned
i
=
0
;
i
<
iterations
;
i
++
)
{
//perf_begin(wperf);
int
wret
=
write
(
fd
,
write_buf
+
a
,
chunk_sizes
[
c
]);
warnx
(
"%dKiB in %llu microseconds"
,
iterations
/
2
,
end
-
start
);
if
(
wret
!=
chunk_sizes
[
c
])
{
warn
(
"WRITE ERROR!"
);
perf_print_counter
(
wperf
);
perf_free
(
wperf
);
if
((
0x3
&
(
uintptr_t
)(
write_buf
+
a
)))
errx
(
1
,
"memory is unaligned, align shift: %d"
,
a
);
close
(
fd
);
fd
=
open
(
"/fs/microsd/testfile"
,
O_RDONLY
);
}
/* read back data for validation */
for
(
unsigned
i
=
0
;
i
<
iterations
;
i
++
)
{
int
rret
=
read
(
fd
,
read_buf
,
512
);
fsync
(
fd
);
//perf_end(wperf);
if
(
rret
!=
512
)
{
warn
(
"READ ERROR!"
);
break
;
}
/* compare value */
bool
compare_ok
=
true
;
for
(
int
j
=
0
;
j
<
512
;
j
++
)
{
if
(
read_buf
[
j
]
!=
write_buf
[
j
+
1
/*+ (i % 64)*/
])
{
warnx
(
"COMPARISON ERROR: byte %d, align shift: %d"
,
j
,
1
/*(i % 64)*/
);
compare_ok
=
false
;
break
;
}
}
end
=
hrt_absolute_time
();
if
(
!
compare_ok
)
{
warnx
(
"ABORTING FURTHER COMPARISON DUE TO ERROR"
);
break
;
}
}
//warnx("%dKiB in %llu microseconds", iterations / 2, end - start);
/*
* ALIGNED WRITES AND UNALIGNED READS
*/
//perf_print_counter(wperf);
//perf_free(wperf);
int
ret
=
unlink
(
"/fs/microsd/testfile"
);
fd
=
open
(
"/fs/microsd/testfile"
,
O_
TRUNC
|
O_WRONLY
|
O_CREAT
);
close
(
fd
);
fd
=
open
(
"/fs/microsd/testfile"
,
O_
RDONLY
);
warnx
(
"testing aligned writes - please wait.."
);
/* read back data for validation */
for
(
unsigned
i
=
0
;
i
<
iterations
;
i
++
)
{
int
rret
=
read
(
fd
,
read_buf
,
chunk_sizes
[
c
]);
start
=
hrt_absolute_time
();
for
(
unsigned
i
=
0
;
i
<
iterations
;
i
++
)
{
perf_begin
(
wperf
);
int
wret
=
write
(
fd
,
write_buf
,
512
);
if
(
rret
!=
chunk_sizes
[
c
])
{
errx
(
1
,
"READ ERROR!"
);
}
/* compare value */
bool
compare_ok
=
true
;
if
(
wret
!=
512
)
{
warn
(
"WRITE ERROR!"
);
}
for
(
int
j
=
0
;
j
<
chunk_sizes
[
c
];
j
++
)
{
if
(
read_buf
[
j
]
!=
write_buf
[
j
+
a
])
{
warnx
(
"COMPARISON ERROR: byte %d, align shift: %d"
,
j
,
a
);
compare_ok
=
false
;
break
;
}
}
perf_end
(
wperf
);
if
(
!
compare_ok
)
{
errx
(
1
,
"ABORTING FURTHER COMPARISON DUE TO ERROR"
);
}
}
}
fsync
(
fd
);
/*
* ALIGNED WRITES AND UNALIGNED READS
*/
warnx
(
"reading data aligned.."
);
close
(
fd
);
int
ret
=
unlink
(
"/fs/microsd/testfile"
);
fd
=
open
(
"/fs/microsd/testfile"
,
O_TRUNC
|
O_WRONLY
|
O_CREAT
);
close
(
fd
);
fd
=
open
(
"/fs/microsd/testfile"
,
O_RDONLY
);
warnx
(
"testing aligned writes - please wait.."
);
bool
align_read_ok
=
true
;
start
=
hrt_absolute_time
();
for
(
unsigned
i
=
0
;
i
<
iterations
;
i
++
)
{
int
wret
=
write
(
fd
,
write_buf
,
chunk_sizes
[
c
]);
/* read back data unaligned */
for
(
unsigned
i
=
0
;
i
<
iterations
;
i
++
)
{
int
rret
=
read
(
fd
,
read_buf
,
512
);
if
(
wret
!=
chunk_sizes
[
c
])
{
err
(
1
,
"WRITE ERROR!"
);
}
if
(
rret
!=
512
)
{
warn
(
"READ ERROR!"
);
break
;
}
/* compare value */
bool
compare_ok
=
true
;
for
(
int
j
=
0
;
j
<
512
;
j
++
)
{
if
(
read_buf
[
j
]
!=
write_buf
[
j
])
{
warnx
(
"COMPARISON ERROR: byte %d: %u != %u"
,
j
,
(
unsigned
int
)
read_buf
[
j
],
(
unsigned
int
)
write_buf
[
j
]);
align_read_ok
=
false
;
break
;
}
}
if
(
!
align_read_ok
)
{
warnx
(
"ABORTING FURTHER COMPARISON DUE TO ERROR"
);
break
;
}
fsync
(
fd
);
}
warnx
(
"reading data aligned.."
);
warnx
(
"align read result: %s
\n
"
,
(
align_read_ok
)
?
"OK"
:
"ERROR"
);
close
(
fd
);
fd
=
open
(
"/fs/microsd/testfile"
,
O_RDONLY
);
warnx
(
"reading data unaligned.."
)
;
bool
align_read_ok
=
true
;
close
(
fd
);
fd
=
open
(
"/fs/microsd/testfile"
,
O_RDONLY
);
/* read back data unaligned */
for
(
unsigned
i
=
0
;
i
<
iterations
;
i
++
)
{
int
rret
=
read
(
fd
,
read_buf
,
chunk_sizes
[
c
]);
bool
unalign_read_ok
=
true
;
int
unalign_read_err_count
=
0
;
if
(
rret
!=
chunk_sizes
[
c
])
{
err
(
1
,
"READ ERROR!"
);
}
/* compare value */
bool
compare_ok
=
true
;
memset
(
read_buf
,
0
,
sizeof
(
read_buf
));
read_buf
[
0
]
=
0
;
for
(
int
j
=
0
;
j
<
chunk_sizes
[
c
];
j
++
)
{
if
(
read_buf
[
j
]
!=
write_buf
[
j
])
{
warnx
(
"COMPARISON ERROR: byte %d: %u != %u"
,
j
,
(
unsigned
int
)
read_buf
[
j
],
(
unsigned
int
)
write_buf
[
j
]);
align_read_ok
=
false
;
break
;
}
}
warnx
(
"printing first 10 pairs:"
);
if
(
!
align_read_ok
)
{
errx
(
1
,
"ABORTING FURTHER COMPARISON DUE TO ERROR"
);
}
uint8_t
*
read_ptr
=
&
read_buf
[
1
];
}
/* read back data unaligned */
for
(
unsigned
i
=
0
;
i
<
iterations
;
i
++
)
{
int
rret
=
read
(
fd
,
read_ptr
,
512
);
warnx
(
"align read result: %s
\n
"
,
(
align_read_ok
)
?
"OK"
:
"ERROR"
);
warnx
(
"
first byte: %u (should be zero)"
,
(
unsigned
int
)
read_buf
[
0
]
);
warnx
(
"
reading data unaligned.."
);
if
(
rret
!=
512
)
{
warn
(
"READ ERROR!"
);
break
;
}
close
(
fd
);
fd
=
open
(
"/fs/microsd/testfile"
,
O_RDONLY
);
for
(
int
j
=
0
;
j
<
512
;
j
++
)
{
bool
unalign_read_ok
=
true
;
int
unalign_read_err_count
=
0
;
if
(
i
==
0
&&
j
<
10
)
{
warnx
(
"read: %u, expect: %u"
,
(
unsigned
int
)(
read_buf
+
1
)[
j
],
(
unsigned
int
)
write_buf
[
j
]);
}
memset
(
read_buf
,
0
,
sizeof
(
read_buf
));
if
((
read_buf
+
1
)[
j
]
!=
write_buf
[
j
])
{
warnx
(
"COMPARISON ERROR: byte %d, align shift: %d: %u != %u"
,
j
,
1
/*(i % 64)*/
,
(
unsigned
int
)
read_ptr
[
j
],
(
unsigned
int
)
write_buf
[
j
]);
unalign_read_ok
=
false
;
unalign_read_err_count
++
;
if
(
unalign_read_err_count
>
10
)
break
;
}
}
/* read back data unaligned */
for
(
unsigned
i
=
0
;
i
<
iterations
;
i
++
)
{
int
rret
=
read
(
fd
,
read_buf
+
a
,
chunk_sizes
[
c
]);
if
(
!
unalign_read_ok
)
{
warnx
(
"ABORTING FURTHER COMPARISON DUE TO ERROR"
);
break
;
}
if
(
rret
!=
chunk_sizes
[
c
])
{
err
(
1
,
"READ ERROR!"
);
}
}
for
(
int
j
=
0
;
j
<
chunk_sizes
[
c
];
j
++
)
{
ret
=
unlink
(
"/fs/microsd/testfile"
);
close
(
fd
);
if
((
read_buf
+
a
)[
j
]
!=
write_buf
[
j
])
{
warnx
(
"COMPARISON ERROR: byte %d, align shift: %d: %u != %u"
,
j
,
a
,
(
unsigned
int
)
read_buf
[
j
+
a
],
(
unsigned
int
)
write_buf
[
j
]);
unalign_read_ok
=
false
;
unalign_read_err_count
++
;
if
(
unalign_read_err_count
>
10
)
break
;
}
}
if
(
!
unalign_read_ok
)
{
errx
(
1
,
"ABORTING FURTHER COMPARISON DUE TO ERROR"
);
}
if
(
ret
)
err
(
1
,
"UNLINKING FILE FAILED"
);
}
ret
=
unlink
(
"/fs/microsd/testfile"
);
close
(
fd
);
if
(
ret
)
err
(
1
,
"UNLINKING FILE FAILED"
);
}
}
/* list directory */
DIR
*
d
;
struct
dirent
*
dir
;
DIR
*
d
;
struct
dirent
*
dir
;
d
=
opendir
(
"/fs/microsd"
);
if
(
d
)
{
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment