при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Код: Выделить всё
X&=0x1F; // обрезка старших битов - в них у меня теперь другая информация хранится
Y=(X&0x03)+4;
X>>=2;
Y<<=X;Код: Выделить всё
#define A 4
Y=X&(~((-1)<<(A)));
X>>=A;
if (X>0) // этот приём позволяет хранить числа от 0.
{
Y+=(1<<(A+1));
X--;
};
Y<<=X;Код: Выделить всё
lazy_static! {
pub static ref PERIPHERALS: Arc<Mutex<Peripherals>> =
Arc::new(Mutex::new(Peripherals::take().unwrap()));
Код: Выделить всё
use crate::PERIPHERALS;
...
let peripherals = PERIPHERALS.clone();
let mut peripherals = peripherals.lock();
...
Код: Выделить всё
lazy_static! {
pub static ref GPIO10_MUTEX: Arc<Mutex<PinDriver<'static, Gpio10, Output>>> = {
let peripherals = PERIPHERALS.clone();
let mut peripherals = peripherals.lock();
let pin_gpio10 =
PinDriver::output(unsafe { peripherals.pins.gpio10.clone_unchecked() }).unwrap();
Arc::new(Mutex::new(pin_gpio10))
};
}
Код: Выделить всё
use crate::GPIO10_MUTEX;
...
let power_relay = GPIO10_MUTEX.clone();
let mut power_relay = power_relay.lock();
power_relay.set_high().unwrap();
...
Код: Выделить всё
use std::cmp::{max, min};
pub fn median3(a: u16, b: u16, c: u16) -> u16 {
max(min(a, b), min(c, max(a, b)))
}
pub fn median5(v: [u16; 5]) -> u16 {
median3(
v[4],
max(min(v[0], v[1]), min(v[2], v[3])),
min(max(v[0], v[1]), max(v[2], v[3])),
)
}
Код: Выделить всё
use std::cmp::{max, min};
pub fn median3(a: u16, b: u16, c: u16) -> u16 {
max(min(a, b), min(c, max(a, b)))
}
pub fn median5(v: [u16; 5]) -> u16 {
median3(
v[4],
max(min(v[0], v[1]), min(v[2], v[3])),
min(max(v[0], v[1]), max(v[2], v[3])),
)
}
Код: Выделить всё
Просто так сделать Arc<Mutex<>> проблематично, так как его ведь надо инициализировать.
Проблема легко решается макросом lazy_static!