Skip to content

Commit 6067c08

Browse files
author
Johannes Cornelis Draaijer
committed
Fix rtic-echo example
1 parent 030f97b commit 6067c08

File tree

2 files changed

+39
-26
lines changed

2 files changed

+39
-26
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ example-nucleo-pins = [ ]
7171
rtic-echo-example = [ "defmt", "smoltcp-phy", "smoltcp/defmt", "smoltcp/medium-ethernet", "smoltcp/socket-tcp" ]
7272

7373
[dev-dependencies]
74-
cortex-m = "0.7"
74+
cortex-m = { version = "0.7", features = [ "critical-section-single-core" ] }
7575
cortex-m-rt = "0.7"
7676
fugit = "0.3"
7777
cortex-m-rtic = "1.0"

examples/rtic-echo.rs

Lines changed: 38 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use defmt_rtt as _;
1111
use panic_probe as _;
1212

1313
use smoltcp::{
14-
iface::{self, SocketStorage},
14+
iface::{self},
1515
wire::{self, IpAddress, Ipv4Address},
1616
};
1717

@@ -27,21 +27,25 @@ mod app {
2727

2828
use systick_monotonic::Systick;
2929

30+
use core::mem::MaybeUninit;
31+
3032
use stm32_eth::{EthernetDMA, RxRingEntry, TxRingEntry};
3133

3234
use smoltcp::{
33-
iface::{self, Interface, SocketHandle},
34-
socket::TcpSocket,
35-
socket::{TcpSocketBuffer, TcpState},
35+
iface::{self, Interface, SocketHandle, SocketSet, SocketStorage},
36+
socket::tcp::Socket as TcpSocket,
37+
socket::tcp::{SocketBuffer as TcpSocketBuffer, State as TcpState},
3638
wire::EthernetAddress,
3739
};
3840

3941
use crate::NetworkStorage;
4042

4143
#[local]
4244
struct Local {
43-
interface: Interface<'static, &'static mut EthernetDMA<'static, 'static>>,
45+
interface: Interface<'static>,
4446
tcp_handle: SocketHandle,
47+
sockets: SocketSet<'static>,
48+
dma: EthernetDMA<'static, 'static>,
4549
}
4650

4751
#[shared]
@@ -58,8 +62,8 @@ mod app {
5862
#[init(local = [
5963
rx_ring: [RxRingEntry; 2] = [RxRingEntry::new(),RxRingEntry::new()],
6064
tx_ring: [TxRingEntry; 2] = [TxRingEntry::new(),TxRingEntry::new()],
61-
storage: NetworkStorage = NetworkStorage::new(),
62-
dma: core::mem::MaybeUninit<EthernetDMA<'static, 'static>> = core::mem::MaybeUninit::uninit(),
65+
socket_storage: [SocketStorage<'static>; 4] = [SocketStorage::EMPTY, SocketStorage::EMPTY, SocketStorage::EMPTY, SocketStorage::EMPTY],
66+
storage_store: MaybeUninit<NetworkStorage> = MaybeUninit::uninit(),
6367
])]
6468
fn init(cx: init::Context) -> (Shared, Local, init::Monotonics) {
6569
defmt::info!("Pre-init");
@@ -72,12 +76,15 @@ mod app {
7276
let (clocks, gpio, ethernet) = crate::common::setup_peripherals(p);
7377
let mono = Systick::new(core.SYST, clocks.hclk().raw());
7478

79+
let sockets = cx.local.socket_storage;
80+
let mut sockets = SocketSet::new(&mut sockets[..]);
81+
7582
defmt::info!("Setting up pins");
7683
let (pins, mdio, mdc) = crate::common::setup_pins(gpio);
7784

7885
defmt::info!("Configuring ethernet");
7986

80-
let (dma, mac) = stm32_eth::new_with_mii(
87+
let (mut dma, mac) = stm32_eth::new_with_mii(
8188
ethernet.mac,
8289
ethernet.mmc,
8390
ethernet.dma,
@@ -92,13 +99,11 @@ mod app {
9299
)
93100
.unwrap();
94101

95-
let dma = cx.local.dma.write(dma);
96-
97102
defmt::info!("Enabling interrupts");
98103
dma.enable_interrupt();
99104

100105
defmt::info!("Setting up smoltcp");
101-
let store = cx.local.storage;
106+
let store = cx.local.storage_store.write(NetworkStorage::new());
102107

103108
let mut routes = smoltcp::iface::Routes::new(&mut store.routes_cache[..]);
104109
routes
@@ -112,19 +117,21 @@ mod app {
112117

113118
let socket = TcpSocket::new(rx_buffer, tx_buffer);
114119

115-
let mut interface = iface::InterfaceBuilder::new(dma, &mut store.sockets[..])
120+
let mut interface = iface::InterfaceBuilder::new()
116121
.hardware_addr(EthernetAddress::from_bytes(&crate::MAC).into())
117122
.neighbor_cache(neighbor_cache)
118123
.ip_addrs(&mut store.ip_addrs[..])
119124
.routes(routes)
120-
.finalize();
125+
.finalize(&mut &mut dma);
121126

122-
let tcp_handle = interface.add_socket(socket);
127+
let tcp_handle = sockets.add(socket);
123128

124-
let socket = interface.get_socket::<TcpSocket>(tcp_handle);
129+
let socket = sockets.get_mut::<TcpSocket>(tcp_handle);
125130
socket.listen(crate::ADDRESS).ok();
126131

127-
interface.poll(now_fn()).unwrap();
132+
interface
133+
.poll(now_fn(), &mut &mut dma, &mut sockets)
134+
.unwrap();
128135

129136
if let Ok(mut phy) = EthernetPhy::from_miim(mac, 0) {
130137
defmt::info!(
@@ -144,21 +151,29 @@ mod app {
144151
Local {
145152
interface,
146153
tcp_handle,
154+
sockets,
155+
dma,
147156
},
148157
init::Monotonics(mono),
149158
)
150159
}
151160

152-
#[task(binds = ETH, local = [interface, tcp_handle, data: [u8; 512] = [0u8; 512]], priority = 2)]
161+
#[task(binds = ETH, local = [interface, tcp_handle, sockets, dma, data: [u8; 512] = [0u8; 512]], priority = 2)]
153162
fn eth_interrupt(cx: eth_interrupt::Context) {
154-
let (iface, tcp_handle, buffer) = (cx.local.interface, cx.local.tcp_handle, cx.local.data);
155-
156-
let interrupt_reason = iface.device_mut().interrupt_handler();
163+
let (iface, tcp_handle, buffer, sockets, mut dma) = (
164+
cx.local.interface,
165+
cx.local.tcp_handle,
166+
cx.local.data,
167+
cx.local.sockets,
168+
cx.local.dma,
169+
);
170+
171+
let interrupt_reason = dma.interrupt_handler();
157172
defmt::debug!("Got an ethernet interrupt! Reason: {}", interrupt_reason);
158173

159-
iface.poll(now_fn()).ok();
174+
iface.poll(now_fn(), &mut dma, sockets).ok();
160175

161-
let socket = iface.get_socket::<TcpSocket>(*tcp_handle);
176+
let socket = sockets.get_mut::<TcpSocket>(*tcp_handle);
162177
if let Ok(recv_bytes) = socket.recv_slice(buffer) {
163178
if recv_bytes > 0 {
164179
socket.send_slice(&buffer[..recv_bytes]).ok();
@@ -172,14 +187,13 @@ mod app {
172187
defmt::warn!("Disconnected... Reopening listening socket.");
173188
}
174189

175-
iface.poll(now_fn()).ok();
190+
iface.poll(now_fn(), &mut dma, sockets).ok();
176191
}
177192
}
178193

179194
/// All storage required for networking
180195
pub struct NetworkStorage {
181196
pub ip_addrs: [wire::IpCidr; 1],
182-
pub sockets: [iface::SocketStorage<'static>; 1],
183197
pub tcp_socket_storage: TcpSocketStorage,
184198
pub neighbor_cache: [Option<(wire::IpAddress, iface::Neighbor)>; 8],
185199
pub routes_cache: [Option<(wire::IpCidr, iface::Route)>; 8],
@@ -194,7 +208,6 @@ impl NetworkStorage {
194208
ip_addrs: [Self::IP_INIT],
195209
neighbor_cache: [None; 8],
196210
routes_cache: [None; 8],
197-
sockets: [SocketStorage::EMPTY; 1],
198211
tcp_socket_storage: TcpSocketStorage::new(),
199212
}
200213
}

0 commit comments

Comments
 (0)