Skip to content
Snippets Groups Projects
Commit b8016459 authored by Benjamin Koch's avatar Benjamin Koch
Browse files

use StaticCell to avoid unsafe

parent 16ab2497
No related branches found
No related tags found
No related merge requests found
...@@ -6,6 +6,7 @@ use core::sync::atomic::*; ...@@ -6,6 +6,7 @@ use core::sync::atomic::*;
use defmt::*; use defmt::*;
use embassy_executor::Spawner; use embassy_executor::Spawner;
use embassy_executor::_export::StaticCell;
//use embassy_futures::join::join; //use embassy_futures::join::join;
//use embassy_futures::select::*; //use embassy_futures::select::*;
use embassy_rp::adc::{self, Adc}; use embassy_rp::adc::{self, Adc};
...@@ -30,6 +31,15 @@ use heizung::rs485::RS485; ...@@ -30,6 +31,15 @@ use heizung::rs485::RS485;
use heizung::uf2updater::UF2UpdateHandler; use heizung::uf2updater::UF2UpdateHandler;
use heizung::watchdog::WatchdogFixed; use heizung::watchdog::WatchdogFixed;
macro_rules! singleton {
($val:expr) => {{
type T = impl Sized;
static STATIC_CELL: StaticCell<T> = StaticCell::new();
let (x,) = STATIC_CELL.init(($val,));
x
}};
}
#[embassy_executor::task] #[embassy_executor::task]
async fn i2c_task(mut i2c_peri: embassy_rp::peripherals::I2C0, async fn i2c_task(mut i2c_peri: embassy_rp::peripherals::I2C0,
mut scl: embassy_rp::peripherals::PIN_13, mut sda: embassy_rp::peripherals::PIN_12, mut scl: embassy_rp::peripherals::PIN_13, mut sda: embassy_rp::peripherals::PIN_12,
...@@ -646,12 +656,10 @@ async fn main2(spawner: Spawner) { ...@@ -646,12 +656,10 @@ async fn main2(spawner: Spawner) {
static OUTPUTS_ACTIVE: AtomicU8 = AtomicU8::new(0); static OUTPUTS_ACTIVE: AtomicU8 = AtomicU8::new(0);
unwrap!(spawner.spawn(adc_task(&ADC_DATA, p.ADC, en_measure_current, analog_in1, current2, current1, measure_vcc, &OUTPUTS_ACTIVE))); unwrap!(spawner.spawn(adc_task(&ADC_DATA, p.ADC, en_measure_current, analog_in1, current2, current1, measure_vcc, &OUTPUTS_ACTIVE)));
static mut RX_BUFFER: [u8; 256] = [0; 256]; let rx_buf = singleton!([0u8; 256]);
//SAFETY: We only borrow it once because this function will only be called once.
let rx_buffer_ref = unsafe { &mut RX_BUFFER };
let rs485 = RS485::new( let rs485 = RS485::new(
p.UART0, rx, tx, tx_en, interrupt::take!(UART0_IRQ), p.UART0, rx, tx, tx_en, interrupt::take!(UART0_IRQ),
p.DMA_CH1, default_modbus_config(), rx_buffer_ref, p.DMA_CH1, default_modbus_config(), rx_buf,
p.PIO0, p.DMA_CH0, p.DMA_CH2, p.PIO0, p.DMA_CH0, p.DMA_CH2,
ModbusServer::new(ModBusRegs { ModbusServer::new(ModBusRegs {
led_g, led_g,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment