我读到过RP2040有两个核。如何在Rust程序中使用第二个核心?
我不需要一直使用普通多线程,我只想有两个线程,每个线程都拥有一个内核,它们可以相互通信。
锈书中关于无恐惧并发的章节(由杰里米建议)没有多大帮助。
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`这并不奇怪,因为thread是std的一部分,RP2040是#![no_std]环境。
在C中有一个函数multicore_launch_core1。是否有等效的锈蚀API?
发布于 2022-07-21 23:32:26
正如您已经发现的,Rust std库的多线程工具依赖于操作系统内核的设施,而这些内核在裸金属嵌入式环境中是不可用的。
让第二个核心执行代码的实际过程有点复杂和低级别。RP2040数据表在题为"2.8.2.处理器核心1上的启动代码“一节中对此进行了描述。
总之,在第二个核心启动后,它进入休眠状态,等待指令通过SIO FIFO发送给它,这是两个核之间的通信通道。通过发送的指令提供了中断向量表、堆栈指针和核心开始执行的入口点。
幸运的是,哈尔机箱提供了更高级别的抽象。下面的示例来自这个机箱的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函数。在机箱的示例目录中有更完整示例。
免责声明:我本人没有使用这个板条箱或微控制器-所有信息都是从在线文档中找到的。
https://stackoverflow.com/questions/73052221
复制相似问题