Maintain size assumptions held by openocd (and probably JLink tools)
* Buffer sizes are not prescribed exactly in Segger's implementation, but reference is made to "int" being 32 bits. * 24 bytes size assumption is hardcoded in openocd RTT implementation.
This commit is contained in:
parent
963a1a2bbf
commit
2a8dc7eb33
|
@ -38,6 +38,7 @@ register = "0.3.2"
|
|||
cortex-a = "2.4"
|
||||
#embedded-serial = "0.5.0"
|
||||
# jlink_rtt = { version = "0.1.0", optional = true }
|
||||
static_assertions = { version = "0.3.1", features = ["nightly"] }
|
||||
|
||||
[profile.dev]
|
||||
panic = "abort" # @todo try panic_rtt when feature jlink
|
||||
|
|
|
@ -15,7 +15,9 @@
|
|||
/// The cost of logging data to RTT is the cost of formatting
|
||||
/// and writing it to the ring buffer in memory.
|
||||
use core::fmt;
|
||||
use core::mem::size_of;
|
||||
use core::ptr;
|
||||
use static_assertions::const_assert_eq;
|
||||
|
||||
static mut UP_BUF: [u8; 1024] = [0u8; 1024];
|
||||
static mut DOWN_BUF: [u8; 16] = [0u8; 16];
|
||||
|
@ -25,8 +27,8 @@ static mut DOWN_BUF: [u8; 16] = [0u8; 16];
|
|||
/// in the JLINK device.
|
||||
#[repr(C)]
|
||||
struct Buffer {
|
||||
name: *const u8,
|
||||
buf_start: *mut u8,
|
||||
name: u32, //*const u8,
|
||||
buf_start: u32, // *mut u8,
|
||||
size_of_buffer: u32,
|
||||
/// Position of next item to be written
|
||||
/// Volatile as the host may change it.
|
||||
|
@ -35,15 +37,17 @@ struct Buffer {
|
|||
/// Volatile as the host may change it.
|
||||
read_offset: u32,
|
||||
/// In the segger library these flags control blocking
|
||||
/// or non-blocking behavior. Those functions are
|
||||
/// implemented differently here.
|
||||
/// or non-blocking behavior.
|
||||
flags: u32,
|
||||
}
|
||||
|
||||
// Assumed by OpenOCD and probably JLink too...
|
||||
const_assert_eq!(size_of::<Buffer>(), 24);
|
||||
|
||||
impl Buffer {
|
||||
fn init(&mut self, buf: &mut [u8]) {
|
||||
self.name = b"Terminal\0".as_ptr();
|
||||
self.buf_start = buf.as_mut_ptr();
|
||||
self.name = b"Terminal\0".as_ptr() as u32;
|
||||
self.buf_start = buf.as_mut_ptr() as u32;
|
||||
self.size_of_buffer = buf.len() as u32;
|
||||
self.write_offset = 0;
|
||||
self.read_offset = 0;
|
||||
|
@ -104,7 +108,7 @@ impl Buffer {
|
|||
unsafe {
|
||||
ptr::copy(
|
||||
buf.as_ptr(),
|
||||
self.buf_start.offset(write_off as isize),
|
||||
(self.buf_start as *mut u8).offset(write_off as isize),
|
||||
to_copy,
|
||||
);
|
||||
}
|
||||
|
@ -142,6 +146,8 @@ pub struct ControlBlock {
|
|||
down: Buffer,
|
||||
}
|
||||
|
||||
const_assert_eq!(size_of::<ControlBlock>(), 24 + 24 + 24);
|
||||
|
||||
unsafe impl Sync for ControlBlock {}
|
||||
|
||||
impl ControlBlock {
|
||||
|
@ -172,16 +178,16 @@ pub static mut _SEGGER_RTT: ControlBlock = ControlBlock {
|
|||
max_up_buffers: 1,
|
||||
max_down_buffers: 1,
|
||||
up: Buffer {
|
||||
name: 0 as *const u8,
|
||||
buf_start: 0 as *mut u8,
|
||||
name: 0,
|
||||
buf_start: 0,
|
||||
read_offset: 0,
|
||||
write_offset: 0,
|
||||
flags: 0,
|
||||
size_of_buffer: 0,
|
||||
},
|
||||
down: Buffer {
|
||||
name: 0 as *const u8,
|
||||
buf_start: 0 as *mut u8,
|
||||
name: 0,
|
||||
buf_start: 0,
|
||||
write_offset: 0,
|
||||
read_offset: 0,
|
||||
flags: 0,
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
#![feature(core_intrinsics)]
|
||||
#![feature(range_contains)]
|
||||
#![feature(try_from)]
|
||||
#![feature(underscore_const_names)]
|
||||
#![doc(html_root_url = "https://docs.metta.systems/")]
|
||||
#![allow(dead_code)]
|
||||
#![allow(unused_assignments)]
|
||||
|
|
Loading…
Reference in New Issue