#ring-buffer #communication #micro-controller #uart #shared-memory

nightly ramlink

基于RAM的,生产者-消费者,单向通信,用于微控制器,使用环形缓冲区

1个不稳定版本

0.1.0 2024年2月27日

#1511嵌入式开发

MIT/Apache

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新手,请不要犹豫,提出问题或提出合并请求以使此代码更好并使我改进 :-)。建议欢迎!

依赖项