-
Notifications
You must be signed in to change notification settings - Fork 246
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Multicore support for ESP32 and ESP32S3 #46
Comments
Duplicate of #28 |
This is not a duplicate of the mentioned issue - starting to work in this |
@jessebraham @MabezDev I started to work on this and was wondering if I should spawn the code on app-cpu in the same way ESP32-HAL did, or if I should try to use a closure .... seems to work but unsure if I like it so here is how the new example looks like now #![no_std]
#![no_main]
use core::sync::atomic::{AtomicI32, Ordering};
use esp32_hal::{clock::ClockControl, pac::{Peripherals, TIMG1}, prelude::*, CpuControl, RtcCntl, Timer};
use esp_println::println;
use nb::block;
use panic_halt as _;
use xtensa_lx::mutex::Mutex;
use xtensa_lx_rt::entry;
#[entry]
fn main() -> ! {
let peripherals = Peripherals::take().unwrap();
let system = peripherals.DPORT.split();
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let mut timer0 = Timer::new(peripherals.TIMG0, clocks.apb_clock);
let mut timer1 = Timer::new(peripherals.TIMG1, clocks.apb_clock);
let mut rtc_cntl = RtcCntl::new(peripherals.RTC_CNTL);
// Disable MWDT and RWDT (Watchdog) flash boot protection
timer0.disable();
timer1.disable();
rtc_cntl.set_wdt_global_enable(false);
timer0.start(1u64.secs());
timer1.start(500u64.millis());
let counter = xtensa_lx::mutex::SpinLockMutex::new(AtomicI32::new(0));
let mut cpu_control = CpuControl {};
let mut cpu1_fnctn = || { cpu1_start(&mut timer1, &counter); };
let _guard = cpu_control.start_app_core(&mut cpu1_fnctn).unwrap();
loop {
block!(timer0.wait()).unwrap();
let count = (&counter).lock(|counter| counter.load(Ordering::Relaxed));
println!("Hello World - Core 0! Counter is {}", count);
}
}
fn cpu1_start(timer: &mut Timer<TIMG1>, counter: &xtensa_lx::mutex::SpinLockMutex<AtomicI32>) -> ! {
println!("Hello World - Core 1!");
loop {
block!(timer.wait()).unwrap();
(&*counter).lock(|counter| {
counter.store(
counter.load(Ordering::Relaxed).wrapping_add(1),
Ordering::Relaxed,
);
});
}
} I like that there are no let mut cpu1_fnctn = || { cpu1_start(&mut timer1, &counter); };
let _guard = cpu_control.start_app_core(&mut cpu1_fnctn).unwrap(); Doesn't look too nice. The need to declare that But not so nice is that I can't move the It's probably not that bad but before going further into that direction I just wanted to hear your opinions on that - if you don't like that I can revert that. On the other hand we can also keep that and see if it works good enough and change back if not ... it's not that much work |
We should have ways to start and run code on the second core on dual-core chips
The text was updated successfully, but these errors were encountered: