pico-multicore
支持在第二个处理器核心(core 1)上运行代码并与其交互。
详细描述
示例
#include <stdio.h>
#include "pico/stdlib.h"
#include "pico/multicore.h"
#define FLAG_VALUE 123
void core1_entry() {
multicore_fifo_push_blocking(FLAG_VALUE);
uint32_t g = multicore_fifo_pop_blocking();
if (g != FLAG_VALUE)
printf("Hmm, that's not right on core 1!\n");
else
printf("Its all gone well on core 1!");
while (1)
tight_loop_contents();
}
int main() {
stdio_init_all();
printf("Hello, multicore!\n");
multicore_launch_core1(core1_entry);
// Wait for it to start up
uint32_t g = multicore_fifo_pop_blocking();
if (g != FLAG_VALUE)
printf("Hmm, that's not right on core 0!\n");
else {
multicore_fifo_push_blocking(FLAG_VALUE);
printf("It's all gone well on core 0!");
}
}
模块
fifo
核间 FIFO 相关函数。
doorbell
与门铃相关的函数,核心可使用它向自身或另一个核心触发 IRQ。
lockout
使一个核心强制另一个核心在已知状态下暂停执行的函数。
宏
#define SIO_FIFO_IRQ_NUM(core)
函数
void multicore_reset_core1 (void): 重置 core 1。void multicore_launch_core1 (void(*entry)(void))
在 core 1 上运行代码。
void multicore_launch_core1_with_stack (void(**entry)(void), uint32_t **stack_bottom, size_t stack_size_bytes)
在 core 1 上使用指定栈启动代码。
void multicore_launch_core1_raw (void(**entry)(void), uint32_t **sp, uint32_t vector_table)
在 core 1 上不带栈保护地启动代 码。
宏定义文档
SIO_FIFO_IRQ_NUM
#define SIO_FIFO_IRQ_NUM(core)
返回给定核心上 FIFO IRQ 的 irq_num_t。
在 RP2040 上,每个核心有不同的 IRQ 编号:SIO_IRQ_PROC0 和 SIO_IRQ_PROC1。在 RP2350 上,两个核心共享相同的 IRQ 编号(SIO_IRQ_PROC),只是每个核心有不同的 SIO 中断输出路由到该 IRQ 输入。
注意,此宏旨在编译时解析,不进行参数检查。
函数文档
multicore_launch_core1
void multicore_launch_core1 (void(*)(void) entry)
在 core 1 上运行代码。
唤醒(之前已重置的)core 1,并使用默认的 core 1 栈(位于 core 0 栈下方)在 core 1 上进入给定函数。
core 1 必须之前已被重置,可以是系统重置的结果,也可以是调用 multicore_reset_core1 的结果。
core 1 将使用与 core 0 相同的向量表。
参数
- entry: 函数入口点
另请参阅
multicore_reset_core1
multicore_launch_core1_raw
void multicore_launch_core1_raw (void(**)(void) entry, uint32_t ** sp, uint32_t vector_table)
在 core 1 上不带栈保护地启动代码。
唤醒(之前已重置的)core 1,并以指定的入口点、栈指针和向量表启动执行。
这是一个低级函数,即使定义了 USE_STACK_GUARDS 也不提供栈保护。
core 1 必须之前已被重置,可以是系统重置的结果,也可以是调用 multicore_reset_core1 的结果。
参数
- entry: 函数入口点
- sp: 指向 core 1 栈顶的指针
- vector_table: core 1 使用的向量表地址
另请参阅
multicore_reset_core1
multicore_launch_core1_with_stack
void multicore_launch_core1_with_stack (void(**)(void) entry, uint32_t ** stack_bottom, size_t stack_size_bytes)
在 core 1 上使用指定栈启动代码。
唤醒(之前已重置的)core 1,并使用传入的栈在 core 1 上进入给定函数。
core 1 必须之前已被重置,可以是系统重置的结果,也可以是调用 multicore_reset_core1 的结果。
core 1 将使用与 core 0 相同的向量表。
参数
- entry: 函数入口点
- stack_bottom: 栈的底部(最低地址)
- stack_size_bytes: 栈的大小(字 节,必须是 4 的倍数)
另请参阅
multicore_reset_core1
multicore_reset_core1
void multicore_reset_core1 (void)
重置 core 1。
此函数可用于将 core 1 重置到初始状态(准备好通过 multicore_launch_core1 及类似方法启动代码)。
此函数只应从 core 0 调用。
fifo
核间 FIFO 相关函数。
详细描述
RP 系列微控制器包含两个 FIFO,用于在两个核心之间传递数据、消息或有序事件。每个 FIFO 宽 32 位,在 RP2040 上深度为 8 项,在 RP2350 上深度为 4 项。其中一个 FIFO 只能由 core 0 写入、core 1 读取;另一个只能由 core 1 写入、core 0 读取。
核间 FIFO 是非常宝贵的资源,SDK 功能(例如 core 1 启动或 [lockout] 函数)会频繁使用它们。此外,它们通常需要供 RTOS(如 FreeRTOS SMP)独占使用。因此,建议不要将 FIFO 用于自定义目的,除非上述顾虑均不适用;大多数核间数据传输场景可以同样很好地通过使用 queue 来处理。
函数
static bool multicore_fifo_rvalid (void): 检 查读取 FIFO 中是否有可用数据(由另一个核心发送)。static bool multicore_fifo_wready (void): 检查写入 FIFO 是否有空间容纳更多数据。void multicore_fifo_push_blocking (uint32_t data): 将数据推送到写入 FIFO(发送给另一个核心)。static void multicore_fifo_push_blocking_inline (uint32_t data): 将数据推送到写入 FIFO(发送给另一个核心)。bool multicore_fifo_push_timeout_us (uint32_t data, uint64_t timeout_us): 带超时地将数据推送到写入 FIFO(发送给另一个核心)。uint32_t multicore_fifo_pop_blocking (void): 从读取 FIFO 中弹出数据(来自另一个核心的数据)。static uint32_t multicore_fifo_pop_blocking_inline (void): 从读取 FIFO 中弹出数据(来自另一个核心的数据)。bool multicore_fifo_pop_timeout_us (uint64_t timeout_us, uint32_t *out)
带超时地从读取 FIFO 中弹出数据(来自另一个核心的数据)。static void multicore_fifo_drain (void): 丢弃读取 FIFO 中的所有数据。static void multicore_fifo_clear_irq (void): 清除 FIFO 中断。static uint32_t multicore_fifo_get_status (void): 获取 FIFO 状态。
函数文档
multicore_fifo_clear_irq
static void multicore_fifo_clear_irq (void) [inline], [static]
清除 FIFO 中断。
注意,此操作只清除由 ROE 或 WOF 标志引起的中断。要清除 VLD 标志,需要使用 'pop' 或 'drain' 函数之一。