stress_abort/
stress_abort.rs1use std::{env, error::Error, process, thread, time::Duration};
2
3use vlfd_rs::{Board, IoConfig};
4
5fn main() {
6 if let Err(err) = real_main() {
7 eprintln!("error: {err}");
8 process::exit(1);
9 }
10}
11
12fn real_main() -> Result<(), Box<dyn Error>> {
13 let mut iterations = 10usize;
14 let mut words = 512usize;
15 let mut window = 4usize;
16 let mut clock_high = 4u16;
17 let mut clock_low = 4u16;
18 let mut settle_ms = 0u64;
19
20 let mut args = env::args().skip(1);
21 while let Some(flag) = args.next() {
22 match flag.as_str() {
23 "--iterations" => {
24 iterations = args
25 .next()
26 .ok_or("missing value for --iterations")?
27 .parse()?
28 }
29 "--words" => words = args.next().ok_or("missing value for --words")?.parse()?,
30 "--window" => window = args.next().ok_or("missing value for --window")?.parse()?,
31 "--clock-high" => {
32 clock_high = args
33 .next()
34 .ok_or("missing value for --clock-high")?
35 .parse()?
36 }
37 "--clock-low" => {
38 clock_low = args
39 .next()
40 .ok_or("missing value for --clock-low")?
41 .parse()?
42 }
43 "--settle-ms" => {
44 settle_ms = args
45 .next()
46 .ok_or("missing value for --settle-ms")?
47 .parse()?
48 }
49 other => return Err(format!("unknown flag `{other}`").into()),
50 }
51 }
52
53 let tx = vec![0x1234u16; words];
54
55 for iteration in 0..iterations {
56 println!("iter={iteration} phase=open");
57 let mut board = Board::open()?;
58 println!(
59 "iter={iteration} config programmed={} fifo_words={} version=0x{:04x}",
60 board.config().is_programmed(),
61 board.config().fifo_size_words(),
62 board.config().smims_version_raw()
63 );
64
65 let mut io = board.configure_io(&IoConfig {
66 clock_high_delay: clock_high,
67 clock_low_delay: clock_low,
68 ..IoConfig::default()
69 })?;
70
71 {
72 let mut rolling = io.transfer_window(words, window)?;
73 for submit_index in 0..window {
74 rolling.submit(&tx)?;
75 println!("iter={iteration} submit={submit_index}");
76 }
77 if settle_ms > 0 {
78 thread::sleep(Duration::from_millis(settle_ms));
79 }
80 }
81
82 io.finish()?;
83 board.close()?;
84
85 println!("iter={iteration} phase=reopen");
86 let reopened = Board::open()?;
87 println!(
88 "iter={iteration} reopened programmed={} fifo_words={} version=0x{:04x}",
89 reopened.config().is_programmed(),
90 reopened.config().fifo_size_words(),
91 reopened.config().smims_version_raw()
92 );
93 reopened.close()?;
94 }
95
96 Ok(())
97}