首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在锈蚀中的RP2040上使用两个核心?

如何在锈蚀中的RP2040上使用两个核心?
EN

Stack Overflow用户
提问于 2022-07-20 13:07:17
回答 1查看 393关注 0票数 1

我读到过RP2040有两个核。如何在Rust程序中使用第二个核心?

我不需要一直使用普通多线程,我只想有两个线程,每个线程都拥有一个内核,它们可以相互通信。

锈书中关于无恐惧并发的章节(由杰里米建议)没有多大帮助。

代码语言:javascript
复制
thread::spawn(|| {
    let mut x = 0;
    x = x + 1;
});

编译失败

代码语言:javascript
复制
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`

这并不奇怪,因为threadstd的一部分,RP2040是#![no_std]环境。

在C中有一个函数multicore_launch_core1。是否有等效的锈蚀API?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-21 23:32:26

正如您已经发现的,Rust std库的多线程工具依赖于操作系统内核的设施,而这些内核在裸金属嵌入式环境中是不可用的。

让第二个核心执行代码的实际过程有点复杂和低级别。RP2040数据表在题为"2.8.2.处理器核心1上的启动代码“一节中对此进行了描述。

总之,在第二个核心启动后,它进入休眠状态,等待指令通过SIO FIFO发送给它,这是两个核之间的通信通道。通过发送的指令提供了中断向量表、堆栈指针和核心开始执行的入口点。

幸运的是,哈尔机箱提供了更高级别的抽象。下面的示例来自这个机箱的multicore模块:

代码语言:javascript
复制
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函数。在机箱的示例目录中有更完整示例。

免责声明:我本人没有使用这个板条箱或微控制器-所有信息都是从在线文档中找到的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73052221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档