我读到RP2040有两个核心。如何在Rust程序中使用第二个核心?
我不需要一直走到通用多线程,我只想有两个线程,每个线程都拥有一个核心,它们可以相互通信。
Rust书中关于无畏并发的部分(Jeremy建议(并没有多大帮助。
thread::spawn(|| {
let mut x = 0;
x = x + 1;
});
无法编译
error[E0433]: failed to resolve: use of undeclared crate or module `thread`
--> src/main.rs:108:5
|
108 | thread::spawn(|| {
| ^^^^^^ use of undeclared crate or module `thread`
考虑到CCD_ 1是CCD_ 2的一部分并且RP2040是#![no_std]
环境。
在C API中有一个函数multicore_launch_core1
。是否有同等的Rust API?
正如您已经发现的,Ruststd
库的多线程功能依赖于操作系统内核的功能,而这些功能在裸机嵌入式环境中工作时是不可用的。
让第二个核心执行代码的实际过程有点复杂和低级。在RP2040数据表中标题为";2.8.2.在处理器核心1上启动代码";。
总之,在第二个内核启动后,它进入睡眠状态,等待通过SIO FIFO向其发送指令,SIO FIFO是两个内核之间的通信通道。通过发送的指令为核心提供了一个中断向量表、一个堆栈指针和一个开始执行的入口点。
幸运的是,rp2040_hal机箱为此提供了更高级别的抽象。以下示例来自该机箱的multicore
模块:
use rp2040_hal::{pac, gpio::Pins, sio::Sio, multicore::{Multicore, Stack}};
static mut CORE1_STACK: Stack<4096> = Stack::new();
fn core1_task() -> ! {
loop {}
}
fn main() -> ! {
let mut pac = pac::Peripherals::take().unwrap();
let mut sio = Sio::new(pac.SIO);
// Other init code above this line
let mut mc = Multicore::new(&mut pac.PSM, &mut pac.PPB, &mut sio.fifo);
let cores = mc.cores();
let core1 = &mut cores[1];
let _test = core1.spawn(unsafe { &mut CORE1_STACK.mem }, core1_task);
// The rest of your application below this line
}
在上面的例子中,core1_task
函数内的代码将在第二个核心上执行,而第一个核心继续执行main
函数。机箱的examples目录中有更完整的示例。
免责声明:我自己没有使用过这个板条箱或微控制器-所有信息都来自在线文档。