1个不稳定版本
0.1.0 | 2024年2月27日 |
---|
#1511 在 嵌入式开发
17KB
138 行
rust-ramlink
基于RAM的,生产者-消费者,使用环形缓冲区的单向通信
这个无std crate提供了一种方法,通过共享RAM内存从生产者(例如微控制器)向消费者(例如调试主机)传输信息。通常,可以使用调试接口(JTAG,UPDI等)读取微控制器的RAM。
这样,可以在不依赖额外UART的情况下通过调试接口传输信息。
示例
生产者(AVR,PIC,微控制器,...)
将此crate添加到您的项目中,不要忘记启用producer
特性 cargo add ramlink -F producer
然后创建一个大小为5的环形缓冲区:为了安全地访问它,我们将它包装在一个Mutex和一个RefCell中
use avr_device::interrupt::{self, Mutex};
use core::cell::{Cell, RefCell};
use ramlink::producer::RB;
static RING_BUF: Mutex<RefCell<RB<5>>> = Mutex::new(RefCell::new(RB::<5>::new()));
然后您可以将数据发送到您的消费者
interrupt::free(|cs| {
RING_BUF
.borrow(cs)
.borrow_mut()
.send_bytes_blocking(&[temperature, current]);
});
消费者(具有JTAG/UPDI/…接口的笔记本电脑)
将此crate添加到您的项目中,不要忘记启用consumer
特性 cargo add ramlink -F consumer
实现您特定设备的特性
struct mk2<'a> {
dev: JtagIceMkii<'a>,
}
impl<'a> ramlink::consumer::MemoryReader for mk2<'a> {
fn read_memory(&mut self, address: usize, buffer: &mut [u8]) -> Result<(), String> {
for i in 0..buffer.len() {
let byte = self.dev.read_ram_byte((address + i) as u16).unwrap();
buffer[i] = byte;
}
Ok(())
}
fn write_memory(&mut self, address: usize, value: u8) -> Result<(), String> {
self.dev.write_ram_byte(address as u16, value);
Ok(())
}
}
初始化它。在这个示例中,生产者设备是AVR Attiny402,RB结构存储在地址 0x3f0e
let mm = mk2 { dev: dgr };
let mut rb = ramlink::consumer::ProducerDevice::new(Box::new(mm), 0x3f0e).unwrap();
并开始读取
while true {
let r = rb.read_bytes();
if r.len() > 0 {
println!("I READ {:02x?}", r);
}
}
贡献
鉴于我是一个Rust新手,请不要犹豫,提出问题或提出合并请求以使此代码更好并使我改进 :-)。建议欢迎!