Refactor
This commit is contained in:
parent
d88a5aeb14
commit
56c68af52e
19
Cargo.lock
generated
19
Cargo.lock
generated
|
@ -70,7 +70,6 @@ checksum = "8ec610d8f49840a5b376c69663b6369e71f4b34484b9b2eb29fb918d92516cb9"
|
|||
dependencies = [
|
||||
"bare-metal 0.2.5",
|
||||
"bitfield",
|
||||
"critical-section",
|
||||
"embedded-hal",
|
||||
"volatile-register",
|
||||
]
|
||||
|
@ -138,16 +137,6 @@ version = "1.1.2"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7059fff8937831a9ae6f0fe4d658ffabf58f2ca96aa9dec1c889f936f705f216"
|
||||
|
||||
[[package]]
|
||||
name = "embedded-alloc"
|
||||
version = "0.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8931e47e33c5d3194fbcf9cc82df0919193bd2fa40008f388eb1d28fd9c9ea6b"
|
||||
dependencies = [
|
||||
"critical-section",
|
||||
"linked_list_allocator",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "embedded-dma"
|
||||
version = "0.2.0"
|
||||
|
@ -225,11 +214,9 @@ name = "hello-can-stm32"
|
|||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"bxcan",
|
||||
"cortex-m",
|
||||
"cortex-m-rt",
|
||||
"cortex-m-rtic",
|
||||
"cortex-m-semihosting",
|
||||
"embedded-alloc",
|
||||
"embedded-hal",
|
||||
"heapless",
|
||||
"nb 1.1.0",
|
||||
|
@ -248,12 +235,6 @@ dependencies = [
|
|||
"hashbrown",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "linked_list_allocator"
|
||||
version = "0.10.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9afa463f5405ee81cdb9cc2baf37e08ec7e4c8209442b5d72c04cfb2cd6e6286"
|
||||
|
||||
[[package]]
|
||||
name = "lock_api"
|
||||
version = "0.4.10"
|
||||
|
|
18
Cargo.toml
18
Cargo.toml
|
@ -6,18 +6,16 @@ edition = "2021"
|
|||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
embedded-hal = "0.2.7"
|
||||
cortex-m = { version = "0.7.7", features = ["critical-section-single-core"] }
|
||||
cortex-m-rtic = "1.1.3"
|
||||
panic-halt = "0.2.0"
|
||||
cortex-m-semihosting = { version = "0.5.0" }
|
||||
stm32f1xx-hal = { version = "0.10.0", features = ["rt", "stm32f103"] }
|
||||
shared-bus-rtic = "0.2.2"
|
||||
embedded-alloc = "0.5.0"
|
||||
nb = "1.1.0"
|
||||
cortex-m-rt = "0.7.3"
|
||||
bxcan = "0.7.0"
|
||||
cortex-m-rt = "0.7.3"
|
||||
cortex-m-rtic = "1.1.3"
|
||||
cortex-m-semihosting = { version = "0.5.0" }
|
||||
embedded-hal = "0.2.7"
|
||||
heapless = "0.7.16"
|
||||
nb = "1.1.0"
|
||||
panic-halt = "0.2.0"
|
||||
shared-bus-rtic = "0.2.2"
|
||||
stm32f1xx-hal = { version = "0.10.0", features = ["rt", "stm32f103"] }
|
||||
|
||||
[features]
|
||||
default = []
|
||||
|
|
99
src/main.rs
99
src/main.rs
|
@ -1,24 +1,16 @@
|
|||
#![no_std]
|
||||
#![no_main]
|
||||
|
||||
use embedded_alloc::Heap;
|
||||
use panic_halt as _;
|
||||
|
||||
#[global_allocator]
|
||||
static HEAP: Heap = Heap::empty();
|
||||
use core::cmp::Ordering;
|
||||
|
||||
use bxcan::Frame;
|
||||
use core::cmp::Ordering;
|
||||
use heapless::binary_heap::{BinaryHeap, Max};
|
||||
|
||||
use panic_halt as _;
|
||||
use stm32f1xx_hal::pac::Interrupt;
|
||||
extern crate alloc;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct PriorityFrame(Frame);
|
||||
|
||||
/// Ordering is based on the Identifier and frame type (data vs. remote) and can be used to sort
|
||||
/// frames by priority.
|
||||
impl Ord for PriorityFrame {
|
||||
fn cmp(&self, other: &Self) -> Ordering {
|
||||
self.0.priority().cmp(&other.0.priority())
|
||||
|
@ -46,7 +38,6 @@ fn enqueue_frame(queue: &mut BinaryHeap<PriorityFrame, Max, 16>, frame: Frame) {
|
|||
|
||||
#[rtic::app(device = stm32f1xx_hal::pac)]
|
||||
mod app {
|
||||
use cortex_m_semihosting::hprintln;
|
||||
use heapless::binary_heap::{BinaryHeap, Max};
|
||||
|
||||
use super::{enqueue_frame, PriorityFrame};
|
||||
|
@ -72,7 +63,6 @@ mod app {
|
|||
can_rx: Rx0<Can<CAN1>>,
|
||||
led: Pin<'C', 13, Output>,
|
||||
delay: Delay<TIM2, 1000000>,
|
||||
counter: usize,
|
||||
}
|
||||
|
||||
#[init]
|
||||
|
@ -80,8 +70,6 @@ mod app {
|
|||
let mut flash = ctx.device.FLASH.constrain();
|
||||
let rcc = ctx.device.RCC.constrain();
|
||||
|
||||
// let clocks = rcc.cfgr.freeze(&mut flash.acr);
|
||||
|
||||
let clocks = rcc
|
||||
.cfgr
|
||||
.use_hse(8.MHz())
|
||||
|
@ -107,7 +95,6 @@ mod app {
|
|||
can.modify_filters()
|
||||
.enable_bank(0, Fifo::Fifo0, Mask32::accept_all());
|
||||
|
||||
// Sync to the bus and start normal operation.
|
||||
can.enable_interrupts(
|
||||
Interrupts::TRANSMIT_MAILBOX_EMPTY | Interrupts::FIFO0_MESSAGE_PENDING,
|
||||
);
|
||||
|
@ -133,7 +120,6 @@ mod app {
|
|||
can_rx,
|
||||
led,
|
||||
delay,
|
||||
counter: 0,
|
||||
},
|
||||
init::Monotonics(),
|
||||
)
|
||||
|
@ -145,75 +131,21 @@ mod app {
|
|||
}
|
||||
|
||||
#[idle(shared = [can_tx_queue, tx_count], local = [delay])]
|
||||
fn idle(mut cx: idle::Context) -> ! {
|
||||
fn idle(cx: idle::Context) -> ! {
|
||||
let mut tx_queue = cx.shared.can_tx_queue;
|
||||
|
||||
loop {
|
||||
for speed in 0..=30 {
|
||||
tx_queue.lock(|mut tx_queue| {
|
||||
enqueue_frame(
|
||||
&mut tx_queue,
|
||||
Frame::new_data(StandardId::new(0x1FF).unwrap(), speed2array(speed * 1000)),
|
||||
);
|
||||
});
|
||||
|
||||
cx.local.delay.delay(100.millis());
|
||||
}
|
||||
|
||||
for _ in 0..10 {
|
||||
tx_queue.lock(|mut tx_queue| {
|
||||
enqueue_frame(
|
||||
&mut tx_queue,
|
||||
Frame::new_data(StandardId::new(0x1FF).unwrap(), speed2array(30000)),
|
||||
);
|
||||
});
|
||||
|
||||
cx.local.delay.delay(100.millis());
|
||||
}
|
||||
|
||||
for speed in 0..=30 {
|
||||
for sign in [1, -1] {
|
||||
for speed in (0..=30)
|
||||
.chain((0..10).map(|_| 30))
|
||||
.chain((0..=30).map(|i| 30 - i))
|
||||
{
|
||||
tx_queue.lock(|mut tx_queue| {
|
||||
enqueue_frame(
|
||||
&mut tx_queue,
|
||||
Frame::new_data(
|
||||
StandardId::new(0x1FF).unwrap(),
|
||||
speed2array(30000 - (speed * 1000)),
|
||||
),
|
||||
);
|
||||
});
|
||||
|
||||
cx.local.delay.delay(100.millis());
|
||||
}
|
||||
|
||||
for speed in 0..=30 {
|
||||
tx_queue.lock(|mut tx_queue| {
|
||||
enqueue_frame(
|
||||
&mut tx_queue,
|
||||
Frame::new_data(StandardId::new(0x1FF).unwrap(), speed2array(speed * 1000 * -1)),
|
||||
);
|
||||
});
|
||||
|
||||
cx.local.delay.delay(100.millis());
|
||||
}
|
||||
|
||||
for _ in 0..10 {
|
||||
tx_queue.lock(|mut tx_queue| {
|
||||
enqueue_frame(
|
||||
&mut tx_queue,
|
||||
Frame::new_data(StandardId::new(0x1FF).unwrap(), speed2array(30000 * -1)),
|
||||
);
|
||||
});
|
||||
|
||||
cx.local.delay.delay(100.millis());
|
||||
}
|
||||
|
||||
for speed in 0..=30 {
|
||||
tx_queue.lock(|mut tx_queue| {
|
||||
enqueue_frame(
|
||||
&mut tx_queue,
|
||||
Frame::new_data(
|
||||
StandardId::new(0x1FF).unwrap(),
|
||||
speed2array(( 30000 - (speed * 1000) ) * -1),
|
||||
speed2array(speed * 1000 * sign),
|
||||
),
|
||||
);
|
||||
});
|
||||
|
@ -222,8 +154,8 @@ mod app {
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// This ISR is triggered by each finished frame transmission.
|
||||
#[task(binds = USB_HP_CAN_TX, local = [can_tx, led], shared = [can_tx_queue, tx_count])]
|
||||
fn can_tx(cx: can_tx::Context) {
|
||||
let tx = cx.local.can_tx;
|
||||
|
@ -232,8 +164,6 @@ mod app {
|
|||
|
||||
tx.clear_interrupt_flags();
|
||||
|
||||
// There is now a free mailbox. Try to transmit pending frames until either
|
||||
// the queue is empty or transmission would block the execution of this ISR.
|
||||
(&mut tx_queue, &mut tx_count).lock(|tx_queue, tx_count| {
|
||||
while let Some(frame) = tx_queue.peek() {
|
||||
match tx.transmit(&frame.0) {
|
||||
|
@ -256,15 +186,14 @@ mod app {
|
|||
}
|
||||
|
||||
#[task(binds = USB_LP_CAN_RX0, local = [can_rx], shared = [can_tx_queue])]
|
||||
fn can_rx0(mut cx: can_rx0::Context) {
|
||||
// Echo back received packages with correct priority ordering.
|
||||
fn can_rx0(cx: can_rx0::Context) {
|
||||
loop {
|
||||
match cx.local.can_rx.receive() {
|
||||
Ok(frame) => {
|
||||
// let data = frame.data().unwrap();
|
||||
Ok(_frame) => {
|
||||
// ここがデータきたときのあれ。
|
||||
}
|
||||
Err(nb::Error::WouldBlock) => break,
|
||||
Err(nb::Error::Other(_)) => {} // Ignore overrun errors.
|
||||
Err(nb::Error::Other(_)) => {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user