Skip to content

Commit 7b652ce

Browse files
committed
Do not scan ram to find RTT block, instead use elf to find exact address
1 parent 721d16d commit 7b652ce

File tree

3 files changed

+20
-11
lines changed

3 files changed

+20
-11
lines changed

probe-plotter-tools/src/bin/custom-viewer.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ use std::{env, io::Read, sync::mpsc, thread, time::Duration};
66

77
#[tokio::main]
88
async fn main() -> Result<(), Box<dyn std::error::Error>> {
9-
let help = "Usage: \nprobe-plotter /path/to/elf [chip] [update_rate_ms=10] [channel_mode=no change]";
9+
let help =
10+
"Usage: \nprobe-plotter /path/to/elf [chip] [update_rate_ms=10] [channel_mode=no change]";
1011

1112
let elf_path = env::args().nth(1).expect(help);
1213

@@ -39,7 +40,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
3940
.read_to_end(&mut elf_bytes)
4041
.unwrap();
4142

42-
let (metrics, settings) = parse(&elf_bytes);
43+
let (metrics, settings, scan_region) = parse(&elf_bytes);
4344

4445
let main_thread_token = rerun::MainThreadToken::i_promise_i_am_on_the_main_thread();
4546

@@ -78,6 +79,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
7879
&elf_bytes,
7980
settings,
8081
metrics,
82+
scan_region,
8183
settings_update_receiver,
8284
initial_settings_sender,
8385
)

probe-plotter-tools/src/bin/minimal.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ fn main() {
1616
let mut session = probe_rs::Session::auto_attach(target, Default::default()).unwrap();
1717
let mut core = session.core(0).unwrap();
1818

19-
let (mut metrics, _settings) = parse_elf_file(&elf_path);
19+
let (mut metrics, _settings, _) = parse_elf_file(&elf_path);
2020
for m in &metrics {
2121
println!("{}: {}", m.name, m.address);
2222
}

probe-plotter-tools/src/lib.rs

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use defmt_parser::Level;
1010
use object::{Object, ObjectSymbol};
1111
use probe_rs::{
1212
Core, MemoryInterface,
13-
rtt::{ChannelMode, Rtt},
13+
rtt::{self, ChannelMode, Rtt},
1414
};
1515
use rerun::TextLogLevel;
1616
use serde::Deserialize;
@@ -47,17 +47,24 @@ pub enum Type {
4747
}
4848

4949
// Most of this is taken from https://github.com/knurling-rs/defmt/blob/8e517f8d7224237893e39337a61de8ef98b341f2/decoder/src/elf2table/mod.rs and modified
50-
pub fn parse(elf_bytes: &[u8]) -> (Vec<Metric>, Vec<Setting>) {
50+
pub fn parse(elf_bytes: &[u8]) -> (Vec<Metric>, Vec<Setting>, rtt::ScanRegion) {
5151
let elf = object::File::parse(elf_bytes).unwrap();
5252

5353
let mut metrics = Vec::new();
5454
let mut settings = Vec::new();
5555

56+
let mut scan_region = rtt::ScanRegion::Ram;
57+
5658
for entry in elf.symbols() {
5759
let Ok(name) = entry.name() else {
5860
continue;
5961
};
6062

63+
if name == "_SEGGER_RTT" {
64+
scan_region = rtt::ScanRegion::Exact(entry.address());
65+
continue;
66+
}
67+
6168
let Ok(sym) = Symbol::demangle(name) else {
6269
continue;
6370
};
@@ -98,20 +105,18 @@ pub fn parse(elf_bytes: &[u8]) -> (Vec<Metric>, Vec<Setting>) {
98105
}
99106
}
100107

101-
(metrics, settings)
108+
(metrics, settings, scan_region)
102109
}
103110

104111
/// Parse elf file into a set of Metrics and Settings
105-
pub fn parse_elf_file(elf_path: &str) -> (Vec<Metric>, Vec<Setting>) {
112+
pub fn parse_elf_file(elf_path: &str) -> (Vec<Metric>, Vec<Setting>, rtt::ScanRegion) {
106113
let mut buffer = Vec::new();
107114
std::fs::File::open(elf_path)
108115
.unwrap()
109116
.read_to_end(&mut buffer)
110117
.unwrap();
111118

112-
let (metrics, settings) = parse(&buffer);
113-
114-
(metrics, settings)
119+
parse(&buffer)
115120
}
116121

117122
/// A background task which communicates with the probe
@@ -129,13 +134,15 @@ pub fn probe_background_thread(
129134
elf_bytes: &[u8],
130135
mut settings: Vec<Setting>,
131136
mut metrics: Vec<Metric>,
137+
scan_region: rtt::ScanRegion,
132138
settings_update_receiver: mpsc::Receiver<Setting>,
133139
initial_settings_sender: mpsc::Sender<Vec<Setting>>,
134140
) {
135141
let mut session = probe_rs::Session::auto_attach(target, Default::default()).unwrap();
136142
let mut core = session.core(0).unwrap();
137-
let mut rtt = Rtt::attach(&mut core).unwrap();
143+
let mut rtt = Rtt::attach_region(&mut core, &scan_region).unwrap();
138144
let table = defmt_decoder::Table::parse(elf_bytes).unwrap().unwrap();
145+
//let x = object::S
139146

140147
// TODO: Get this to work
141148
// This produces ascii escape codes which egui/rerun does not seem to understand

0 commit comments

Comments
 (0)